5

I have an executable JAR which contains all dependencies and test classes. I've confirmed that the main() method is called when I execute the jar. I'm trying to add code to main() so that I can run a specific TestNG test class. From the documentation on TestNG.org this appears to be the way to do it:

    TestListenerAdapter tla = new TestListenerAdapter();
    TestNG testng = new TestNG();
    testng.setTestClasses(new Class[] { com.some.path.tests.MyTests.class });
    testng.addListener(tla);
    testng.run();

My folder structure is typical:

    /src/main/java/Main.java
    /src/test/java/com/some/path/tests/MyTests.java

However when I try to compile it I get this error:

    java: /src/main/java/Main.java:46: package com.some.path.tests does not exist

Is there anyway I can alter my project so that testng.setTestClasses() in main() can access the test class?

TERACytE
  • 7,553
  • 13
  • 75
  • 111

3 Answers3

8

I used the following in my main() method and it worked.

    CommandLineOptions options = new CommandLineOptions();
    JCommander jCommander = new JCommander(options, args);

    XmlSuite suite = new XmlSuite();
    suite.setName("MyTestSuite");
    suite.setParameters(options.convertToMap());

    List<XmlClass> classes = new ArrayList<XmlClass>();
    classes.add(new XmlClass("com.some.path.tests.MyTests"));

    XmlTest test = new XmlTest(suite);
    test.setName("MyTests");
    test.setXmlClasses(classes);

    List<XmlSuite> suites = new ArrayList<XmlSuite>();
    suites.add(suite);

    TestNG testNG = new TestNG();
    testNG.setXmlSuites(suites);
    testNG.run();
TERACytE
  • 7,553
  • 13
  • 75
  • 111
  • I used the above code for running my test cases and it is working fine for single test in case i am using multiple test objects, it is not working Can you please help. – Kanchan Ruia Jul 30 '18 at 11:23
7

You can load your usual xml in main using org.testng.xml.Parser and org.testng.xml.XmlSuite

String xmlFileName = "testng.xml";
List<XmlSuite> suite;
try
{
    suite = (List <XmlSuite>)(new Parser(xmlFileName).parse());
    testng.setXmlSuites(suite);
    testng.run();
}
catch (ParserConfigurationException e)
{
    e.printStackTrace();
}
catch (SAXException e)
{
    e.printStackTrace();
}
catch (IOException e)
{
    e.printStackTrace();
}
KCD
  • 9,873
  • 5
  • 66
  • 75
1

If that is your folder structure, and not just a type, it's wrong. The package name is represented as a folder structure, not one folder with the package name.

So it should be src/test/java/com/some/path/tests/MyTests.java

Also, make sure your test classes are actually in the Jar file. If you're using maven to build the Jar, your test classes will not be included by default.

NilsH
  • 13,705
  • 4
  • 41
  • 59
  • Hi NilsH. I've confirmed that the test classes are in the JAR, and that the folder structure out lined above is actually how is it on disk (one folder named "com.some.path.tests"). I've changed this to the standard, which is what you outlined above, but "com.some.path.tests.MyTests.class" still cannot be found. – TERACytE May 09 '13 at 15:55
  • It does: "package com.some.path.tests" – TERACytE May 09 '13 at 16:34