package testngpackage;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.testng.TestNG;
import org.testng.xml.XmlClass;
import org.testng.xml.XmlInclude;
import org.testng.xml.XmlSuite;
import org.testng.xml.XmlTest;
import testpackage2.ReadTestCaseNameFromExcel;
public class TestNG_FS {
public static ArrayList<XmlClass> classes = new ArrayList<XmlClass>();
public static void main(String[] args) throws IOException {
XmlSuite suite = new XmlSuite();
suite.setName("Test Suite");
suite.setThreadCount(10);
XmlTest test = new XmlTest(suite);
test.setName("Test");
test.setPreserveOrder("true");
List<XmlClass> classNames = getClassNames();
int classSize = classNames.size();
System.out.println("Class size: " + classSize);
List<String> methodNames = ReadTestCaseNameFromExcel.readScenarioName(); //This is another class file I am using to fetch the method names from excel document, it is working fine.
int methodSize = methodNames.size();
System.out.println("Total no of methods: " + methodSize);
for (int i = 0; i < classNames.size(); i++) {
XmlClass className = classNames.get(i);
System.out.println("Class Name: " + className);
for (int j = 0; j < methodNames.size(); j++) {
String methodName = methodNames.get(j);
List<XmlInclude> methodsToRun = new ArrayList<XmlInclude>();
methodsToRun.add(new XmlInclude(methodName));
className.setIncludedMethods(methodsToRun);
List<XmlSuite> suites = new ArrayList<XmlSuite>();
suites.add(suite);
test.setXmlClasses(classes);
/*TestNG testng = new TestNG();
testng.setXmlSuites(suites);
testng.run();*/
File file = new File("C:/Temp/TestNG.xml");
FileWriter writer = new FileWriter(file);
writer.write(suite.toXml());
System.out.println(suite.toXml());
writer.close();
}
}
}
public static List<XmlClass> getClassNames() {
XmlClass groupingClass = new XmlClass();
groupingClass.setName("testngpackage.TestNG_Grouping");
classes.add(groupingClass);
XmlClass classDemo1 = new XmlClass();
classDemo1.setName("testngpackage.TestNG_ClassDemo1");
classes.add(classDemo1);
return classes;
}
}
Class size: 2
Total no of methods: 3
Class Name: [XmlClass class=testngpackage.TestNG_Grouping]
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite thread-count="10" name="Test Suite">
<test name="Test">
<classes>
<class name="testngpackage.TestNG_Grouping">
<methods>
<include name="cars_sedan"/>
</methods>
</class> <!-- testngpackage.TestNG_Grouping -->
<class name="testngpackage.TestNG_ClassDemo1"/>
</classes>
</test> <!-- Test -->
</suite> <!-- Test Suite -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite thread-count="10" name="Test Suite">
<test name="Test">
<classes>
<class name="testngpackage.TestNG_Grouping">
<methods>
<include name="train_Local"/>
</methods>
</class> <!-- testngpackage.TestNG_Grouping -->
<class name="testngpackage.TestNG_ClassDemo1"/>
</classes>
</test> <!-- Test -->
</suite> <!-- Test Suite -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite thread-count="10" name="Test Suite">
<test name="Test">
<classes>
<class name="testngpackage.TestNG_Grouping">
<methods>
<include name="flight_Domestic"/>
</methods>
</class> <!-- testngpackage.TestNG_Grouping -->
<class name="testngpackage.TestNG_ClassDemo1"/>
</classes>
</test> <!-- Test -->
</suite> <!-- Test Suite -->
Class Name: [XmlClass class=testngpackage.TestNG_ClassDemo1]
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite thread-count="10" name="Test Suite">
<test name="Test">
<classes>
<class name="testngpackage.TestNG_Grouping">
<methods>
<include name="flight_Domestic"/>
</methods>
</class> <!-- testngpackage.TestNG_Grouping -->
<class name="testngpackage.TestNG_ClassDemo1">
<methods>
<include name="cars_sedan"/>
</methods>
</class> <!-- testngpackage.TestNG_ClassDemo1 -->
</classes>
</test> <!-- Test -->
</suite> <!-- Test Suite -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite thread-count="10" name="Test Suite">
<test name="Test">
<classes>
<class name="testngpackage.TestNG_Grouping">
<methods>
<include name="flight_Domestic"/>
</methods>
</class> <!-- testngpackage.TestNG_Grouping -->
<class name="testngpackage.TestNG_ClassDemo1">
<methods>
<include name="train_Local"/>
</methods>
</class> <!-- testngpackage.TestNG_ClassDemo1 -->
</classes>
</test> <!-- Test -->
</suite> <!-- Test Suite -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite thread-count="10" name="Test Suite">
<test name="Test">
<classes>
<class name="testngpackage.TestNG_Grouping">
<methods>
<include name="flight_Domestic"/>
</methods>
</class> <!-- testngpackage.TestNG_Grouping -->
<class name="testngpackage.TestNG_ClassDemo1">
<methods>
<include name="flight_Domestic"/>
</methods>
</class> <!-- testngpackage.TestNG_ClassDemo1 -->
</classes>
</test> <!-- Test -->
</suite> <!-- Test Suite -->
Class size: 2
Total no of methods: 3
Class Name: [XmlClass class=testngpackage.TestNG_Grouping]
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite thread-count="10" name="Test Suite">
<test name="Test">
<classes>
<class name="testngpackage.TestNG_Grouping"> (First class file - only one class file for testng.xml)
<methods>
<include name="cars_sedan"/> (First method name from excel file)
</methods>
</class> <!-- testngpackage.TestNG_Grouping -->
</classes>
</test> <!-- Test -->
</suite> <!-- Test Suite -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite thread-count="10" name="Test Suite">
<test name="Test">
<classes>
<class name="testngpackage.TestNG_Grouping"> (First class file)
<methods>
<include name="train_Local"/> (Second method name from excel file)
</methods>
</class> <!-- testngpackage.TestNG_Grouping -->
</classes>
</test> <!-- Test -->
</suite> <!-- Test Suite -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite thread-count="10" name="Test Suite">
<test name="Test">
<classes>
<class name="testngpackage.TestNG_Grouping"> (First class file)
<methods>
<include name="flight_Domestic"/> (Third method name from excel file)
</methods>
</class> <!-- testngpackage.TestNG_Grouping -->
</classes>
</test> <!-- Test -->
</suite> <!-- Test Suite -->
Class Name: [XmlClass class=testngpackage.TestNG_ClassDemo1]
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite thread-count="10" name="Test Suite">
<test name="Test">
<classes>
<class name="testngpackage.TestNG_ClassDemo1"> (Second class file)
<methods>
<include name="cars_sedan"/> (First method name from excel file)
</methods>
</class> <!-- testngpackage.TestNG_ClassDemo1 -->
</classes>
</test> <!-- Test -->
</suite> <!-- Test Suite -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite thread-count="10" name="Test Suite">
<test name="Test">
<classes>
<class name="testngpackage.TestNG_ClassDemo1"> (Second class file)
<methods>
<include name="train_Local"/> (Second method name from excel file)
</methods>
</class> <!-- testngpackage.TestNG_ClassDemo1 -->
</classes>
</test> <!-- Test -->
</suite> <!-- Test Suite -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite thread-count="10" name="Test Suite">
<test name="Test">
<classes>
<class name="testngpackage.TestNG_ClassDemo1"> (Second class file)
<methods>
<include name="flight_Domestic"/> (Third method name from excel file)
</methods>
</class> <!-- testngpackage.TestNG_ClassDemo1 -->
</classes>
</test> <!-- Test -->
</suite> <!-- Test Suite -->
The bug lies in your code.
Here’s a working sample.
import org.testng.xml.XmlClass;
import org.testng.xml.XmlInclude;
import org.testng.xml.XmlSuite;
import org.testng.xml.XmlTest;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class TestNG_FS {
public static void main(String[] args) throws IOException {
XmlSuite suite = new XmlSuite();
suite.setName("Test Suite");
suite.setThreadCount(10);
XmlTest test = new XmlTest(suite);
test.setName("Test");
List<XmlClass> xmlClasses = new ArrayList<>();
for (String className : getClassNames()) {
List<String> methods = readScenarioName(className);
//Calling the two arg constructor, so that TestNG doesnt try searching for the classes and load them
//Since I dont have those classes in my project. In real life scenario you would be using only the
//one arg constructor.
XmlClass xmlClass = new XmlClass(className, false);
List<XmlInclude> methodsToRun = new ArrayList<>();
for (String method : methods) {
methodsToRun.add(new XmlInclude(method));
}
xmlClass.setIncludedMethods(methodsToRun);
xmlClasses.add(xmlClass);
}
test.setClasses(xmlClasses);
System.err.println("Printing the suite");
System.err.println(suite.toXml());
}
public static List<String> getClassNames() {
//Replace this with the actual logic of getting hold of the class names.
return Arrays.asList("testngpackage.TestNG_Grouping", "testngpackage.TestNG_ClassDemo1");
}
private static List<String> readScenarioName(String forClass) {
//Include logic here such that you retrieve the list of methods that are applicable for the given class
//by reading up the Excel spreadsheet properly
return Arrays.asList("foo", "bar", "foobar");
}
}
And here’s the output:
Printing the suite
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite thread-count="10" name="Test Suite">
<test name="Test">
<classes>
<class name="testngpackage.TestNG_Grouping">
<methods>
<include name="foo"/>
<include name="bar"/>
<include name="foobar"/>
</methods>
</class> <!-- testngpackage.TestNG_Grouping -->
<class name="testngpackage.TestNG_ClassDemo1">
<methods>
<include name="foo"/>
<include name="bar"/>
<include name="foobar"/>
</methods>
</class> <!-- testngpackage.TestNG_ClassDemo1 -->
</classes>
</test> <!-- Test -->
</suite> <!-- Test Suite -->
Process finished with exit code 0
Thanks & Regards
Krishnan Mahadevan
"All the desirable things in life are either illegal, expensive, fattening or in love with someone else!"
My Scribblings @ http://wakened-cognition.blogspot.com/
My Technical Scribbings @ http://rationaleemotions.wordpress.com/
--
You received this message because you are subscribed to the Google Groups "testng-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to testng-users...@googlegroups.com.
To post to this group, send email to testng...@googlegroups.com.
Visit this group at https://groups.google.com/group/testng-users.
For more options, visit https://groups.google.com/d/optout.
package testngpackage;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import org.testng.TestNG;
import org.testng.xml.XmlClass;
import org.testng.xml.XmlInclude;
import org.testng.xml.XmlSuite;
import org.testng.xml.XmlTest;
import testpackage2.ReadTestCaseNameFromExcel;
public class TestNG_FS {
public static ArrayList<XmlClass> classes = new ArrayList<XmlClass>();
public static void main(String[] args) throws IOException {
XmlSuite suite = new XmlSuite();
suite.setName("Test Suite");
suite.setThreadCount(10);
XmlTest test = new XmlTest(suite);
test.setName("Test");
test.setPreserveOrder("true");
List<XmlClass> xmlClasses = new ArrayList<>();
List<String> methods = ReadTestCaseNameFromExcel.readScenarioName();
for (String className : getClassNames()) {
XmlClass xmlClass = new XmlClass(className, false);
List<XmlInclude> methodsToRun = new ArrayList<>();
for (String method : methods) {
methodsToRun.add(new XmlInclude(method));
}
xmlClass.setIncludedMethods(methodsToRun);
xmlClasses.add(xmlClass);
}
test.setClasses(xmlClasses);
System.out.println("Printing the suite");
System.out.println(suite.toXml());
List<XmlSuite> suites = new ArrayList<XmlSuite>();
suites.add(suite);
TestNG testng = new TestNG();
testng.setXmlSuites(suites);
testng.run();
}
public static List<String> getClassNames() {
return Arrays.asList("testngpackage.TestNG_Grouping", "testngpackage.TestNG_ClassDemo1", "testngpackage.TestNG_ClassDemo2");
}
}
rows: 1000
cols: 26
Header value above the TRUE column: 'Contacts'
TRUE found on the row 2, from the column 0
Printing the suite
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite thread-count="10" name="Test Suite">
<test name="Test">
<classes>
<class name="testngpackage.TestNG_Grouping">
<methods>
<include name="cars_sedan"/>
<include name="train_Local"/>
<include name="flight_Domestic"/>
</methods>
</class> <!-- testngpackage.TestNG_Grouping -->
<class name="testngpackage.TestNG_ClassDemo1">
<methods>
<include name="cars_sedan"/>
<include name="train_Local"/>
<include name="flight_Domestic"/>
</methods>
</class> <!-- testngpackage.TestNG_ClassDemo1 -->
<class name="testngpackage.TestNG_ClassDemo2">
<methods>
<include name="cars_sedan"/>
<include name="train_Local"/>
<include name="flight_Domestic"/>
</methods>
</class> <!-- testngpackage.TestNG_ClassDemo2 -->
</classes>
</test> <!-- Test -->
</suite> <!-- Test Suite -->
[TestNG] Running:
Command line suite
This is Cars Sedan method
This is Flight Domestic method
This is Train Local method
This is Test Method from TestNGClassDemo1
This is Test Method from TestNGClassDemo2
===============================================
Test Suite
Total tests run: 5, Failures: 0, Skips: 0
===============================================
Saran,
In my opinion, it’s a bug. I have logged this as a bug here: https://github.com/cbeust/testng/issues/1507
Feel free to follow that bug.