TestNG測試帶參建構函式的類

2021-09-30 21:52:07 字數 1836 閱讀 4352

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

測試類,只有乙個帶參建構函式。在帶參建構函式上加@test,同時加@parameters註解從

testng.xml中傳遞引數。為保證測試函式在帶參建構函式之後執行,所以測試方法前的@test加了dependsonmethods屬性,依賴於帶參建構函式。

重現問題的示例**如下:

package com.ibm.testng.test;

import org.testng.annotations.parameters;

import org.testng.annotations.test;

public class webtest )

public webtest(int staytime)

@test(dependsonmethods="webtest")

public void stayonserver()

}

輸出結果:

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

這個錯誤,跟testng的執行原理有關。testng啟動之後,先呼叫建構函式建立所有的測試例項,然後才進行測試。因此,建構函式與測試函式的執行時機不一樣,建構函式在所有測試方法之前先執行,沒有必要再通過@test的dependsonmethods屬性使測試函式依賴於建構函式。 .

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

1. 任何已經被@test,@factory或者configuration annotation(@before***/@after***)註解的函式。

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()

return objectlist.toarray();

}

上面**會建立3個staytime分別為10,20,30的測試例項。如果使用@parameters註解,必須建立3個test分別將10,20,30從testng.xml傳入。因此,@factory為帶參建構函式的類建立一系列有規律的測試例項提供了便利。

TestNG測試帶參建構函式的類

今天被同事問到乙個問題,問題描述如下 乙個測試類,只有乙個帶參建構函式。在帶參建構函式上加 test,同時加 parameters註解從testng.xml中傳遞引數。為保證測試函式在帶參建構函式之後執行,所以測試方法前的 test加了dependsonmethods屬性,依賴於帶參建構函式。重現問...

帶參建構函式的類物件陣列初始化

今天同學問我個問題 有乙個帶參建構函式的類,如何初始化其物件陣列?仔細想了想,應該不難額,比如 include using namespace std class a int main return 0 但是問題來了,如果陣列長度太大怎麼辦?想了一下,目前所知道的有兩種比較好的辦法 1 使用stl容...

C 有參建構函式和無參建構函式的實現

建構函式是乙個特殊的成員函式,名字和類名相同,建立類型別物件時由編譯器自動呼叫,雖然建構函式名稱叫做構造,但是它的主要任務是初始化物件,而不是開空間建立物件,在物件的生命週期內只呼叫一次。如果使用者沒有編寫建構函式,則編譯器和自動提供乙個無引數的建構函式,這個函式就叫預設建構函式。建構函式其特徵如下...