測試方法
測試方法被注解為@Test兄春。注釋的方法與@Test碰巧返回值將被忽略,可以設置允許回值設置為true在你的testng.xml:
<suite allow-return-values="true">
or
<test allow-return-values="true">
測試組
TestNG 允許將測試方法歸類為不同的組锡溯。
不僅僅是可以聲明某個方法屬于某個組赶舆,而且還可以讓組包含其他的組。
這樣TestNG可以調用或者請求包含一組特定的組(或者正則表達式)而排除其他不需要組的集合祭饭。
這樣芜茵,如果打算將測試分成兩份的時候,就無需重新編譯倡蝙。
這個特點九串,會給你在劃分組的時候帶來很大的靈活性。
組在的testng.xml文件中指定寺鸥,可以發(fā)現無論是<test>
或<suite>
標簽猪钮。指定組<suite>
標簽適用于所有的<test>
下方標簽。需要注意的是群體標簽:如果指定組的“a”在<suite>
標簽中和b在<test>
標簽中胆建,那么這兩個“a”和“b”將被包括在內
將測試劃分為兩種類別:
檢查性測試(Check-in test):這些測試在你提交新代碼之前就會運行烤低。它們一般都是很快進行的,并且保證沒有哪個基本的功能是不好使的
功能性測試(Functional test):這些測試涵蓋你的軟件中所有的功能笆载,并且至少每天運行一次扑馁,不過也可能希望他們持續(xù)的運行
典型的來說涯呻,檢測性測試通常是功能性測試的一個子集。TestNG允許你根據個人感覺來進行組劃分檐蚜。例如魄懂,你可能希望把你所有的測試類都劃歸為"functest"組,并且額外的有幾個方法輸入"checkintest"組闯第。
public class Test1 {
@Test(groups = { "functest", "checkintest" })
public void testMethod1() {
}
@Test(groups = {"functest", "checkintest"} )
public void testMethod2() {
}
@Test(groups = { "functest" })
public void testMethod3() {
}
}
通過下面的內容調用TestNG
<test name="Test1">
<groups>
<run>
<include name="functest"/>
</run>
</groups>
<classes>
<class name="example1.Test1"/>
</classes>
</test>
以上會運行上面那個類中所有的測試市栗,當y要使用checkintest進行調用的時候,就僅僅運行testMethod1()和testMethod2()
使用正則表達式
@Test
public class Test1 {
@Test(groups = { "windows.checkintest" })
public void testWindowsOnly() {
}
@Test(groups = {"linux.checkintest"} )
public void testLinuxOnly() {
}
@Test(groups = { "windows.functest" )
public void testWindowsToo() {
}
}
可以使用下面這個 testng.xml 來只運行在Windows下的方法:
<test name="Test1">
<groups>
<run>
<include name="windows.*"/>
</run>
</groups>
<classes>
<class name="example1.Test1"/>
</classes>
</test>
注意:TestNG使用的是正則表達式咳短,而不是通配符填帽。注意這二者的區(qū)別(例如,"anything" 是匹配于 "."代表點和星號咙好,而不是星號 "")
組中組
測試組也可以包含其他組篡腌。這樣的組叫做“元組"(MetaGroups)"
例如,可能要定義一個組"all"
來包含其他的組勾效,"chekcintest"
和"functest"
嘹悼。"functest"
本身只包含了組windows
和linux
,而"checkintest"
僅僅包含windows
层宫。你就可以在屬性文件中這樣定義:
<test name="Regression1">
<groups>
<define name="functest">
<include name="windows"/>
<include name="linux"/>
</define>
<define name="all">
<include name="functest"/>
<include name="checkintest"/>
</define>
<run>
<include name="all"/>
</run>
</groups>
<classes>
<class name="test.sample.Test1"/>
</classes>
</test>
排除組
stNG 允許你包含組杨伙,當然也可以排除
創(chuàng)建一個叫做"broken"
組, 然后使得這些測試方法從屬于那個組萌腿。
例如上面的例子限匣,假設我知道testMethod2()
會中斷,所以我希望使其失效:
@Test(groups = {"checkintest", "broken"} )
public void testMethod2() {
}
從運行中排除這個組:
<test name="Simple example">
<groups>
<run>
<include name="checkintest"/>
<exclude name="broken"/>
</run>
</groups>
<classes>
<class name="example1.Test1"/>
</classes>
</test>
通過這種辦法毁菱,可以得到整潔的測試運行米死,同時也能夠跟蹤那些需要稍后修正的中斷的測試。
注意:你可以可以通過使用"enabled"
屬性來完成贮庞,這個屬性適用于@Test
和 @Before/After annotation
局部組
可以在類級別定義組峦筒,之后還可以在方法級定義組:
@Test(groups = { "checkin-test" })
public class All {
@Test(groups = { "func-test" )
public void method1() { ... }
public void method2() { ... }
}
在這個類中,method2()
類級組"checkin-test"
的一部分窗慎,而method1()
即屬于"checkin-test"
也屬于"func-test"
組
異常
測試中勘天,有時候我們期望某些代碼拋出異常
TestNG通過@Test(expectedExceptions) 來判斷期待的異常, 并且判斷Error Message
import org.testng.Assert;
import org.testng.annotations.Test;
public class ExpectedExceptionTest {
String message = "Manisha";
MessageUtil messageUtil = new MessageUtil(message);
@Test(expectedExceptions = ArithmeticException.class)
public void testPrintMessage() {
System.out.println("Inside testPrintMessage()");
messageUtil.printMessage();
}
@Test
public void testSalutationMessage() {
System.out.println("Inside testSalutationMessage()");
message = "Hi!" + "Manisha";
Assert.assertEquals(message,messageUtil.salutationMessage());
}
}