2012-08-09 25 views
4

我有一個閱讀文本文件的需求,該文件包含所有testmethods列表中的yes/no值,併爲TestCase類選擇「yes」標記的testmethods,並執行在Junit。擴展Junit ParentRunner類以過濾測試方法

所以我寫了一個腳本來讀取該文件,並把它在地圖< TestCaseName,ArrayList_ofEnabledTestMethods >組。爲了運行,我發現一個選項是使用Assume.assumeTrue()

但我想嘗試,而不是每個測試方法之前書面方式多餘的線條一些otherway ......,於是,我就寫了一個可定製的運行(ABCSuite延伸ParentRunner),並計劃在我的TestSuite使用它文件象下面這樣:

import org.junit.runner.RunWith; 
import org.junit.runners.Suite; 

@RunWith(ABCSuite.class) 
@Suite.SuiteClasses({TestCalc.class}) 
public class BatTest{ 

} 

這裏TestCalc.class包含了所有的測試方法,其中一些被標記爲「是」,在前面提到的文本文件。

請讓我知道如何使用擴展ParentRunner類/ Junit庫來實現這一點。如果有任何好的教程是有或之前,請解決這個任何鏈接..分享

+0

您的測試方法列表是方法名稱(test1)還是類名稱+方法名稱(com.mycompany.foo.MyClass#test1)的列表? – 2012-08-10 07:32:57

+0

在地圖 Som 2012-08-10 07:59:38

+0

@Mthethew請忽略我之前的評論...以下是您的文章的回覆...在地圖<** TestCaseName,ArrayList_ofEnabledTestMethods **> ** ArrayList_ofEnabledTestMethods **包含只測試方法名稱,如** test1 ** ..(不是類名稱+方法名稱) – Som 2012-08-10 08:07:29

回答

3

您可以通過擴展BlockJUnit4ClassRunner做到這一點:

public class FilterRunner extends BlockJUnit4ClassRunner { 
    private List<String> testsToRun = Arrays.asList(new String[] { "test1" }); 

    public FilterRunner(Class<?> klass) throws InitializationError { 
    super(klass); 
    } 

    @Override 
    protected void runChild(final FrameworkMethod method, RunNotifier notifier) { 
    Description description= describeChild(method); 
    if (method.getAnnotation(Ignore.class) != null || !testsToRun.contains(method.getName())) { 
     notifier.fireTestIgnored(description); 
    } else { 
     runLeaf(methodBlock(method), description, notifier); 
    } 
    } 
} 

您可以填寫testsToRun只要你喜歡。以上將標記其他測試爲忽略。您可以使用此類似:

@RunWith(Suite.class) 
@SuiteClasses({Class1Test.class}) 
public class TestSuite { 
} 

@RunWith(FilterRunner.class) 
public class Class1Test { 
    @Test 
    public void test1() { 
    System.out.println("test1"); 
    } 

    @Test 
    public void test2() { 
    System.out.println("test2"); 
    } 
} 

這將產生以下的輸出:

test1 

如果你不想給@FilterRunner添加到每個測試類,看看我的回答對如何定義JUnit method rule in a suite?

+0

Matthew ..感謝您的輸入..但我想運行FilterRunner不是針對每個測試類,而是針對套件級,所以你的上面[鏈接] JUnit方法規則在一個套件中?我試過了,發現它期望套件本身有一個Test方法,它只運行給定的例子(擴展了BlockJUnit4ClassRunner),我修改了測試套,很少在裏面添加@Test方法,否則它會給出初始化錯誤 – Som 2012-08-11 15:05:25

+0

讓我知道@FilterRunner的解決方案將如何適用於它所包含的整個套件....更多的是一個測試類,他們有很多測試方法......以及那些有選擇地運行的測試類(示例** map **)... – Som 2012-08-11 15:10:19

2

執行此操作的JUnit方法將執行Filter。它必須通過執行FilterableRunner實例化。過濾器通過測試樹遞歸地應用。所以你只需要在基礎套件中應用一次該過濾器。

您需要擴展跑步者並在構造器中應用該過濾器。爲了使事情更加靈活,您可以配置應與註釋一起應用的過濾器。

我有相同的要求,並且工作得很好。