[英]JUnit 5 - Providing setUp and tearDown for an entire Test Suite
我的要求是對一組測試進行一些初始化,並在所有測試完成后將其清除。 這些測試圍繞幾個測試類進行,因為它們不是密切相關的,但需要一個共同的初始化。
我正在使用@SelectClasses
來形成套件,並嘗試使用應該處理預處理和后處理的自定義擴展來使用@ExtendWith
。 這不起作用,我不確定 JUnit 中是否存在合適的解決方案。 共享已經嘗試過的示例代碼。
套房:
@SelectClasses({FirstTest.class, SecondTest.class})
@ExtendWith(SuiteExtension.class)
@RunWith(JUnitPlatform.class)
@SuiteDisplayName("test suite")
public class SuiteClass {
}
延期:
public class SuiteExtension implements BeforeAllCallback, AfterAllCallback {
@Override
public void afterAll(ExtensionContext context) throws Exception {
System.out.println("afterAll");
}
@Override
public void beforeAll(ExtensionContext context) throws Exception {
System.out.println("beforeAll");
}
}
測試類 1:
public class FirstTest {
@Test
void test1(){
System.out.println("test1");
}
}
測試類 2:
public class SecondTest {
@Test
void test2(){
System.out.println("test2");
}
}
輸出:
test1
test2
預期輸出:
beforeAll
test1
test2
afterAll
不支持結合使用@RunWith
(來自 JUnit 4)和@ExtendWith
(來自 JUnit Jupiter):它們是來自兩個不同框架的擴展機制。
從技術上講,您的SuiteClass
是一個 JUnit 4 測試類。 因此,JUnit Jupiter 不會為其注冊或執行任何擴展。
關於 JUnit 5 中的套件,我們(JUnit 團隊)計划為不需要 JUnit 4 Runner (即@RunWith(JUnitPlatform.class)
)的套件提供一流的支持。 有關詳細信息,請參閱所有標有“套件”的 GitHub 問題。 隨意觀看和/或評論任何這些問題。
在此期間,我相信在 JUnit Jupiter 中實現“套件前后”支持的最接近的方法是實現一個自定義擴展,該擴展實現了BeforeAllCallback
和AfterAllCallback
。 該擴展需要通過在根ExtensionContext
Store
存儲一個標志(作為BeforeAllCallback
)來跟蹤它是否已經被調用,以便它只在“套件”之前執行一次。 同樣,它需要計算它執行的類的數量,並在根Store
跟蹤它。 這將用作Stack
或CountDownLatch
。 作為AfterAllCallback
,擴展需要遞減全局計數器,並且僅在所有測試類完成后才執行。
您顯然需要確保為屬於該套件的每個測試類注冊了您的套件擴展。 也許自定義組合注釋可以為您簡化那里的事情。
現在,無可否認,我只是在我的腦海中實現了它,但還沒有真正編碼這樣一個“套件”擴展。 因此,如果您真的實施它,我很想聽聽您的經驗並可能看到您的代碼。 ;-)
干杯,
Sam(JUnit 5 的核心提交者)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.