簡體   English   中英

在多個測試用例的情況下,Junit @BeforeClass和@AfterClass行為

[英]Junit @BeforeClass and @AfterClass behavior in case of multiple test cases

伙計們,

假設我有一個復雜的分類測試套件,我經常運行。 作為其中的一部分,我試圖確保每個測試類一個接一個地嚴格執行,並且Test2@BeforeClass方法在Test1@AfterClass完成之前不會啟動。 這是一個有效的假設嗎?

示例場景:

TestBase類有一個@BeforeClass和一個@AfterClass方法。

T1類源自TestBase

T2類來自`TestBase。

我們從Ant / Eclipse一起運行T1T2 TestBase中有一些常見的靜態對象在T1T2之間重用,這意味着我必須完全確定在下一輪的BeforeClass開始初始化之前,它們在AfterClass完全被破壞了。 我可以通過上面列出的基本用法來確定這一點嗎?

我強烈懷疑這種情況並沒有發生,但簡單化的測試並沒有證明是一樣的。 文檔也沒有談到這一點。 所以我想確保我不是要解決一個可以解決的系統性問題。

排除並行執行,JUnit應該總是運行一個測試類,即T2之前的T1(或反過來),所以你的場景應該工作。

另一件需要注意的是測試運行的順序,這可能會使問題混亂。 看看我的答案是否有JUnit4開始支持測試訂購? 這是故意的嗎? ,這解釋了為什么測試可以以不同的順序執行。

我認為你最好的解決方案是使用ClassRule 這允許您定義實現AfterClassBeforeClass行為的類。 例如:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM