问题
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