2016-08-08 79 views
1

傳遞參數的DataProvider看來我嘗試了所有可能的方式來實現這一點,但沒有運氣。我在DataProvider中有一個複雜的代碼(它真的以複雜的方式收集數據),我希望最終通過CI進行參數化。TestNG的:從Maven的

這裏的第一個問題是如何在DataProvider中甚至讀取參數。

1的一種方法是得到的testng.xml參數是這樣的:

String lolo = context.getCurrentXmlTest().getParameter("testcases"); 

但是,這並不能解決問題,因爲.xml文件必須是靜態的話,我想傳遞參數它來自Maven。

2另一種方式是在我的情況下讀取@Factory參數:

String testCaseDataFilename = (method.getAnnotation(Factory.class)).parameters()[0]; 

其中@Factory是:

@Factory(dataProvider="dataProviderMethod", parameters = {"authentication-testcases.json"}) 

它也能工作,但同樣,沒有解決不了的的問題,因爲現在的參數必須在Java測試文件中harcoded,我@Factory使用@dataProvider的本身,它不能從Maven的接收參數含蓄。

此外,我還有其他的測試參數,由Maven的過去了,但他們在@Test測試,而不是隻DataProvider的使用,@BeforeSuite成功接收它們。

我會盡量簡化:

我打電話行家

-Dtestname=signUp -Dmyparam=1 test 

,我想我的DataProvider接收Dmyparam的這個值,並用它來收集數據。我所取得的接收與@BeforeSuite這個數據和全球設置它,但問題是dataProvider是叫之前設置的數據。

+0

相反PARAM的,你有沒有嘗試'System.getProperty( 「myparam」)在您的工廠'? – juherr

+1

它看起來像你問已經在這裏找到答案: http://stackoverflow.com/questions/13245411/how-to-pass-java-code-a-parameter-from-maven-for-testing – danmitch

+0

@JulienHerr此評論救了我的一天,它真的有用,U可以發佈它作爲一個aswer –

回答

2

-D是設置一個系統屬性。

您可以用System.getProperty("MyParam")得到它在你的代碼。

0

我所取得的接收與@BeforeSuite這個數據和全球設置它,但問題是dataProvider是叫之前設置的數據。

我無法證實這一點。

如果你能測試類內聲明的DataProvider你可以有TestNG的注入套參數爲@BeforeSuite方法,然後存儲值實例字段:

public class Testcase3 { 

    String foo; 
    String bar; 
    String baz; 

    // Runs before the dataprovider 
    @BeforeSuite 
    // Injected from suite.xml and VM arguments 
    @Parameters({"foo", "bar", "baz"}) 
    public void init(String foo, String bar, String baz) { 
     this.foo = foo; 
     this.bar = bar; 
     this.baz = baz; 
    } 

    @DataProvider(name="foodp") 
    public Object[][] foodp(){ 
     return new Object[][] { 
      new String[] { "1: " + foo, "2: " + bar, "3: " + baz } 
     }; 
    } 

    // Injected from the data provider 
    @Test(dataProvider="foodp") 
    public void testFoo(String str1, String str2, String str3) { 
     System.out.println("# test: str1=" + str1); 
     System.out.println("# test: str2=" + str2); 
     System.out.println("# test: str3=" + str3); 
    } 

} 

有了這個suite.xml和VM參數-Dbaz=buzz

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > 
<suite name="defaultsuite"> 
    <parameter name="foo" value="moo" /> 
    <parameter name="bar" value="far" /> 
    <test name="alltests"> 
     <classes> 
      <class name="testng.tests.Testcase3"></class> 
     </classes> 
    </test> 
</suite> 

它打印:

# test: str1=1: moo 
# test: str2=2: far 
# test: str3=3: buzz 

您還可以使TestNG的參數注入到工廠:

public class TestFactory { 

    @Factory 
    @Parameters({"foo", "bar", "baz"}) 
    public Object[] createTestInstances(String foo, String bar, String baz) { 
     Object[] testcases = new Object[1]; 

     testcases[0] = new Testcase4(); 
     ((Testcase4) testcases[0]).initDataProvider(foo, bar, baz); 

     return testcases; 
    } 

} 

你的測試能接收到的數據是這樣的:

public class Testcase4 { 

    String foo; 
    String bar; 
    String baz; 

    public void initDataProvider(String foo, String bar, String baz) { 
     this.foo = foo; 
     this.bar = bar; 
     this.baz = baz; 
    } 

    // ... 
} 

這工作,因爲至少TestNG的6.9.10和更新。

相關問題