簡體   English   中英

如何在JUnit 4測試套件中獲得測試集合

[英]How to get a collection of tests in a JUnit 4 test suite

在JUnit 3中,我可以使用以下代碼獲得測試套件中的所有測試:

TestSuite allTestsSuite = (TestSuite) AllTests.suite()
Enumeration enumeration = allTestsSuite.tests();
ArrayList listOfTests = Collection.list(enumeration);

但是,我在JUnit 4中找不到執行此操作的等效方法。類不再具有.suite()方法。 他們只是使用@Suite批注。 除了Suite類不再具有tests()方法之外,這將不是問題。 有一個children()方法,但是返回了Runners列表,這似乎與我要查找的原因有所不同。

那么,如何像在JUnit 3中那樣在JUnit 4的測試套件中獲得測試?

執行任何形式的文件篩選的最簡單方法是創建自己的JUnit Categories

有關更多詳細信息,請參見此Junit類別教程 ,但基本上,您可以創建自己的類別,命名為所需名稱

public interface GuiTest{ }

public interface DbTest {  }

現在,您可以注釋整個測試類或帶有該類別的單個測試:

@Category(GuiTest.class)
public void myJPanelTest{


    @Test
    public void testFoo(){
        ...
    }

    //look we can have other categories too
    @Test
    @Category(DbTest.class)
    public void accidentalDbTest(){

    }
}

然后,在測試套件中,您可以指定包含或排除與給定類別匹配的測試

@RunWith(Categories.class)
@IncludeCategory(GuiTest.class)
@ExcludeCategory(DbTest.class)  //not sure if we need both but can't hurt
@SuiteClasses( {
     ...
 })
public class GuiTestsOnlySuite{}

使用類別比必須根據臨時命名約定手動過濾測試要好得多,因為這很難記住(並且要確保組中的每個人都遵守命名約定),並且因為類別是類,您可以使用IDE進行搜索/重構/編譯時檢查類別名稱。

我所看到的唯一缺點至少是在我的IDE中,運行測試需要花費更長的時間,因為還有額外的反射工作要做,以確保測試在運行之前符合您的類別過濾條件。

經過一些試驗,我發現了以下解決方案:

SuiteClasses suiteClassesAnnotation = AllTests.class.getAnnotation(SuiteClasses.class);
if (suiteClassesAnnotation == null)
    throw new NullPointerException("This class isn't annotated with @SuiteClasses");
Class<?>[] classesInSuite = suiteClassesAnnotation.value();

基本上,它以與JUnit本身相同的方式獲取類:通過查看注釋並確定其中包含哪些值。

如果最終想要過濾這些類,則dkatzel提供的類別解決方案也是一個不錯的選擇,但是如果您出於其他目的(例如代碼分析)而需要套件中的類列表,這是最簡單,最直接的方法去做吧。

暫無
暫無

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

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