Karunagara Pandi
Karunagara Pandi

Reputation: 644

Create TestNG.xml file dynamically and pass parameter

I have to execute test scripts using dynamic testng.xml file which means I have to create testng.xml file thru code and pass the parameters to the @Test methods pro grammatically.

For that I have created two Java files DynamicTestNG.java which should generate testng.xml file and run SampleClass.java where the @Test method has been written along with the parameters.

DynamicTestNG.java

public class DynamicTestNG {

public void runTestNGTest(Map<String,String> testngParams) {

    //Create an instance on TestNG
     TestNG myTestNG = new TestNG();

    //Create an instance of XML Suite and assign a name for it.
     XmlSuite mySuite = new XmlSuite();
     mySuite.setName("MySuite");

    //Create an instance of XmlTest and assign a name for it.
     XmlTest myTest = new XmlTest(mySuite);
     myTest.setName("MyTest");

    //Add any parameters that you want to set to the Test.
     myTest.setParameters(testngParams);

    //Create a list which can contain the classes that you want to run.
     List<XmlClass> myClasses = new ArrayList<XmlClass> ();
     myClasses.add(new XmlClass("SampleClass"));

    //Assign that to the XmlTest Object created earlier.
     myTest.setXmlClasses(myClasses);

    //Create a list of XmlTests and add the Xmltest you created earlier to it.
     List<XmlTest> myTests = new ArrayList<XmlTest>();
     myTests.add(myTest);

    //add the list of tests to your Suite.
     mySuite.setTests(myTests);

    //Add the suite to the list of suites.
     List<XmlSuite> mySuites = new ArrayList<XmlSuite>();
     mySuites.add(mySuite);

    //Set the list of Suites to the testNG object you created earlier.
     myTestNG.setXmlSuites(mySuites);

    TestListenerAdapter tla = new TestListenerAdapter();
    myTestNG.addListener(tla);

    //invoke run() - this will run your class.
     myTestNG.run();
    }

public static void main (String args[])
{
    DynamicTestNG dt = new DynamicTestNG();

    //This Map can hold your testng Parameters.
     Map<String,String> testngParams = new HashMap<String,String> ();

     testngParams.put("searchtext1", "testdata1");
     testngParams.put("searchtext2", "testdata2");

     dt.runTestNGTest(testngParams);
}

}

And SampleClass.java

  public class SampleClass {

private WebDriver driver;

    @BeforeTest
    public void setUp()
    {
        System.setProperty("webdriver.chrome.driver","C:\\Users\\AK5040691\\Desktop\\IE driver\\chromedriver.exe");
        driver = new ChromeDriver();

        driver.manage().window().maximize();
        driver.navigate().to("http://executeautomation.com/blog/custom-testng-library-for-appium/#more-1562");
    }

    //@Parameters({"searchText1","searchText2"})
    //@Test
    public void searchText(String text1, String text2)
    {
        driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);
        driver.findElement(By.className("search-field")).sendKeys(text1);

        driver.findElement(By.className("search-field")).clear();

        driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);
        driver.findElement(By.className("search-field")).sendKeys(text2);       
    }
}

Its not running. Please let me know the mistake here.

Upvotes: 4

Views: 11072

Answers (2)

uttam
uttam

Reputation: 455

You can instead use the constructor with parameter of class object .

myClasses.add(new XmlClass(SampleClass.class));

Upvotes: 0

Manmohan_singh
Manmohan_singh

Reputation: 1804

You have to uncomment the @Test annotation in your SampleClass file. And if your SampleClass is in a package , then absolute package name + class name is to be specified in this statement.

myClasses.add(new XmlClass("com.some.package.SampleClass"));

Generally TestNG classes have a suffix or prefix labelled "Test" so that surefire plugin can include them in the execution flow, in case if you are using maven.

Upvotes: 4

Related Questions