一、成功、失敗和斷言
如果一個測試沒有拋出任何異常就完成運行或者說拋出了期望的異常(參見@Test註解的expectedExceptions屬性文檔),就說,這個測試時成功的。
測試方法的組成常常包括拋出多個異常,或者包含各種各樣的斷言(使用Java "assert" 關鍵字)。一個"assert"失敗會觸發一個AssertionErrorException,結果就是測試方法被標記爲失敗(記住,如果你看不到斷言錯誤,要在加上 -ea 這個JVM參數)。
下面是個例子:
@Test
public void verifyLastName() {
assert "Beust".equals(m_lastName) : "Expected name Beust, for" + m_lastName;
}
TestNG 也包括 JUnit 的 Assert 類,允許你對複雜的對象執行斷言:
import static org.testng.AssertJUnit.*;
//...
@Test
public void verify() {
assertEquals("Beust", m_lastName);
}
注意,上述代碼使用了靜態導入,以便能夠使用 assertEquals 方法,而無需加上它的類前綴。
二、日誌與結果
當運行SuiteRunner的時候會指定一個目錄,之後測試的結果都會保存在一個在那個目錄中叫做index.html 的文件中。這個index文件指向其他多個HTML和文本文件,被指向的文件包含了整個測試的結果。你可以再這裏看到一個例子。
通過使用監聽器和報表器,可以很輕鬆的生成自己的TestNG報表:
(1)監聽器---實現接口 org.testng.ITestListener ,並且會在測試開始、通過、失敗等時刻實時通知
(2)報告器---實現接口org.testng.IReporter ,並且當整個測試運行完畢之後纔會通知。IReporter 接受一個對象列表,這些對象描述整個測試運行的情況
例如,如果你想要生成一個PDF報告,那麼就不需要實時通知,所以用IReporter。如果需要寫一個實時報告,例如用在GUI上,還要在每次測試時(下面會有例子和解釋)有進度條或者文本報告顯示點 ("."),那麼 ITestListener 是你最好的選擇。
例如,如果你想要生成一個PDF報告,那麼就不需要實時通知,所以用IReporter。如果需要寫一個實時報告,例如用在GUI上,還要在每次測試時(下面會有例子和解釋)有進度條或者文本報告顯示點 ("."),那麼ITestListener 是你最好的選擇。
1.日誌監聽器
這裏是對每個傳遞進來的測試顯示"."的監聽器,如果測試失敗則顯示 "F" ,跳過則是"S":
public class DotTestListener extends TestListenerAdapter {
private int m_count = 0;
@Override
public void onTestFailure(ITestResult tr) {
log("F");
}
@Override
public void onTestSkipped(ITestResult tr) {
log("S");
}
@Override
public void onTestSuccess(ITestResult tr) {
log(".");
}
private void log(String string) {
System.out.print(string);
if (m_count++ % 40 == 0) {
System.out.println("");
}
}
}
上例中,我們選擇擴展 TestListenerAdapter ,它使用空方法實現了 ITestListener 。所以我不需要去重寫那些我不需要的方法。如果喜歡可以直接實現接口。
這裏是我使用這個新監聽器調用TestNG的例子:
java -classpath testng.jar;%CLASSPATH%org.testng.TestNG -listener org.testng.reporters.DotTestListenertest/testng.xml
2.日誌報表
org.testng.IReporter 接口只有一個方法:
public void generateReport(List<ISuite>suites, String outputDirectory)
這個方法在 TestNG 中的所有測試都運行完畢之後被調用,這樣你可以修改這個方法的參數,並且通過它們獲得剛剛完成的測試的所有信息。
3.JUnit 報表
TestNG 包含了一個可以讓TestNG的結果和輸出的XML能夠被JUnitReport所使用的監聽器。這裏有個例子,並且ant任務創建了這個報告:
<target name="reports">
<junitreport todir="test-report">
<fileset dir="test-output">
<include name="*/*.xml"/>
</fileset>
<report format="noframes" todir="test-report"/>
</junitreport>
</target>
注意:由於JDK 1.5 和 JUnitReports 不兼容性,導致了frame版本不能夠正常工作,所以你需要指定 "noframes" 使其能夠正常工作。
4.報表 API
如果你要在HTML報告中顯示日誌信息,那麼就要用到類 org.testng.Reporter:
Reporter.log("M3 WAS CALLED");
5. XML 報表
TestNG 提供一種XML報表器,使得能夠捕捉到只適用於TestNG而不適用與JUnit報表的那些特定的信息。這在用戶的測試環境必須要是用TestNG特定信息的XML,而JUnit又不能夠提供這些信息的時候非常有用。下面就是這種報表器生成XML的一個例子:
<testng-results>
<suite name="Suite1">
<groups>
<group name="group1">
<method signature="com.test.TestOne.test2()" name="test2" class="com.test.TestOne"/>
<method signature="com.test.TestOne.test1()" name="test1" class="com.test.TestOne"/>
</group>
<group name="group2">
<method signature="com.test.TestOne.test2()" name="test2" class="com.test.TestOne"/>
</group>
</groups>
<test name="test1">
<class name="com.test.TestOne">
<test-method status="FAIL" signature="test1()" name="test1" duration-ms="0"
started-at="2007-05-28T12:14:37Z" description="someDescription2"
finished-at="2007-05-28T12:14:37Z">
<exception class="java.lang.AssertionError">
<short-stacktrace>java.lang.AssertionError
... Removed 22 stack frames
</short-stacktrace>
</exception>
</test-method>
<test-method status="PASS" signature="test2()" name="test2" duration-ms="0"
started-at="2007-05-28T12:14:37Z" description="someDescription1"
finished-at="2007-05-28T12:14:37Z">
</test-method>
<test-method status="PASS" signature="setUp()" name="setUp" is-config="true" duration-ms="15"
started-at="2007-05-28T12:14:37Z" finished-at="2007-05-28T12:14:37Z">
</test-method>
</class>
</test>
</suite>
</testng-results>
這個報表器是隨着默認監聽器一起諸如的,所以你默認的情況下就可以得到這種類型的輸出。這個監聽器提供了一些屬性,可以修改報表來滿足你的需要。下表包含了這些屬性,並做簡要說明:
爲了配置報表器,你可以在命令行下使用 -reporter 選項,或者在 Ant 任務中嵌入<reporter> 元素。對於每個情況,你都必須指明類org.testng.reporters.XMLReporter。但是要注意你不能夠配置內建的報表器,因爲這個只使用默認配置。如果你的確需要XML報表,並且使用自定義配置,那麼你就不得不手工完成。可以通過自己添加一兩個方法,並且禁用默認監聽器達到目的。
本文轉載自http://blog.sina.com.cn/bestfeiyong