2014-01-07 101 views
1

在JUnit 3中,我可以測試套件下面的代碼中獲得所有的測試:如何獲得測試集合在一個JUnit 4測試套件

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

但是,我無法找到在JUnit 4中這樣做的等效方法。類不再有.suite()方法;他們只需使用@Suite註釋。除了Suite class不再有tests()方法以外,這不會成爲問題。有一個children()方法,但是它會返回一個Runners列表,這似乎與我尋找的原因不同。

那麼如何才能得到一個測試套件中的測試JUnit 4中,像我可以用JUnit 3?

+0

也許你可以[掃描註釋類新] [1]。 [1]:http://stackoverflow.com/questions/4107498/how-to-build-a-list-of-classes-annotated-with-my-custom-annotation – aalku

+0

爲什麼你想測試?針對不同的用例有不同的解決方案。不同的跑步者也可以動態地生成新的測試,因此可能很難獲得完整的Junit 4測試列表,直到您真正運行它們。 – dkatzel

+0

@Dkatzel我正在研究一些遺留代碼,用於分析JUnit套件的構成並檢查正確的測試是否在正確的套件中(例如,確保有人沒有在數據庫套件中加入GUI測試)。也許是不必要的迂腐,但unfortuantely我沒有在任何權現在說,所以我試圖找到相當於現有代碼的JUnit 4。 – Thunderforge

回答

1

有點實驗後,我發現了以下解決方案:

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提供的類別解決方案也是一個不錯的選擇,但是如果您需要套件中的類的列表以用於代碼分析等其他目的,那麼這是最簡單的和最直接的方式來做到這一點。

0

執行任何種類的filering的最簡單的方法是創建你自己的JUnit Categories

請參閱本Junit Category tutorial的更多細節,但基本上,你創建自己的類別命名爲任何你想要的

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,測試需要較長的時間來運行,因爲有多餘的反射的工作要做,以確保測試運行之前符合您的類別過濾標準的唯一缺點。