qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          測試即文檔:自動化測試框架Concordion

          如果你是那種極不情愿寫文檔的程序員,那么,你并不孤單。然而當你的上司在檢查你的工作時,他才不想看你那一堆一堆的代碼,他需要看文檔,這時的你需要的是Concordion——一個符合Specification By Example的自動化測試框架,通過自然語言來描述軟件功能,即項目中所有成員都能看懂的而又具備測試功能的html文檔。

            (一)Concordion的工作原理

            簡單的說,Concordion測試只是對JUnit的擴展,但是它可以從你寫好的測試文檔(html)中讀取測試數據,通過傳統的JUnit來跑測試,并將測試結果輸出為具有紅綠標記(表示失敗或成功)的html文檔(基于原測試文檔)。

             在上圖中,Specification即為我們寫的html測試文檔,與普通的html文檔不同的是,我們需要在其中加入一些名為concordion 的標簽,瀏覽器將忽略這些標簽,但Concordion用這些標簽來執行測試指令,比如調用Fixture中的測試函數等。Fixture為繼承自 ConcordionTestCase(最終繼承自JUnit測試類)的測試用例,這些測試用例將調用我們自己所開發的功能代碼。

            (二)Concordion的Hello World

            下面就通過一個簡單的Hello World例子來演示Concordion。

            下載Concordion和其所依賴的包

            首先寫一個html測試用例HelloWorld.html:

          <html xmlns:concordion=http://www.concordion.org/2007/concordion>
              <body>
                  <p>Should print:</p>
                  <p concordion:assertEquals="sayHello()">HelloWorld</p>
              </body>
          </html>

            此html文檔可以通過瀏覽器正常打開,由于瀏覽器并不知道concordion標簽,故將其忽略:

             可以看到,以上加入的concordion標簽的html測試文檔和普通的html文檔并無區別,同時我們也看到在concordion標簽后有一個 sayHello()函數調用,此函數從什么地方來呢——這就是Concordion的約定,要求在該html文檔的同目錄下有一個名為 HelloWorldTest.java的測試用例類存在,并且該類有一個測試函數名為sayHello()。約定規則為:如果html文檔名為 Foo.html,那么測試用例類應該為FooTest.java。此時Concordion便通過名字匹配去找名為HelloWorldTest類的 sayHello()函數并調用之。

            我們還注意到,在concordion標簽后有assertEquals,此時Concordion將把helloWorld()函數的輸出與之后的“HelloWorld”字符串相比,如果相等,測試成功,否則失敗。

            接下來實現HelloWorldTest類,在HelloWorld.html同目下創建HelloWorldTest.java文件:

          package com.thoughtworks.davenkin.concordion;

          import org.concordion.integration.junit3.ConcordionTestCase;

          public class HelloWorldTest extends ConcordionTestCase {

              public String sayHello()
                {
                     return new HelloWorld().sayHelloWorld();
                }
          }

            在HelloWorldTest.java文件中實例化了一個HelloWorld對象,并調用其sayHelloWorld()方法,于是寫一個需要測試的HelloWorld類如下:

          package com.thoughtworks.davenkin.concordion;

          public class HelloWorld
          {
               public String sayHelloWorld()
                 {
                      return "HelloWorld";
                 }
          }

            最終生成的工程目錄結構如下:

            (三)編譯并運行測試

            打開終端,將目錄切換到 concordion(這是筆者為此helloworld創建的工程根目錄,請不要與上文提到的concordion混淆)下,編譯:

          javac -cp lib/*:src:test test/com/thoughtworks/davenkin/concordion/HelloWorldTest.java

            用JUnit運行測試:

          java -cp lib/*:src:test org.junit.runner.JUnitCore com.thoughtworks.davenkin.concordion.HelloWorldTest

            運行結果如下:

          JUnit version 4.8.2
          ./var/folders/wM/wMUC8-0FEsq-MMkTzdzYA++++TI/-Tmp-/concordion/com/thoughtworks/davenkin/concordion/HelloWorld.html
          Successes: 1, Failures: 0

          Time: 0.307

          OK (1 test)

            運行成功,并且顯示測試輸出的html文件的全路徑名稱(此時應該去掉最前面的那個點"."):

          /var/folders/wM/wMUC8-0FEsq-MMkTzdzYA++++TI/-Tmp-/concordion/com/thoughtworks/davenkin/concordion/HelloWorld.html

            打開該文件:

            測試運行成功。

          posted on 2012-03-13 09:57 順其自然EVO 閱讀(2282) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          <2012年3月>
          26272829123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 赤城县| 长兴县| 贵溪市| 舟曲县| 会泽县| 连南| 宣恩县| 布尔津县| 东莞市| 乐山市| 嘉黎县| 定日县| 陆川县| 华蓥市| 许昌市| 高安市| 绥中县| 冀州市| 玛多县| 阳春市| 哈尔滨市| 松原市| 长宁县| 喀喇沁旗| 镇坪县| 闵行区| 云安县| 门头沟区| 谷城县| 洱源县| 延边| 巴彦淖尔市| 山阳县| 壶关县| 海城市| 榆社县| 阿拉善盟| 丰镇市| 淳安县| 抚顺县| 轮台县|