【TestNG】TestNG註解@Factory的使用說明
阿新 • • 發佈:2018-11-11
當通過testng.xml或命令列把測試類傳遞給TestNG時,TestNG會呼叫這些測試類的無參構造方法,將這些類例項化,然後執行在每個類中的測試方法。
如果假設某個測試類中構造方法是有參的,那麼執行時,TestNG會報出TestNGException
異常,因為無法初始化這個類(該類沒有無參構造方法),報錯見下。
org.testng.TestNGException: Can't invoke public void testNGtest.TestFactory.testInitialChar() throws java.io.IOException: either make it static or add a no-args constructor to your class
這個時候就需要使用TestNG的@Factory註解了。
被@Factory註解的方法必須是返回一個物件陣列的方法。而且這些返回的物件陣列中的物件必須包含TestNG annotation的類的例項。
我們可以把@Factory方法和@Test方法放在同一個類中,因為一方面@Factory方法只會被呼叫一次,另一方面@Factory方法優先於@Test方法和配置方法被呼叫,只有當所有的@Factory方法被呼叫之後,TestNG才執行@Test方法和配置方法。
現在用一個簡單的例子來驗證@Factory方法的一些特性與熟悉@Factory方法的基礎使用方法。
比如我們要迴圈登陸兩個網站,迴圈進行登陸和登出:
程式碼如下:
package com.demo.test.testng;
import java.util.ArrayList;
import java.util.List;
import org.testng.annotations.Factory;
import org.testng.annotations.Test;
public class FactoryTest {
private String host;
private int port;
public FactoryTest(String host, int port)
{
this.host=host;
this .port=port;
}
@Test
public void login()
{
System.out.println("login, host:"+host+";port"+port);
}
@Test(dependsOnMethods="login")
public void logout()
{
System.out.println("logout, host:"+host+";port"+port);
}
@Factory
public static Object[] create()
{
List<FactoryTest> list = new ArrayList<FactoryTest>();
list.add(new FactoryTest("10.10.10.1", 8080));
list.add(new FactoryTest("10.10.10.2", 8080));
return list.toArray();
}
}
執行結果:
login, host:10.10.10.2;port8080
login, host:10.10.10.1;port8080
logout, host:10.10.10.2;port8080
logout, host:10.10.10.1;port8080
===============================================
Suite
Total tests run: 4, Failures: 0, Skips: 0
===============================================
等等,好像有什麼不對,怎麼先進行了兩個login呢?這時候就需要做個xml加個設定了,如下:
<?xml version="1.0" encoding="UTF-8"?>
<suite name="Suite" parallel="none">
<test name="Test" group-by-instances="true">
<classes>
<class name="com.demo.test.testng.FactoryTest">
</class>
</classes>
</test> <!-- Test -->
</suite> <!-- Suite -->
再執行這個xml,結果如下:
login, host:10.10.10.2;port8080
logout, host:10.10.10.2;port8080
login, host:10.10.10.1;port8080
logout, host:10.10.10.1;port8080
===============================================
Suite
Total tests run: 4, Failures: 0, Skips: 0
===============================================
嗯,正常了,新增部分為group-by-instances="true"
,可以新增在<suite>
標籤也可以在<test>
標籤。
備註
實際上,這個帶有@Factory
註解的方法也可以寫到其他類中,只是如果寫到其他類中,就需要在xml中將這個類加入進去,執行xml的時候會先執行這個帶@Factory
註解的方法。