簡體   English   中英

在 JUnit 5 中超過超時后如何使測試失敗?

[英]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.AssertionsassertTimeoutPreemptively靜態斷言:

@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.

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