測試即文檔:自動化測試框架Concordion
(一)Concordion的工作原理
簡單的說,Concordion測試只是對JUnit的擴展,但是它可以從你寫好的測試文檔(html)中讀取測試數據,通過傳統的JUnit來跑測試,并將測試結果輸出為具有紅綠標記(表示失敗或成功)的html文檔(基于原測試文檔)。
在上圖中,Specification即為我們寫的html測試文檔,與普通的html文檔不同的是,我們需要在其中加入一些名為concordion 的標簽,瀏覽器將忽略這些標簽,但Concordion用這些標簽來執行測試指令,比如調用Fixture中的測試函數等。Fixture為繼承自 ConcordionTestCase(最終繼承自JUnit測試類)的測試用例,這些測試用例將調用我們自己所開發的功能代碼。
(二)Concordion的Hello World
下面就通過一個簡單的Hello World例子來演示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 |
最終生成的工程目錄結構如下:
(三)編譯并運行測試
打開終端,將目錄切換到 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 Time: 0.307 OK (1 test) |
運行成功,并且顯示測試輸出的html文件的全路徑名稱(此時應該去掉最前面的那個點"."):
/var/folders/wM/wMUC8-0FEsq-MMkTzdzYA++++TI/-Tmp-/concordion/com/thoughtworks/davenkin/concordion/HelloWorld.html |
打開該文件:
測試運行成功。