簡體   English   中英

JUnit ParentRunner是否應該捕獲AssertionError?

[英]Should JUnit ParentRunner catch AssertionError?

我已經實現了一個基於BlockJUnit4ClassRunner的自定義TestRunner。

我的假設是,任何失敗的斷言(表示產品/需求問題)將通過addFailedAssumption()報告給通知者,而其他異常將通過addFailure()報告,表明單元測試本身存在錯誤。

查看結果,從未調用過addFailedAssumption() ParentRunner .runLeaf()的源代碼中,我看到了

try {
    statement.evaluate();
} catch (AssumptionViolatedException e) {
    eachNotifier.addFailedAssumption(e);
} catch (Throwable e) {
    eachNotifier.addFailure(e);
} finally {
    eachNotifier.fireTestFinished();
}

我得到的異常都是java.lang.AssertionError類型。

ParentRunner應該捕獲AssertionError還是我這邊有誤會?

閱讀有關此主題的更多信息,這似乎是我方面的語言/翻譯問題,因為我不是母語人士。

找到Assume類可以幫助我正確理解(希望如此),我將通過一個示例進行說明:

AssumtionViolatedException的用法

測試可以例如在不同的環境中運行,比如說不同的操作系統。 該產品在不同操作系統上的行為或需求可能會略有不同,例如,因為它可以在較新版本的OS中使用API​​調用,而較新版本的OS中不存在該API。 這可能會導致代碼如下

if(isApiPresent())
    SimpleAPICall();
else
    // Do some crazy stuff here, potentially slower than the API call

根據操作系統的不同, isApiPresent()調用將返回不同的結果,因此您編寫了2個單元測試並添加了有關環境的假設:

@Test
public void isApiPresent_returns_true_on_Win8()
{
    assumeTrue(System.getProperty("os.version").equals("6.2"));
    assertTrue(isApiPresent());
}
@Test
public void isApiPresent_returns_false_on_Win7()
{
    assumeTrue(System.getProperty("os.version").equals("6.1"));
    assertFalse(isApiPresent());
}

如果未給出有關操作系統的假設,則由於@Test批注,該測試仍將執行,但實際上應將其忽略。 assume...()語句可以解決這一問題:它們引發了一個AssumptionViolatedException ,可用於忽略測試。

Eclipse用一個忽略的圖標標記了一個違反假設的測試(嘗試assumeFalse(true); ):

在Eclipse中忽略測試

AssertionError的用法

我想要通過TestRunner的自定義實現實現的目標有些不同。 我想找出哪些單元測試由於需求問題而失敗,以及哪些測試由於其他異常而失敗,這些異常可能表明該單元測試本身存在錯誤,並在Eclipse中重構了這些圖標。 Eclipse已經區分了這兩種類型的問題: AssertionError s用藍色圖標標記,而Exception用紅色圖標標記。

Eclipse中的紅色和藍色單元測試

對我來說,這意味着我必須在fireTestFailure()實施該決定:

public void fireTestFailure(Failure failure) {
    originalNotifier.fireTestFailure(failure);

    if (failure.getException().getClass() == AssertionError.class) {
        // Requirement issue
    } else {
        // Unit test issue
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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