2016-08-08 13 views
1

Es scheint, ich habe versucht, alle möglichen Wege, um dies zu erreichen, aber kein Glück. Ich habe einen komplexen Code in DataProvider (es sammelt wirklich Daten in einer komplexen Weise), die ich schließlich von CI parametrisiert werden soll.TestNG: Parameter an DataProvider von Maven übergeben

Die erste Frage hier ist, wie man auch lesen Parameter in DataProvider.

1 Eine Möglichkeit ist, Parameter von testng.xml diese Weise zu erhalten:

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

Aber dies das Problem nicht lösen, da XML-Datei dann statisch sein muss, und ich möchte Parameter zu übergeben es von Maven.

2 Der andere Weg ist Parameter von @Factory in meinem Fall zu lesen:

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

Wo @Factory ist:

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

Es funktioniert auch, aber wieder, löst nicht die Problem, weil jetzt Parameter in Java-Testdateien codiert werden müssen und meine @Factory @DataProvider für sich selbst verwendet und Parameter von Maven nicht implizit empfangen kann.

Zusätzlich habe ich andere Testparameter, die von Maven übergeben werden, aber sie werden nur in @Test-Tests verwendet, nicht in DataProvider, und @BeforeSuite empfängt sie erfolgreich.

Ich werde zu vereinfachen versuchen:

Ich rufe Maven

-Dtestname=signUp -Dmyparam=1 test 

und ich möchte, dass meine DataProvider- diesen Wert von Dmyparam zu empfangen und es verwenden, um Daten zu sammeln. Alles, was ich erreicht habe, ist, diese Daten mit @BeforeSuite zu empfangen und global zu setzen, aber das Problem ist, dass DataProvider heißt, bevor die Daten gesetzt werden.

+0

Anstatt param, haben Sie 'System.getProperty (" myparam ")' in Ihrer Fabrik versucht? – juherr

+1

Es sieht so aus, als ob das, was Sie fragen, hier beantwortet wurde: http://stackoverflow.com/questions/13245411/how-to-pass-java-code-a-parameter-from-maven-for-testing – danmitch

+0

@JulienHerr Dieser Kommentar hat meinen Tag gerettet, es funktioniert wirklich, Sie können es als Antwort –

Antwort

2

-D setzt eine Systemeigenschaft.

Sie können es in Ihrem Code mit System.getProperty("MyParam") bekommen.

0

Alles, was ich erreicht diese Daten mit @BeforeSuite empfängt und sie global einstellen, aber das Problem ist DataProvider- vor genannt werden die Daten festgelegt ist.

Ich kann das nicht bestätigen.

Wenn Sie sind in der Lage, die Datenprovider in der Testklasse zu erklären, könnten Sie haben TestNG Suite Parameter in ein @BeforeSuite Verfahren injizieren, die dann die Werte als Instanzfelder speichert:

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); 
    } 

} 

Mit diesem suite.xml und die VM-Argumente -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> 

Er druckt:

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

Sie können auch TestNG haben Parameter in eine Fabrik injizieren:

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; 
    } 

    // ... 
} 

seit mindestens TestNG 6.9.10 und neuere Dies funktioniert:

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; 
    } 

} 

Ihr Test, um die Daten auf diese Weise erhalten könnte.

Verwandte Themen