目錄
(一)TestNG學習之路—HelloWorld入門
(二)TestNG學習之路—注解及屬性概覽
(三)TestNG學習之路—TestNG.xml/YAML
(四)TestNG學習之路—注解詳述之@Test
(五)TestNG學習之路—注解詳述之參數(shù)化
(六)TestNG學習之路—注解詳述之@Factory
(七)TestNG學習之路—注解詳述之忽略測試
(八)TestNG學習之路—注解詳述之并發(fā)
(九)TestNG學習之路—失敗測試重跑
(十)TestNG學習之路—編碼執(zhí)行TestNG
(十一)TestNG學習之路—BeanShell高級用法
(十二)TestNG學習之路—注解轉換器
(十三)TestNG學習之路—方法攔截器
(十四)TestNG學習之路—TestNG監(jiān)聽器
(十五)TestNG學習之路—依賴注入
(十六)TestNG學習之路—測試報告
(十七)基于TestNG+Rest Assured+Allure的接口自動化測試框架
前言
數(shù)據(jù)驅動是最常見的自動化測試框架模式之一蒋困,TestNG亦支持數(shù)據(jù)驅動疯暑,常用的有@Parameters和@DataProvider兩種注解涂臣。
@Parameters
@Parameters(value = "para")參數(shù)個數(shù)須與注解方法的入?yún)€數(shù)保持一致。
import org.testng.Assert;
import org.testng.annotations.*;
public class TestNGHelloWorld1 {
@BeforeTest
public void bfTest() {
System.out.println("TestNGHelloWorld1 beforTest!");
}
@Test(expectedExceptions = ArithmeticException.class, expectedExceptionsMessageRegExp = ".*zero")
public void helloWorldTest1() {
System.out.println("TestNGHelloWorld1 Test1!");
int c = 1 / 0;
Assert.assertEquals("1", "1");
}
@Test()
@Parameters(value = "para")
public void helloWorldTest2(String str) {
Assert.assertEquals("1", "1");
System.out.println("TestNGHelloWorld1 Test2! "+ str);
}
@AfterTest
public void AfTest() {
System.out.println("TestNGHelloWorld1 AfterTest!");
}
}
testng.xml配置parameter的value為傳入給變量的值肥印,name與@Parameters的value一致。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="All Test Suite">
<test verbose="2" preserve-order="true" name="D:/IntelliJ_IDEA_workspace/TestNG/src/test/resources">
<parameter name="para" value="Tomandy"/>
<classes>
<class name="TestNGHelloWorld1">
</class>
</classes>
</test>
</suite>
運行結果:
TestNGHelloWorld1 beforTest!
TestNGHelloWorld1 Test1!
TestNGHelloWorld1 Test2! Tomandy
TestNGHelloWorld1 AfterTest!
===============================================
All Test Suite
Total tests run: 2, Failures: 0, Skips: 0
===============================================
也可以通過@Optional來指定默認值顽悼,如果testng.xml沒有配置對應的參數(shù)晶乔,則使用默認值傳參。
@Test()
@Parameters(value = "para")
public void helloWorldTest2(@Optional("Tom")String str) {
Assert.assertEquals("1", "1");
System.out.println("TestNGHelloWorld1 Test2! "+ str);
}
@DataProvider
如果需要傳遞復雜的參數(shù)侵状,那么@Parameters可能無法滿足赞弥。在這種情況下,可以使用@DataProvider提供需要測試的值趣兄。@DataProvider注解的方法返回對象數(shù)組绽左。官網(wǎng)的一個例子如下:
//This method will provide data to any test method that declares that its Data Provider
//is named "test1"
@DataProvider(name = "test1")
public Object[][] createData1() {
return new Object[][] {
{ "Cedric", new Integer(36) },
{ "Anne", new Integer(37)},
};
}
//This test method declares that its data should be supplied by the Data Provider
//named "test1"
@Test(dataProvider = "test1")
public void verifyData1(String n1, Integer n2) {
System.out.println(n1 + " " + n2);
}
輸出結果:
Cedric 36
Anne 37
如果@DataProvider和@Test注解的方法不在同一個類或屬于其基類的話,需通過dataProviderClass屬性來指定@DataProvider類位置艇潭,并且@DataProvider注解的方法保持靜態(tài)(static)拼窥,舉例如下:
public class StaticProvider {
@DataProvider(name = "create")
public static Object[][] createData() {
return new Object[][] {
new Object[] { new Integer(42) }
};
}
}
public class MyTest {
@Test(dataProvider = "create", dataProviderClass = StaticProvider.class)
public void test(Integer n) {
// ...
}
}
除了上述的return Object[][],@DataProvider注解的方法也允許使用迭代器,區(qū)別是迭代器允許你延遲創(chuàng)建自己的測試數(shù)據(jù)蹋凝,TestNG會調(diào)用迭代器鲁纠,之后測試方法會一個接一個的調(diào)用由迭代器返回的值。在你需要傳遞很多參數(shù)組給測試方法的時候鳍寂,無須提前創(chuàng)建一堆值改含。
@DataProvider(name = "test1")
public Iterator<Object[]> createData() {
return new MyIterator(DATA);
}
如果你聲明的 @DataProvider 使用 java.lang.reflect.Method 作為第一個參數(shù),TestNG 會把當前的測試方法當成參數(shù)傳給第一個參數(shù)伐割,舉例如下:
@DataProvider(name = "dp")
public Object[][] createData(Method m) {
System.out.println(m.getName()); // print test method name
return new Object[][] { new Object[] { "Cedric" }};
}
@Test(dataProvider = "dp")
public void test1(String s) {
}
@Test(dataProvider = "dp")
public void test2(String s) {
}
執(zhí)行結果:
test1
test2
另外候味,@DataProvider可使用parallel屬性來實現(xiàn)并行執(zhí)行測試。
@DataProvider(parallel = true)
// ...
使用XML文件運行的data provider享有相同的線程池隔心,默認的線程數(shù)大小是10.可以通過修改 <suite> 標簽中的data-provider-thread-count屬性來更改白群。如果想指定的幾個data provider運行在不同的線程中,則必須通過不同的xml文件來運行硬霍。
<suite name="Suite1" data-provider-thread-count="20" >