[英]How to fail a test after a timeout is exceeded in JUnit 5?
在 JUnit 4 中,“timeout”注釋參數可用於強制測試在給定時間后停止:
@Test(timeout=100)
public void infinity() {
while(true);
}
這如何在 JUnit 5 中完成?
與Annotation Type Test 的超時參數(和代碼取自)密切相關,但對於 JUnit 5。
timeout
屬性的嚴格等價物是聲明性的@Timeout
注釋。
從 JUnit 5 文檔:
@Timeout
注釋允許人們聲明如果測試、測試工廠、測試模板或生命周期方法的執行時間超過給定的持續時間,它應該失敗。 持續時間的時間單位默認為秒,但可配置。
例如 :
@Test
@Timeout(value = 100, unit = TimeUnit.MILLISECONDS)
void infinity() {
// fails if execution time exceeds 100 milliseconds
//...
}
Assertions.assertTimeout()
和Assertions.assertTimeoutPreemptively()
是 JUnit 5 中引入的新概念(JUnit 4 中不存在)。 這些是@Timeout
的替代方案,可將超時縮小到一組特定的語句:這些語句在Executable
或作為參數傳遞的Supplier
中定義。
這兩種方法(名稱非常接近)解決了相同的總體目標,但存在細微差別。
如果發生超時而assertTimeout()
沒有發生超時,assertTimeoutPreemptively( assertTimeoutPreemptively()
會搶先中止Executable/Supplier
。
為了實現它, assertTimeoutPreemptively()
在與調用代碼不同的線程中執行提供的Executable/Supplier
,而assertTimeout()
在同一個線程中執行它。
來自官方文檔的警告:依賴於java.lang.ThreadLocal
存儲進行測試執行設置/拆卸的代碼/庫可能會對assertTimeoutPreemptively()
產生不良副作用,因為它會在不同的線程中執行提供的語句。
使用來自org.junit.jupiter.api.Assertions
的assertTimeoutPreemptively
靜態斷言:
@Test
public void infinity() {
assertTimeoutPreemptively(Duration.ofMillis(100), () -> {
while (true);
});
}
除了為特定測試(根據 OP 請求)指定超時的其他答案之外,從 JUnit 5.5 開始,還可以配置全局超時,這是一個有用的選項,而不是為每個方法添加@Timeout
注釋。
根據JUnit 5 User Guide ,其中記錄了其他答案中的語法:
配置參數可用於為某個類別的所有方法指定全局超時,除非它們或封閉的測試類使用 @Timeout 注釋
例如,這將為所有可測試和生命周期方法設置 500 毫秒的全局超時:
junit.jupiter.execution.timeout.default = 500 ms
超時的范圍可以更窄,例如只是@Test
方法:
junit.jupiter.execution.timeout.testtemplate.method.default = 500 ms
如果使用其他答案中描述的@Timeout
注釋,它將覆蓋這些默認值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.