[英]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類可以幫助我正確理解(希望如此),我將通過一個示例進行說明:
測試可以例如在不同的環境中運行,比如說不同的操作系統。 該產品在不同操作系統上的行為或需求可能會略有不同,例如,因為它可以在較新版本的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);
):
我想要通過TestRunner的自定義實現實現的目標有些不同。 我想找出哪些單元測試由於需求問題而失敗,以及哪些測試由於其他異常而失敗,這些異常可能表明該單元測試本身存在錯誤,並在Eclipse中重構了這些圖標。 Eclipse已經區分了這兩種類型的問題: AssertionError
s用藍色圖標標記,而Exception
用紅色圖標標記。
對我來說,這意味着我必須在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.