[英]How to run @beforeclass @test and @Afterclass cases in a loop using TestNG
[英]Junit @BeforeClass and @AfterClass behavior in case of multiple test cases
伙計們,
假設我有一個復雜的分類測試套件,我經常運行。 作為其中的一部分,我試圖確保每個測試類一個接一個地嚴格執行,並且Test2
的@BeforeClass
方法在Test1
的@AfterClass
完成之前不會啟動。 這是一個有效的假設嗎?
示例場景:
TestBase
類有一個@BeforeClass
和一個@AfterClass
方法。
T1
類源自TestBase
。
T2
類來自`TestBase。
我們從Ant / Eclipse一起運行T1
和T2
。 TestBase中有一些常見的靜態對象在T1
和T2
之間重用,這意味着我必須完全確定在下一輪的BeforeClass
開始初始化之前,它們在AfterClass
完全被破壞了。 我可以通過上面列出的基本用法來確定這一點嗎?
我強烈懷疑這種情況並沒有發生,但簡單化的測試並沒有證明是一樣的。 文檔也沒有談到這一點。 所以我想確保我不是要解決一個可以解決的系統性問題。
排除並行執行,JUnit應該總是運行一個測試類,即T2之前的T1(或反過來),所以你的場景應該工作。
另一件需要注意的是測試運行的順序,這可能會使問題混亂。 看看我的答案是否有JUnit4開始支持測試訂購? 這是故意的嗎? ,這解釋了為什么測試可以以不同的順序執行。
我認為你最好的解決方案是使用ClassRule 。 這允許您定義實現AfterClass
和BeforeClass
行為的類。 例如:
public class UsesExternalResource {
public static Server myServer= new Server();
@ClassRule
public static ExternalResource resource= new ExternalResource() {
@Override
protected void before() throws Throwable {
myServer.connect();
};
@Override
protected void after() {
myServer.disconnect();
};
};
}
使用它可能會消除靜態變量的需要,因為您可以在ClassRule
完成所有設置,所有內容都可以是實例變量。 您可以完全刪除TestBase
父類。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.