目錄
(一)TestNG學習之路—HelloWorld入門
(二)TestNG學習之路—注解及屬性概覽
(三)TestNG學習之路—TestNG.xml/YAML
(四)TestNG學習之路—注解詳述之@Test
(五)TestNG學習之路—注解詳述之參數化
(六)TestNG學習之路—注解詳述之@Factory
(七)TestNG學習之路—注解詳述之忽略測試
(八)TestNG學習之路—注解詳述之并發
(九)TestNG學習之路—失敗測試重跑
(十)TestNG學習之路—編碼執行TestNG
(十一)TestNG學習之路—BeanShell高級用法
(十二)TestNG學習之路—注解轉換器
(十三)TestNG學習之路—方法攔截器
(十四)TestNG學習之路—TestNG監聽器
(十五)TestNG學習之路—依賴注入
(十六)TestNG學習之路—測試報告
(十七)基于TestNG+Rest Assured+Allure的接口自動化測試框架
前言
使用@Factory可動態地創建測試,一般用來創建一個測試類的多個實例,每個實例中的所有測試用例都會被執行,@Factory構造實例的方法必須返回Object[]。
@Factory詳解
創建測試類如下,其中test1依賴于test方法。
import org.testng.annotations.Test;
public class TomandyFactory {
private String str;
public TomandyFactory(String str){
this.str = str;
}
@Test
public void test(){
System.out.println("TomandyFactory: " +str);
}
@Test(dependsOnMethods = "test")
public void test1(){
System.out.println("TomandyFactory1: " +str);
}
}
創建工廠測試類,該工程創建2個TomandyFactory實例。
import org.testng.annotations.Factory;
public class TestFactory {
@Factory
public Object[] test(){
Object[] object = new Object[2];
for(int i=0;i<2;i++) {
TomandyFactory tomandyFactory = new TomandyFactory(i+"");
object[i] = tomandyFactory;
}
return object;
}
}
testng.xml配置工廠類名TestFactory即可:
<?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="Test">
<classes>
<class name="TestFactory">
</class>
</classes>
</test>
</suite>
執行結果:
TomandyFactory: 0
TomandyFactory: 1
TomandyFactory1: 0
TomandyFactory1: 1
===============================================
All Test Suite
Total tests run: 4, Failures: 0, Skips: 0
===============================================
通過以上例子的執行結果可以發現,盡管test1方法依賴于test方法,但@Factory工廠測試類的執行測試類方法的順序卻是:test,test,test1,test1,如果需要執行類似登錄、退出之類的功能,并不能滿足咱們的需求,此類場景,官網也給出了解決方案,那就是在testng.xml添加:
<suite name="Factory" group-by-instances="true">
or
<test name="Factory" group-by-instances="true">
還是上面的例子,修改testng.xml如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="All Test Suite" group-by-instances="true">
<test verbose="2" preserve-order="true" name="Test">
<parameter name="para" value="Tomandy"/>
<classes>
<class name="TestFactory">
</class>
</classes>
</test>
</suite>
執行結果如下,測試類方法執行順序為:test,test1,test,test1。
TomandyFactory: 0
TomandyFactory1: 0
TomandyFactory: 1
TomandyFactory1: 1
===============================================
All Test Suite
Total tests run: 4, Failures: 0, Skips: 0
===============================================
@Factory與@DataProvider區別
通過上述@Factory的例子,可能會聯想到TestNG的@DataProvider,但兩者的區別也是比較明顯的。
@DataProvider:為測試用例提供參數,有多少組參數就會執行多少次用例,因此它是讓一個測試類實例的某個方法執行多次,每次執行都是同一個實例。
@Factory:創建一個測試類的多個實例,每個實例中的所有測試用例都會被執行,每次執行采用的是不同實例。
Factory也可以與DataProvider結合使用。
修改上述例子的工廠測試類如下:
import org.testng.annotations.DataProvider;
import org.testng.annotations.Factory;
public class TestFactory {
@Factory(dataProvider = "n")
public Object[] test(int n){
Object[] object = new Object[n];
for(int i=0;i<n;i++) {
TomandyFactory tomandyFactory = new TomandyFactory(i+"");
object[i] = tomandyFactory;
}
return object;
}
@DataProvider(name = "n")
public Object[][] num(){
return new Object[][]{new Object[]{3}};
}
}
執行結果如下:
TomandyFactory: 0
TomandyFactory1: 0
TomandyFactory: 1
TomandyFactory1: 1
TomandyFactory: 2
TomandyFactory1: 2
===============================================
All Test Suite
Total tests run: 6, Failures: 0, Skips: 0
===============================================