posts - 35, comments - 0, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          1. 引言
          JUnit4提供的新斷言語法具有很多優點且使用簡單,這已經不再是新鮮事了,可發現在實際測試代碼中仍未被普及應用,特發此文,以期更多的人能掌握運用。
          2. assertThat基本語法
          Hamcrest 是一個測試輔助工具,提供了一套通用的匹配符 Matcher,靈活使用這些匹配符定義的規則,程序員可以更加精確的表達自己的測試思想,指定所想設定的測試條件。
          Junit4結合Hamcrest提供了新的斷言語句-assertThat,只需一個assertThat語句,結合Hamcrest提供的匹配符,就可以表達全部的測試思想。
          assertThat的基本語法如下:

          assertThat(T actual, Matcher matcher)
          assertThat(String reason, T actual, Matcher matcher)

          actual 是接下來想要驗證的值;
          matcher是使用 Hamcrest 匹配符來表達的對前面變量所期望的值的聲明,如果 actual值與 matcher 所表達的期望值相符,則斷言成功,否則斷言失敗。
          reason是自定義的斷言失敗時顯示的信息。
          一個簡單的例子:
          // 如果測試的字符串testedString包含子字符串"taobao"則斷言成功
          assertThat( testedString, containsString( "taobao" ) );

          3. assertThat優點

          • 統一

          只需一條assertThat語句即可替代舊有的其他語句(如 assertEquals,assertNotSame,assertFalse,assertTrue,assertNotNull,assertNull 等),使斷言變得簡單、代碼風格統一,增強測試代碼的可讀性和可維護性。
          ?

          • 語法直觀易懂

          assertThat 不再像 assertEquals 那樣,使用比較難懂的“謂賓主”語法模式(如:assertEquals(3, x);)。相反,assertThat 使用了類似于“主謂賓”的易讀語法模式(如:assertThat(x,is(3));),使得代碼更加直觀、易讀,符合人類思維習慣。
          ?

          • 錯誤信息更具描述性

          舊的斷言語法如果斷言失敗,默認不會有額外的提示信息,如
          assertTrue(testedString.indexOf(“taobao”) > -1);
          如果該斷言失敗,只會拋出無用的錯誤信息,如java.lang.AssertionError: ,除此之外不會有更多的提示信息。
          新的斷言語法會默認自動提供一些可讀的描述信息,如
          assertThat(testedString, containsString(“taobao”));
          如果該斷言失敗,拋出的錯誤提示信息如下:
          java.lang.AssertionError:
          Expected: a string containing “taobao”
          got: “taoba”

          ?

          • 跟Matcher匹配符聯合使用更靈活強大

          Matcher提供了功能豐富的匹配符,assertThat結合這些匹配符使用可更靈活更準確的表達測試思想。
          // 驗證字符串 s是否含有子字符串 "taobao" 或 "qa" 中間的一個
          // 舊的斷言,不直觀,需要分析代碼邏輯明白驗證意圖
          assertTrue(s.indexOf("taobao")>-1||s.indexOf("qa")>-1);
          // 新的斷言,直觀易懂,準確表達測試思想
          assertThat(s,anyOf(containsString("taobao"),containsString("qa")));
          // anyOf滿足條件之一即成立,containsString包含字符串則成立

          4. assertThat使用
          要想發揮assetThat的威力,必須跟Hamcrest聯合使用,JUnit4本身包含了一些自帶了一些 Hamcrest 的匹配符 Matcher,但是只有有限的幾個。因此建議你將Hamcrest包加入項目。
          在pom里加入Hamcrest依賴。
          <dependency>
          <groupId>org.hamcrest</groupId>
          <artifactId>hamcrest-all</artifactId>
          <version>1.1</version>
          </dependency>

          在測試類里導入包
          import static org.junit.Assert.*;
          import static org.hamcrest.Matchers.*;

          通過例子學習是有效的學習方式之一,下面通過常用的示例演示如何使用assertThat,更詳細的用法請參考Hamcrest相關文檔。

          • 字符相關匹配符

          /**equalTo匹配符斷言被測的testedValue等于expectedValue,
          * equalTo可以斷言數值之間,字符串之間和對象之間是否相等,相當于Object的equals方法
          */
          assertThat(testedValue, equalTo(expectedValue));

          /**equalToIgnoringCase匹配符斷言被測的字符串testedString
          *在忽略大小寫的情況下等于expectedString
          */
          assertThat(testedString, equalToIgnoringCase(expectedString));

          /**equalToIgnoringWhiteSpace匹配符斷言被測的字符串testedString
          *在忽略頭尾的任意個空格的情況下等于expectedString,
          *注意:字符串中的空格不能被忽略
          */
          assertThat(testedString, equalToIgnoringWhiteSpace(expectedString);

          /**containsString匹配符斷言被測的字符串testedString包含子字符串subString**/
          assertThat(testedString, containsString(subString) );

          /**endsWith匹配符斷言被測的字符串testedString以子字符串suffix結尾*/
          assertThat(testedString, endsWith(suffix));

          /**startsWith匹配符斷言被測的字符串testedString以子字符串prefix開始*/
          assertThat(testedString, startsWith(prefix));

          • 一般匹配符

          /**nullValue()匹配符斷言被測object的值為null*/
          assertThat(object,nullValue());

          /**notNullValue()匹配符斷言被測object的值不為null*/
          assertThat(object,notNullValue());

          /**is匹配符斷言被測的object等于后面給出匹配表達式*/
          assertThat(testedString, is(equalTo(expectedValue)));

          /**is匹配符簡寫應用之一,is(equalTo(x))的簡寫,斷言testedValue等于expectedValue*/
          assertThat(testedValue, is(expectedValue));

          /**is匹配符簡寫應用之二,is(instanceOf(SomeClass.class))的簡寫,
          *斷言testedObject為Cheddar的實例
          */
          assertThat(testedObject, is(Cheddar.class));

          /**not匹配符和is匹配符正好相反,斷言被測的object不等于后面給出的object*/
          assertThat(testedString, not(expectedString));

          /**allOf匹配符斷言符合所有條件,相當于“與”(&&)*/
          assertThat(testedNumber, allOf( greaterThan(8), lessThan(16) ) );

          /**anyOf匹配符斷言符合條件之一,相當于“或”(||)*/
          assertThat(testedNumber, anyOf( greaterThan(16), lessThan(8) ) );

          • 數值相關匹配符

          /**closeTo匹配符斷言被測的浮點型數testedDouble在20.0¡À0.5范圍之內*/
          assertThat(testedDouble, closeTo( 20.0, 0.5 ));

          /**greaterThan匹配符斷言被測的數值testedNumber大于16.0*/
          assertThat(testedNumber, greaterThan(16.0));

          /** lessThan匹配符斷言被測的數值testedNumber小于16.0*/
          assertThat(testedNumber, lessThan (16.0));

          /** greaterThanOrEqualTo匹配符斷言被測的數值testedNumber大于等于16.0*/
          assertThat(testedNumber, greaterThanOrEqualTo (16.0));

          /** lessThanOrEqualTo匹配符斷言被測的testedNumber小于等于16.0*/
          assertThat(testedNumber, lessThanOrEqualTo (16.0));

          • 集合相關匹配符

          /**hasEntry匹配符斷言被測的Map對象mapObject含有一個鍵值為"key"對應元素值為"value"的Entry項*/
          assertThat(mapObject, hasEntry("key", "value" ) );

          /**hasItem匹配符表明被測的迭代對象iterableObject含有元素element項則測試通過*/
          assertThat(iterableObject, hasItem (element));

          /** hasKey匹配符斷言被測的Map對象mapObject含有鍵值“key”*/
          assertThat(mapObject, hasKey ("key"));

          /** hasValue匹配符斷言被測的Map對象mapObject含有元素值value*/
          assertThat(mapObject, hasValue(value));

          轉載務必注明出處Taobao QA Team,原文地址:http://qa.taobao.com/?p=3541

          posted @ 2012-01-17 17:09 timelyxyz 閱讀(109) | 評論 (0)編輯 收藏

            conf目錄包含了各種應用配置文件,有必須的文件:application.conf和routes。

          • application.conf:應用的主配置文件,包含了
          • routes:路由定義文件

            你也可以在application.conf中添加一些自己的應用中的特殊的配置選項,配置可以在程序中通過Play.configuration.get("propertyName")來讀取。當你需要新建一個新的應用程序,可以使用play new命令來講一些默認配置從$PLAY_HOME/resources/application-skel/conf這個目錄中復制一些相關的程序啟動的默認配置,還有一些配置選項是被注釋的,皆是可以選擇相關的項目來用。

            任何一個類庫需要的配置文件,盡量將其放置到conf這個目錄中:這個目錄被配置在了Java的環境變量里了。

            當然,你也可以在application.conf這個文件中引用其他的一些play配置,只要用@include.作為開頭即可。例如,你定義了一個附加的MIME類型在conf/mime-types.conf里:

          # Web fonts
          mimetype.eot = application/vnd.ms-fontobject
          mimetype.otf = application/octet-stream
          mimetype.ttf = application/octet-stream
          mimetype.woff = application/x-font-woff

            你可以通過如下命令講文件導入到application.conf中:

          @include.mime = mime-types.conf

           

          文獻參考:http://www.playframework.org/documentation/1.2.3/main

          posted @ 2012-01-16 15:43 timelyxyz 閱讀(111) | 評論 (0)編輯 收藏

          • 數據源概念
          • 數據庫連接池 
          • jndi概念
          • 數據源與連接池關系
          • 數據源與jndi關系
          • jdbc基礎

          1.什么是數據源?

          答: 數據源定義的是連接到實際數據庫的一條路徑而已,數據源中并無真正的數據,它僅僅記錄的是你連接到哪個數據庫,以及如何連接的,如odbc數據源。也就是 說數據源僅僅是數據庫的連接名稱,一個數據庫可以有多個數據源連 接。                                                                                                                              

                 在Java語言中,DataSource對象就是一個代表數據源實體的對象。一個數據源就是一個用來存儲數據的工具,它可以是復雜的大型企業級數據庫,也可以是簡單得只有行和列的文件。數據源可以位于在服務器端,也可以位于客服端。

          2.什么是數據庫連接池?

          答: 數據庫連接是負責分配、管理和釋放數據庫連接。使用數據庫連接池是因為數據庫連接是一種關鍵的有限的昂貴的資源,這一點在多用戶的網頁應用程序中體現得尤 為突出。如weblogic、tomcat、WebSphere容器都實現了數據庫連接池,但是數據庫連接池是可以獨立出來自己編碼實現的。

                  數據庫連接池在系統啟動時初始化了一定量maxIdle=idlenum的數據庫連接,即沒有他的使用中的鏈接被釋放的情況下,連接池中保存的最大空閑鏈 接數。數據庫連接請求如果沒有超過idle的值則直接去連接池中獲取;如果超過了maxIdle的值則新建一個數據庫連接;但如果數據庫連接池中的連接總 數超過了maxActive=activenum則 (如下處理);

              
            1   直接拋錯  
            2   讓想要借出連接的線程等待一段時間,如果等不到,再拋錯  
            3   每隔一段檢查一次pool,直到有可用連接,否則一直等下去  
            4   永遠可以拿到(視情況需要maxActive不設置或0或負)  

          但當沒有可以使用的數據庫鏈接的時候,連接池將要等待一個鏈接被返回的最長時間(毫秒)maxWait=waitnum,超過這個時間就要拋出異常。

          3.什么是jndi?

          答:jndi全稱是java naming and directory interface。簡單點就是你按命名規則給一個東西命名然后你就可以通過該名字在特定環境下直接查找到該東西了。

          JNDI 是用于向Java程序提供目錄和命名功能的API。可以簡單地把JNDI理解為一種將對象和名字綁定的技術,對象工廠負責生產出對象,這些對象都和惟一的 名字綁定。外部程序可以通過名字來獲取對某個對象的引用。在一個文件系統中,文件名被綁定給文件。在DNS中,一個IP地址綁定一個URL。在目錄服務 中,一個對象名被綁定給一個對象實體。

          在Intranets(企業內部網)和Internates(互聯網)中 目錄服務(Directory service)都非常重要,它規范了命名規則,讓人們容易理解實體及之間的關系。JNDI是Java平臺的一個標準擴展,提供了一組接口、類和關于命名 空間的概念。JNDI目前所支持的技術包括LDAP、CORBA Common Object Service(COS)名字服務、RMI、NDS、DNS、Windows注冊表等等。

          jndi被設計成獨立于特定的目錄服務,所以各種各樣的目錄都可以通過相同的方式進行訪問。這樣使用jndi的java程序員不僅可以獲得統一規整的命名和目錄,而且可以通過多層的命名方案無縫訪問(seamless acess)目錄對象。

          4.數據源與數據庫連接池關系?

          答: 我們通過第三方工具來使用數據源來實現對數據庫數據操作。一個數據庫連接池可以給它創建多個數據源,如一個人有別名;如果單純使用jdbc連接數據庫是 web容器你要什么就去連什么。這樣做沒人看不耗內存,量大了你就死機。可以這樣理解,數據源表示一個與數據庫的連接(傳統)或者表示很多與數據庫的連接 (使用數據庫連接池)。數據源是用于訪問連接池或多池的JNDI對象,多池的主要目的是提高可用性和在一組連接池間實現負載均衡。

          5.數據源與jndi關系?

          答:數據源是在JDBC 2.0中引入的一個概念。 在JDBC 2.0擴展包中定義了javax.sql.DataSource接口來描述這個概念。如果用戶希望建立一個數據庫連接,通過查詢在JNDI服務中的數據 源,可以從數據源中獲取相應的數據庫連接。這樣用戶就只需要提供一個邏輯名稱(Logic Name),而不是數據庫登錄的具體細節。即DataSource采用Java的JNDI技術,來獲得DataSource對象的引用。當然各種web容 器把DataSource作為一種可以配置的JNDI資源來處理如tomcat。生成DataSource對象的工廠為 org.apache.commons.dbcp.BasicDataSourceFactory。

          6.jdbc基礎

          答:java database connectivity standard 是一套規范的面向應用程序的接口,通過它可以訪問各類關系數據庫。各個數據庫會實現該接口作為驅動如jtds.jar,當然可以自己寫實現。

          jdbc 是低級api,提供訪問數據庫的接口,是構建高級api的基礎,利用純java編寫可以在任何操作系統任何java環境下工作。JDBC API 中定義了一些Java類分別用來表示與數據庫的連接(connections), SQL語句(SQL statements), 結果集(result sets)以及其它的數據庫對象, 使得Java程序能方便地與數據庫交互并處理所得的結果。

          使用JDBC, 所有Java程序(包括Java applications , applets和servlet)都能通過SQL語句或存儲在數據庫中的過程(stored procedures)來存取數據庫。要通過JDBC來存取某一特定的數據庫,必須有相應的JDBC driver,它往往是由生產數據庫的廠家提供,是連接JDBC API與具體數據庫之間的橋梁。JDBC driver 是用于特定數據庫的一套實施了JDBC接口的類集。

          簡單的說,jdbc可以做三件事:與數據庫建立連接,發送sql語句,處理結果。jdbc可以理解為odbc的純java語言和面向對象的實現。

          7.數據庫訪問方法?

          答:在ASP中可以通過三種方式訪問數據庫:
          1、IDC(Internet Database Connector)方式;
          2、ADO(ActiveX Data Objects)方式;
          3、RDS(Remote Data Service)方式。
                  在jsp中訪問數據庫常用:
          1、JDBC-ODBC橋接器;
          2、特定數據庫的jdbc驅動直接連接數據庫;
          3、經過池化維護一定量的連接數目,用jndi去訪問數據源對應池獲取連接;

           

          參考:http://www.diybl.com/course/7_databases/database_other/2008126/97740.html

          posted @ 2012-01-16 09:19 timelyxyz 閱讀(138) | 評論 (0)編輯 收藏

          1. 控制輸出時間
          <div>
              <p>this part is cached for 10 seconds. Note the timeout spec with invoke overrides CacheFor annotation. </p>
              `a controllers.more.Portlets.panel2(b), "10s"
          </div>
          <p>內文字顯示十秒鐘然后進入panel2action

          2.log:log directives are used to print a line of information to the console. It can take an argument of String
          `log
          `log a + i
          `log "a message "
          log命令用來在控制臺輸出一行信息,后面可以添加參數,輸出結果如下:
          japidviews/templates/log.html(line 5):
          japidviews/templates/log.html(line 14): a10
          japidviews/templates/log.html(line 18): a message

          3.stopwatch m 輸出render到模板所需的時間

          4.~i  直接輸出i的值

          5.`each posts | String p 與`for String p : posts等價,
          `for String p : posts
              <p>index: $_index, parity: $_parity, is odd? $_isOdd, is first? $_isFirst, is last? $_isLast, total size: $_size </p>
              call a tag:  `tag SampleTag p
          `
          輸出index: 6, parity: even, is odd? false, is first? false, is last? true, total size: 6
          另一種格式
          `for (final Post p : posts) {
              another notation for invoking actions:  
              `invoke Application.echoPost(p)
          `}

          6.if-else循環語法:
              `if expr            `if(asBoolean(expr)){
                  xxx                xxx    
              `else if expr        `} else if(asBoolean(expr)){
                  yyy                yyy
              `else            `} else {
                  zzz                zzz
              `            `

          7.` suppressNull on如果下面出現了null的意外,如
          ` a = null;
          safe to do a.something too: $a.length()
          輸出safe to do a.something too:

          8.dontRedirect();控制不跳轉頁面,即停留在原頁面。

          說明:

          ∵在play運行時,調用一個action必須出發一個Http重定向

          ∴如果不想重定向,必須調用JapidController.dontRedirect()來避免

          9.${a}, ~a, $a and ${escape(a)} and ~{a}這幾種表達式的值相等

          10.頁面讀取異常
              `for (Error e: errors()){
                  <p>$e.getKey() : $e</p>
              `}

          11.“Elvis操作符”是Java三目運算符的簡寫。一個便捷的用法是,如果表達式的值為false或者null,則返回一個合乎情理的默認值。好吧,我所實現的Elvis操作符確實不像Java中的一樣:)我所添加的?:組合符號只在${}標簽內起作用。
          name ?: “empty”

          12.`doBody m:帶著參數回到原先界面。該命令中的參數列表必須與調用處的“|”之后的參數聲明匹配,doBody通過匹配的參數傳遞到模板。

          13.join(Strings, "|"):Strings是list,該方法為list中的每個元素見添加一個“|”,形成一個字符串。

          14.`invoke與`a觸發的action返回的結果直接插入到原先界面中,作為界面參數的一部分。注意:invoke出發的action不跳轉頁面。

          15.renderJapid(Object... Objects):帶著參數跳轉到原先界面

          16.renderJapidWith(String template, Object... args):帶著參數跳轉到指定模板,可以實現在一個action中渲染多種模板。

          posted @ 2012-01-14 15:40 timelyxyz 閱讀(298) | 評論 (0)編輯 收藏

          junit4使用時導入的主要包org.junit.Assert.*;

          1. setUp與tearDown:這兩個方法是junit framework中提供初始化和反初始化每個測試方法的。
          setUp是在每個測試方法調用前被調用,負責初始化測試方法所需要的測試環境;
          tearDown是在每個測試方法被調用后被調用,負責撤銷測試環境。
          基本測試步驟如下:
          測試開始 -> setUp -> testXXX -> tearDown -> 測試結束

          2. public static void fail(java.lang.String message)輸出錯誤信息

          3.TestSuite 組裝測試。可以講所有的TestCase的調用添加到TestSuite中,同樣,也可以添加另外的TestSuite到TestSuite中。

          4.靜態導入:就是在import關鍵字后面加上static,然后可以調用這個類中的方法就和調用自己的方法沒有什么區別,例如assertEqual(excepted, actual),這個函數可以直接調
          用,不需要加上類名或者實例對象等。

          5.@Test(arg ...)被該annotation修士的方法,在JUint終將會被自動執行,該annotation只能修飾public void 方法。

          6.@Test參數timeout:規定該方法執行的時間,如果設置參數,則被修飾方法必須在該事件被執行結束,否則會拋出異常。語法:@Test(timeout=1)// 時間的單位為毫秒

          7.@Test參數expected:規定該方法排除異常,如果設置該參數,責備修飾方法在排除該參數規定的異常的情況下才可能通過測試,否則測試失敗。for example
          @Test(expected=ArithmeticException.class)
          public void testExceptedF(){
              int i = 1/0;
          }
          此時,testExceptionF拋出了ArithmeticException異常,所以測試通過;如果測試失敗,Failure Trace面板中會列出錯誤軌跡。

          8.@After:被該annotation修飾的方法,將會在每個測試方法執行之后執行一次。該annotation只能修飾public void 方法。

          9.@Before:被該annotation修飾的方法,將會在每個測試方法執行之前執行一次。該annotation只能修飾public void 方法。

          10.@AfterClass:被該annotation修飾的方法,將會在所有測試方法執行結束后執行一次。該annotation只能修飾public static void 方法。

          11.@BeforeClass:被該annotation修飾的方法,將會在所有測試方法執行前執行一次。該annotation只能修飾public static void 方法。

          posted @ 2012-01-14 14:53 timelyxyz 閱讀(102) | 評論 (0)編輯 收藏

          僅列出標題
          共4頁: 上一頁 1 2 3 4 
          主站蜘蛛池模板: 霍邱县| 德格县| 武宣县| 合山市| 遂川县| 北安市| 崇信县| 东乌珠穆沁旗| 德安县| 衡水市| 安庆市| 平塘县| 安龙县| 建阳市| 德安县| 台州市| 祁门县| 新绛县| 石狮市| 炎陵县| 揭东县| 津市市| 桐柏县| 汤阴县| 科技| 花莲市| 西贡区| 雅江县| 嵊泗县| 康乐县| 仲巴县| 绥棱县| 梅州市| 张家川| 饶平县| 嘉峪关市| 龙泉市| 南城县| 贵德县| 乌鲁木齐市| 石城县|