2011-10-07 58 views
2

我想調試一個失敗的測試,有一個assertEquals JUnit測試。在assertEquals語句失敗後,我希望看到應用程序在一段時間內的行爲。現在,eClipse在語句失敗後立即停止測試。有沒有辦法在失敗後讓測試休眠一下?謝謝。不要停止測試assertEquals

回答

2

當你說「應用程序在一段時間內的行爲」時,你說的是在不同的(非測試)線程中的行爲,對吧?我想提取斷言條件到一個變量,將斷點實際斷言線,並在調試運行測試:

@Test 
public void testSomeMethod() { 
    assertEquals(true, testInstance.someMethod()); 
} 

成爲

@Test 
public void testSomeMethod() { 
    boolean result = testInstance.someMethod(); 
    /* breakpoint goes here */ assertEquals(true, result); 
} 
+0

這個也是我所做的。 –

1

要做的最簡單的事情就是註釋掉該行。

一旦斷言失敗,單個測試就會失敗,原因是您如何信任第一次失敗後的任何結果?

你說

I'd like to see the behavior of the application for a certain amount of time after the assertEquals statement fails 

我不明白這句話。你是否正在運行帶有junit聲明的應用程序,還是正在運行一套單元測試?另外,如果斷言失敗,爲什麼你想繼續?聽起來像你的測試設計需要更多的工作 - 斷言失敗意味着情況是一個失敗的時期。如果你想看看失敗後會發生什麼,那麼你應該在斷言中添加更多的細節,並且只有當你不想繼續時纔會失敗。

+0

我有一種預感,我的測試失敗了,因爲一個變量的值在應該變化之前就已經改變了。我想看看測試未能進一步調查這件事後會發生什麼。 – jamesfzhang

+0

然後只是註釋掉該行。您也可以使用調試器觀察值,以瞭解其更改的時間。 – hvgotcodes

+0

另一個問題是測試只是有時會失敗。我感興趣的變量每5秒更改一次值,需要300-500ms。正如你可以想象的那樣,如果assert語句落在該差距的正確方面,它會通過,否則它會失敗。我不能使用調試器,因爲按下一個鍵去下一行太慢了。 – jamesfzhang

1

不是。在幕後,當斷言失敗時,JUnit框架會引發異常。 Eclipse捕獲這個異常並將給定的測試標記爲失敗。所以你問:是否可以抑制拋出異常並繼續執行

JUnit不會幫你在這裏。你可以用你自己的包裝器代替JUnit斷言,它不會拋出異常(或者在測試結束時拋出)。當然,你也可以評論測試失敗。但是沒有內置的解決方案。

+0

你是對的,assertXXX拋出一個AssertionError,但這被JUnit框架捕獲,Eclipse得到通知,因爲它有一個RunListener –

0

理想情況下,您的測試每次測試應該只有一個斷言,並且您的測試一次只能涵蓋一個特定的功能。

如果您有多個測試,那麼很可能您的其他資產在第一次失敗時失敗,因此在進行其他測試時沒有任何價值。

但是,如果你仍然想繼續做好,那麼你可以建立自己的斷言庫,在這裏你創建自己的apis並在某處存儲結果,然後打印出錯誤。不是太靠近Java所以不知道如何可以編碼。

-2

一般來說,單元測試應該在他們中有一個單一的論斷;他們正在測試的一件事。除了斷言之外,有兩個測試的代碼完全相同,即「運行時,這兩個東西都應該是真的」是兩個測試,這並非不合理。

值得注意的是,如果您真的想要使用附加代碼(過去斷言)來幫助您確定測試失敗的原因,請考慮一直流行的printf調試。您可以在斷言之前向測試中添加一些輸出,以讓您知道事物的狀態。一旦測試正常,您可以隨時將其拉出。

1

assertEquals拋出一個AssertionError,因此您需要找到一種對該異常做出反應的方法。

您是IDE可能有能力在發生異常或錯誤時添加斷點。如果是,則爲AssertionError添加一個。

如果沒有,那麼你可以添加圍繞assertEquals的try catch,並在catch塊中添加一個斷點。

相關問題