今天被同事問到乙個問題,問題描述如下:
乙個測試類,只有乙個帶參建構函式。在帶參建構函式上加@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 有參建構函式和無參建構函式的實現
建構函式是乙個特殊的成員函式,名字和類名相同,建立類型別物件時由編譯器自動呼叫,雖然建構函式名稱叫做構造,但是它的主要任務是初始化物件,而不是開空間建立物件,在物件的生命週期內只呼叫一次。如果使用者沒有編寫建構函式,則編譯器和自動提供乙個無引數的建構函式,這個函式就叫預設建構函式。建構函式其特徵如下...