qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請訪問 http://qaseven.github.io/

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

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

            (一)Concordion的工作原理

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

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

            (二)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標(biāo)簽,故將其忽略:

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

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

            接下來實(shí)現(xiàn)HelloWorldTest類,在HelloWorld.html同目下創(chuàng)建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文件中實(shí)例化了一個HelloWorld對象,并調(diào)用其sayHelloWorld()方法,于是寫一個需要測試的HelloWorld類如下:

          package com.thoughtworks.davenkin.concordion;

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

            最終生成的工程目錄結(jié)構(gòu)如下:

            (三)編譯并運(yùn)行測試

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

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

            用JUnit運(yùn)行測試:

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

            運(yùn)行結(jié)果如下:

          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)

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

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

            打開該文件:

            測試運(yùn)行成功。

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


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


          網(wǎng)站導(dǎo)航:
           
          <2012年3月>
          26272829123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          導(dǎo)航

          統(tǒng)計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 锡林郭勒盟| 金川县| 巨鹿县| 从江县| 玛曲县| 巴青县| 富裕县| 镇坪县| 富川| 丰县| 砚山县| 龙海市| 张家川| 阳西县| 东光县| 漳浦县| 临清市| 桐梓县| 诸城市| 邯郸县| 五大连池市| 华亭县| 密云县| 怀安县| 东海县| 田阳县| 德保县| 涟水县| 龙海市| 保德县| 临沧市| 五大连池市| 额尔古纳市| 通江县| 连城县| 开鲁县| 垫江县| 嫩江县| 永仁县| 凯里市| 延长县|