2014-09-10 66 views
1

我想在兩種不同的條件下運行一個包含多個測試的類。基本上我有一堆與搜索有關的測試。我正在添加新的搜索策略的新功能,同時希望在兩種配置下運行已編寫的測試。由於我們有多個類,每個類都有多個測試,我想盡可能簡化這個過程。理想情況下,使用數據提供程序在@BeforeClass中執行設置會很棒,這樣在類中的所有測試基本上都會在不同的配置下運行兩次,但看起來並不是這樣。帶有@BeforeClass的TestNG數據提供程序

現在我有:

public class SearchTest1 { 
    @Test(dataProvider = "SearchType") 
    public void test1(SearchType searchType) { 
     setSearchType(searchType); 
     //Do the test1 logic 
    } 

    @Test(dataProvider = "SearchType") 
    public void test2(SearchType searchType) { 
     setSearchType(searchType); 
     //Do the test2 logic 
    } 

    @DataProvider(name = "SearchType") 
    public Object[][] createData() { 
     return new Object[][]{ 
      new Object[] {SearchType.scheme1, SearchType.scheme2} 
     } 
    } 
} 

有沒有更好的方式來做到這一點?

+0

這看起來就像是我一個很好的方式。除了我將數據提供者移動到它自己的類中外,所有人都可以引用同一個數據提供者。 – biziclop 2014-09-10 16:20:00

+0

這實際上是如何安排的。我用這種方式寫了這個文件,以便在這裏閱讀。我應該提到,總共有268個測試有20個課程。我想避免在這些位置的所有268中寫入這些行。 – Clayton 2014-09-10 16:31:31

回答

1

如果您想避免必須使用數據提供程序註釋每種方法,則可以使用Factory來代替。

public class SearchTest1 { 
    private final SearchType searchType; 

    public SearchTest1(SearchType searchType) { 
     this.searchType = searchType; 
    } 

    @Test 
    public void test2() { 
     //Do the test2 logic 
    } 
    ... 
} 

的,工廠類將是:

public class SearchTestFactory { 
    @Factory 
    public Object [] createInstances() { 
     return new Object[] { new SeartchTest1(SearchType.ONE), new SearchTest1(SearchType.TWO) }; 
    } 
} 

查看更多關於這個here

然後你可以有一個工廠枚舉每個測試類或每個單獨的工廠,第一個顯然不太靈活,第二個意味着更多的代碼。

+0

所以這實際上意味着爲這些類中的每一個構造一個構造函數並傳入該類型。我認爲這是有效的。此外,我發現這個[http://stackoverflow.com/questions/520328/can-you-find-all-classes-in-a-package-using-reflection]它指向一種方法來枚舉此包中的所有類以儘量減少代碼量。 – Clayton 2014-09-10 18:00:47

+0

是的,這是一個很好的補充,雖然我可能會將掃描包與來自Reflections庫的MethodAnnotationsScanner掃描程序結合起來,以僅返回包含用@ Test標註的方法的類。 – biziclop 2014-09-10 18:12:49

+0

但是,這將返回一組方法。這是否意味着要通過每種方法並將它們的類添加到列表中以實例化?或者有沒有辦法通過反射來過濾? – Clayton 2014-09-10 18:35:58

0

您可以使用@BeforeClass中的參數。只要(有一些清理)使用

context.getCurrentXmlTest()。getParameters()

@SuppressWarnings("deprecation") 
    @BeforeClass 
    public void setUp(ITestContext context) { 
    System.out.println(context.getCurrentXmlTest().getParameters());  

    } 
相關問題