2011-03-16 75 views
3

我們有兩個不同的相同接口實現。將其視爲參考和生產實施。這兩個實現由不同的團隊實現,目標是從兩個實現中獲得相同的結果。JUnit:對不同實現和細粒度結果狀態的相同測試

創建參考實現的團隊已經創建了一個基於Junit的大量測試用例(現在〜700個測試用例),並且這些單元測試在開發過程中經常運行。我們可以針對生產實施運行同一組測試用例。

生產實現的功能通過迴歸測試進行測試。但是,如果能夠對生產實施進行單元測試,則可以快速反饋我們是否每次獲得生產代碼的新版本時都會嚴重受損。

但由於缺少生產版本中的某些功能,或者由於已知錯誤而導致結果不同,因此並非所有測試都通過此實現。這使得很難早日發現迴歸。

這裏有幾類:

  • (A)測試用例僅供參考實現有意義的,絕不是針對生產實施的重要

  • (B)試驗情況在測試生產實現時只需要省略某些斷言(即參考實現中報告的附加值)

  • (C)已知不工作的測試用例生產執行,因爲某些功能發展滯後,但到目前爲止,應該以後包括

,我們有以下選擇:

  • 搞亂我們的代碼與if語句周圍的斷言,只有工作在參考實現中。這解決了(B)但很難維護。

  • 使用assumeTrue。 (A)這是可以的,但是在(B)中給出錯誤的印象一切都可以。

我想吃點什麼是

  • 如果能夠跳過基於像assumeTrue運行時狀態某些測試,但跳過,而不是成功的爲這些應報告(C )

  • 有考慮到測試情況是否知道有工作過多個結果狀態,給人

    • 成功爲被稱爲前
    • 修正了這是已知未以前
    • 故障工作了這是已知未以前
    • 迴歸工作了測試用例的測試案例已經奏效測試用例對於被稱爲已經奏效
    • 跳過

之前有沒有人做過這樣的事情之前或者是它甚至有可能使用JUnit(最好在conjuncti測試用例使用Eclipse JUnit插件)?

回答

1

要跳過運行時條件的測試,可以使用Filter,並且您可以選擇忽略測試,具體取決於基於測試方面的運行時條件(名稱,更好的是Annotation @Development( )或@Version()在測試方法上)。 (B)你需要爲每個版本使用不同的測試方法,一個用於3.1,另一個用於3.2等等。這可能看起來像是讓你的單元測試變得混亂,但實際上它使你的工作更容易挑出適用於3.1的測試。

對於你的問題的「時間機器」的一部分,這是非常難的JUnit知道測試是否已經通過之前。你需要在某處記錄舊的結果。

要分析哪些測試狀態發生了變化(從傳遞到失敗),請讓您的junit測試由CI系統以系統化方式運行,然後將結果保存在可以進行後期處理以供您使用的地方迴歸。例如,surefire xml報告相當容易解析。

0

我不知道你的問題的第一部分,但就多個結果狀態而言,你可能需要某種持續集成。據我所知,JUnit無法「知道」過去測試用例是成功還是失敗,因此您需要在其他地方獲取這些信息。

+0

我想提供的Junit這個信息的,無論是作爲代碼或註釋。事實上,eclipse插件確實對從前一次運行中檢索結果有某種支持,但沒有比較支持,結果僅存儲在本地機器上。 CI部分已經在今年晚些時候列在我的名單上。 – Axel 2011-03-16 12:24:57

+0

說實話,我不知道JUnit提供任何支持傳遞給它以前的測試結果。即使有一種方法可以做到這一點,但每次測試結果不正確時編輯代碼/註釋都會涉及閱讀外部文件。您可以隨時檢索結果,並根據MatthieuF的建議進行比較,但在我看來,這似乎是重新發明了方向盤。 – Christina 2011-03-16 12:52:28

+0

我提到的支持是由eclipse插件提供的,而不是JUnit本身。雖然必須手動註釋測試用例需要更多的工作,但它具有能夠標記應該正常工作的測試用例的優點,即使在最後一個版本中它失敗了。考慮一下,通過'@ExpectSuccess(condition =「version> = 123」)''這樣的條件在運行時設置這個集合將是一個很好的功能。 – Axel 2011-03-16 15:41:48

0

你能創建一個包含已知的在兩種情況下工作,並延長與包含測試用例是特定的生產和參考實現其他兩個班的所有測試用例基類?

如果它比這更細粒度(例如,一個測試很長,90%的測試都可以在prod和reference中使用),那麼你可以採用相同的方法,但是將重寫方法中的斷言置於子類。 (你不得不創造一些在基類抽象方法來支持這一點)