簡體   English   中英

在不修改Test類的情況下排除單個JUnit Test方法?

[英]Exclude individual JUnit Test methods without modifying the Test class?

我目前正在使用另一個項目中的JUnit 4測試來反對我的代碼。 作為自動化Ant構建的一部分,我直接從其他項目的存儲庫中獲取它們。 這很棒,因為它可以確保我的代碼在最新版本的測試中保持綠色。

但是,有一部分測試我從未希望傳遞給我的代碼。 但是如果我開始在這些測試中添加@Ignore注釋,我將不得不維護自己的測試實現的單獨副本,我真的不想這樣做。

有沒有一種方法可以在不修改測試源的情況下排除單個測試? 這是我到目前為止所看到的:

  • 據我所知,Ant JUnit任務只允許你排除整個Test類,而不是單獨的測試方法 - 這對我沒有好處,我需要方法粒度。

  • 我考慮整合一個TestSuite,它使用反射動態查找並添加所有原始測試,然后添加代碼以顯式刪除我不想運行的測試。 但是當我注意到TestSuite API沒有提供刪除測試的方法時,我放棄了這個想法。

  • 我可以創建自己的Test類來擴展原始的Test類,覆蓋我不想運行的特定測試,並使用@Ignore注釋它們。 然后我在我的子類上運行JUnit。 這里的缺點是,如果將新的測試類添加到原始項目中,我將不會自動選擇它們。 我將不得不監視新的Test類,因為它們被添加到原始項目中。 到目前為止,這是我最好的選擇,但感覺並不理想。

  • 我能想到的唯一另一個選擇是無論如何都要運行錯誤的測試並忽略失敗。 但是,這些測試需要一段時間才能運行(並且失敗!)所以我寧願根本不運行它們。 另外,我看不到告訴Ant任務忽略特定測試方法失敗的方法(再次 - 我看看如何為單個測試類而不是方法執行此操作)。

如果您根本無法接觸原始測試,那么您將面臨一些嚴重的限制。 你的壓倒性聲音是最好的選擇,但有一些變化:

構建特別排除超類的Ant測試,以便運行您不了解的其他類。

您可以使用@Rule注釋(JUnit 4.7的新增內容)來了解正在運行的測試並中止它(通過返回空的Statement實現)而不是覆蓋特定的方法,讓您在知道是否避免測試時更靈活。 此方法的唯一問題是您無法使用此方法停止運行@Before方法,這可能很慢。 如果這是一個問題(你真的無法觸及測試),那么在重寫方法中的@Ignore是我唯一能想到的。

但是,如果您可以觸摸這些測試,則會打開一些其他選項:

您可以通過在類上指定@RunWith標記來使用自定義運行器運行它們。 這個運行器只是將執行傳遞給該項目中的標准運行器(JUnit4.class),但是在您的項目中(通過系統屬性或其他一些機制)將檢查測試名稱而不運行測試。 這樣做的優點是侵入性最小,但最難實現(跑步者是毛茸茸的野獸,@ Rule的既定目標之一是消除制造它們的大部分需求)。

另一個是在測試中做一個假設的聲明,它會檢查一些配置設置,如果該測試應該運行則該設置是真的。 這實際上涉及注入測試,這很可能是任何遠程標記為“單獨項目”的交易破壞者。

它現在沒有幫助,但TestNG支持這種能力。

好吧,這是一個相當重要的解決方案,但如果聽起來很荒謬,不要向我扔東西。

Junit4的核心是org.junit.runner.Runner類及其各種子類,最重要的是org.junit.runners.Suite 這些運行器使用@Test和@Ignore之類的東西確定給定測試類的測試內容。

創建一個跑步者的自定義實現非常容易,通常你可以通過在測試類上使用@RunWith注釋來連接它們,但顯然這不適合你。

但是,從理論上講,您可以編寫自己的Ant任務,可能基於標准的Ant Junit任務,該任務采用您的自定義測試運行器並直接使用它,依次將每個測試類傳遞給它。 您的運行器實現可以使用外部配置文件,該文件指定要忽略的測試方法。

這將是相當多的工作,你必須花時間在史前的Ant Junit代碼庫中挖掘,以了解它是如何工作的。 然而,時間投入可能是值得的。

令人遺憾的是,Junit Ant任務沒有提供指定測試Runner的機制,這是理想的。

我可以想到用規定的約束來實現你想要的東西是使用字節碼修改。 您可以在單獨的文件中保留要忽略的類和方法的列表,並在加載它們時修補測試類的字節碼以完全刪除此方法。

如果我沒有弄錯,JUnit使用反射來查找要執行的測試方法。 然后,方法重命名操作將允許您在JUnit找到它們之前刪除這些方法。 或者可以修改方法以立即返回,而不執行任何操作。

BCEL這樣的庫可用於在加載時修改類。

如果你只想運行一部分測試,那么聽起來這個類有多個責任,應該重構。 或者,測試類可以拆分,以便原始項目具有所有測試,但是在一個或多個類上(我猜測某些測試實際上是集成測試並觸摸數據庫或網絡)並且您可以排除類( es)你不想要的。

如果你不能做到這一點,你可以選擇覆蓋最好。 無論何時需要忽略擴展該類的某些方法並將其添加到Ant排除列表,都需要執行此過程。 這樣你就可以排除你無法傳遞的內容,並且仍然會在不修改你的構建的情況下引入所有新的測試(你沒有覆蓋的方法和新的測試類)。

如果不需要的測試位於特定的類/包中,則可以使用Ant中的文件集排除在導入期間將其排除。

兩種選擇

  1. 與借用測試的所有者合作,將您的測試提取到您可以共享的單獨課程中。
  2. 創建自己的測試類,代理要使用的測試類。 對於要包含的每個方法,在您的類中都有一個方法。 你需要構建一個你正在調用的測試類的實例,並且如果它們在原始版本中,也需要在方法之前和之后執行。
  3. 基於blockjunitrunner創建一個自定義Junit運行器,並使用它來過濾掉你想要的測試。

暫無
暫無

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

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