Is TestNG Not Possible To Repeat Class?

柔情痞子 提交于 2021-01-28 11:24:30

问题


I'm trying to build a data driven automation test with TestNG as main framework and apache-poi as data source (using .xlsx file), I'll to use this for selenium purposes.

This is example the selected scenario from excel file:

See image detail here

It can be chosen randomly, according to the user who uses it. The pattern can be purchase all, consume all, or mix.

And the expectations run in the order chosen.

So far this is the code I've created:

Master class

public class Master {
    public static void main(String args[]) throws IOException {
        List<XmlSuite> xmlSuites = new ArrayList<>();
        
        XmlSuite xmlSuite = new XmlSuite();
        xmlSuite.setName("My Suite");
        
        List<XmlTest> xmlTests = new ArrayList<>();
        
        XmlTest xmlTest = new XmlTest(xmlSuite);
        xmlTest.setName("My Test");
        
        Datatable datatable = new Datatable();
        String sourceData = "/path/myFile.xlsx"; 
        int scenarioRowCount = datatable.getRowCount(sourceData, 0);
        
        XmlClass xmlClass = null;
        List<XmlClass> xmlClasses = new ArrayList<>();
        for(int i=1; i<=scenarioRowCount; i++) {
            String scenario = datatable.getCellDatatable(sourceData, 0, i, 0);
            
            Map<String, String> classParam = new HashMap<String, String>();
            classParam.put("scenario", scenario);
            
            if(scenario.contains("purchase")) {
                xmlClass = new XmlClass(Purchase.class);
                xmlClass.setParameters(classParam);
            }else if (scenario.contains("consume")) {
                xmlClass = new XmlClass(Consume.class);
                xmlClass.setParameters(classParam);
            }
            xmlClasses.add(xmlClass);
        }
        
        System.out.println("classes size : " +xmlClasses.size());
        
        xmlTest.setClasses(xmlClasses);
        xmlTests.add(xmlTest);
        
        xmlSuite.setTests(xmlTests);
        xmlSuites.add(xmlSuite);
        
        TestNG testNG = new TestNG();
        testNG.setXmlSuites(xmlSuites);
        testNG.run();
    }
}

Purchase class

public class Purchase {
    @Test
    @Parameters({"scenario"})
    public void purchase(String scenario) {
        System.out.println(scenario);
        
        //selenium code perform here, purchase a package base on selected
        ....
        ....
    }
}

Consume class

public class Consume {
    @Test
    @Parameters({"scenario"})
    public void consume(String scenario) {
        System.out.println(scenario);
        
        //selenium code perform here, consume the quota for a application base on selected
        ....
        ....
    }
}

Output

classes size : 4
purchase quota / 20GB
consume quota / instagram 

===============================================
My Suite
Total tests run: 2, Passes: 2, Failures: 0, Skips: 0
===============================================

I'm use TestNG 7.0.0

pom.xml

Even though there are 4 selected data like the example image above (confirmed by output > classes size : 4), it turns out that the test only runs 2 only, and run the latest choice. It seems to indicate ignoring the same class.

Note : In this question there are only 2 classes, actually there are more than that, just I make it simpler.

Is this design achievable with TestNG (related to running permissions of the same class)?

Or is there any suggestion to use another java test framework?


回答1:


You can create test tag for every class with different parameters.

public class Master {
    public static void main(String args[]) throws IOException {
        List<XmlSuite> xmlSuites = new ArrayList<>();
        
        XmlSuite xmlSuite = new XmlSuite();
        xmlSuite.setName("My Suite");
        
        List<XmlTest> xmlTests = new ArrayList<>();
        
   //     XmlTest xmlTest = new XmlTest(xmlSuite);
   //     xmlTest.setName("My Test");
        
        Datatable datatable = new Datatable();
        String sourceData = "/path/myFile.xlsx"; 
        int scenarioRowCount = datatable.getRowCount(sourceData, 0);
        
      //  XmlClass xmlClass = null;
     //   List<XmlClass> xmlClasses = new ArrayList<>();
        for(int i=1; i<=scenarioRowCount; i++) {
            String scenario = datatable.getCellDatatable(sourceData, 0, i, 0);
        
            XmlClass xmlClass = null;
            List<XmlClass> xmlClasses = new ArrayList<>();

            XmlTest xmlTest = new XmlTest(xmlSuite);
            xmlTest.setName("My Test" + i);
              
            Map<String, String> classParam = new HashMap<String, String>();
            classParam.put("scenario", scenario);
            
            if(scenario.contains("purchase")) {
                xmlClass = new XmlClass(Purchase.class);
                xmlClass.setParameters(classParam);
            }else if (scenario.contains("consume")) {
                xmlClass = new XmlClass(Consume.class);
                xmlClass.setParameters(classParam);
            }
            xmlClasses.add(xmlClass);
            xmlTest.setClasses(xmlClasses);
            xmlTests.add(xmlTest);
        
        }
        
    //    System.out.println("classes size : " +xmlClasses.size());
        
     //   xmlTest.setClasses(xmlClasses);
     //   xmlTests.add(xmlTest);
        
        xmlSuite.setTests(xmlTests);

        System.out.println(xmlSuite.toXml());
        xmlSuites.add(xmlSuite);
        
        TestNG testNG = new TestNG();
        testNG.setXmlSuites(xmlSuites);
        testNG.run();
    }
}

. Just example output.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
<suite name="My Suite">
  <test thread-count="5" name="My Test0">
    <classes>
      <class name="testngtest.TestOne">
        <parameter name="scenario" value="purchase/10"/>
      </class> <!-- testngtest.TestOne -->
    </classes>
  </test> <!-- My Test0 -->
  <test thread-count="5" name="My Test1">
    <classes>
      <class name="testngtest.TestOne">
        <parameter name="scenario" value="purchase/20"/>
      </class> <!-- testngtest.TestOne -->
    </classes>
  </test> <!-- My Test1 -->
  <test thread-count="5" name="My Test2">
    <classes>
      <class name="testngtest.TestTwo">
        <parameter name="scenario" value="consume/10"/>
      </class> <!-- testngtest.TestTwo -->
    </classes>
  </test> <!-- My Test2 -->
  <test thread-count="5" name="My Test3">
    <classes>
      <class name="testngtest.TestTwo">
        <parameter name="scenario" value="consume/40"/>
      </class> <!-- testngtest.TestTwo -->
    </classes>
  </test> <!-- My Test3 -->
</suite> <!-- My Suite -->


TestOnepurchase/10
TestOnepurchase/20
TestOneconsume/10
TestOneconsume/40

===============================================
My Suite
Total tests run: 4, Passes: 4, Failures: 0, Skips: 0
===============================================



回答2:


You need to use Test Objects and set the parallel mode on its container, the XmlSuite to "methods":

https://testng.org/doc/documentation-main.html#parallel-tests



来源:https://stackoverflow.com/questions/65611216/is-testng-not-possible-to-repeat-class

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!