TestNG測試帶參構造函數的類

       今天被同事問到一個問題,問題描述如下:

       一個測試類,只有一個帶參構造函數。在帶參構造函數上加@Test,同時加@Parameters註解從testng.xml中傳遞參數。爲保證測試函數在帶參構造函數之後執行,所以測試方法前的@Test加了dependsOnMethods屬性,依賴於帶參構造函數。

        重現問題的示例代碼如下:

package com.ibm.testng.test;

import org.testng.annotations.Parameters;
import org.testng.annotations.Test;

public class WebTest {
    //Times staying on the server
    private int stayTime;
    
    //Constructor with params
    @Test
    @Parameters({"stayTime"})
    public WebTest(int stayTime) {
        System.out.println("Constructor with parameter!");
        this.stayTime = stayTime;
    }
    
    @Test(dependsOnMethods="WebTest")
    public void stayOnServer() {
        System.out.println("The times staying on server: " + stayTime);
    }
}

         輸出結果:

 

        根據輸出結果可知,錯誤原因是沒有找到stayOnServer()依賴的測試函數WebTest()。可能會疑問,不是有名稱爲WebTest()的函數嗎,而且還用@Test註解了,爲什麼會提示找不到呢?

        這個錯誤,跟TestNG的執行原理有關。TestNG啓動之後,先調用構造函數創建所有的測試實例,然後才進行測試。因此,構造函數與測試函數的執行時機不一樣,構造函數在所有測試方法之前先執行,沒有必要再通過@Test的dependsOnMethods屬性使測試函數依賴於構造函數。

         構造函數沒必要用@Test註解(註解了也不會報錯),但是TestNG不會把它當做測試函數,它也不會和其他測試函數一起執行。可能習慣性地認爲帶參構造函數前的@Parameters一定要和@Test一起使用,其實不是這樣的,@Parameters可以放的位置有如下兩種情況:

       1. 任何已經被@Test,@Factory或者Configuration annotation(@BeforeXXX/@AfterXXX)註解的函數。

       2. 測試類中至多一個構造函數前面。TestNG會調用該構造函數創建測試實例,並從testng.xml中獲得該構造函數需要的參數。

     

      可能你希望使用某個構造函數來創建測試實例,但是TestNG會根據自己的規則選擇構造函數。TestNG選擇構造函數的規則:

      1. 通常情況下,會選擇默認無參構造函數或者自己添加的無參構造函數。

       2. 如果有帶參構造函數,且被@Parameters註解,就會選擇該帶參構造函數。

       3. 如果同時有無參構造函數和帶參構造函數,且帶參構造函數沒有被@Parameters註解,選擇無參構造函數。

       4. 如果只有帶參構造函數,但是帶參構造函數沒有被@Parameters註解,執行測試函數時拋出org.testng.TestNGException。

        對於帶參構造函數的測試類,使用@Factory註解,不僅可以解決帶參構造函數沒有被@Parameters註解而導致的org.testng.TestNGException,而且還可以充分發揮TestNG參數化測試的優勢。以添加如下@Factory註解的代碼爲例:

    @Factory
    public static Object[] create() {
        System.out.println("Create test objects!");
        List<WebTest> objectList = new ArrayList<WebTest>();
        for(int i=1; i<4; i++) {
            objectList.add(new WebTest(i*10));
        }
        
        return objectList.toArray();
    }

        上面代碼會創建3個stayTime分別爲10,20,30的測試實例。如果使用@Parameters註解,必須創建3個test分別將10,20,30從testng.xml傳入。因此,@Factory爲帶參構造函數的類創建一系列有規律的測試實例提供了便利。

發佈了34 篇原創文章 · 獲贊 22 · 訪問量 38萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章