1. 程式人生 > >【TestNG】TestNG註解@Factory的使用說明

【TestNG】TestNG註解@Factory的使用說明

當通過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註解的方法。