TestNG:如何通过编程方式运行自定义的TestNG.XML文件

5

我浏览了几个不同的帖子和网站(以及TestNG API),寻找如何运行和创建自定义测试。我没有找到(或者没有理解)如何在程序中以编程方式运行自定义testng.xml(测试套件)。

我已经创建了一个看起来像这样的testng.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<suite name="The Login Suite'" verbose="1" >
  <test name="Some login check" >
    <classes>
      <class name="tests.first_login"/>
    </classes>
 </test>
   <test name="Another login check" >
    <classes>
      <class name="tests.second_login"/>
    </classes>
 </test>
</suite>

我知道可以在Eclipse之外执行我的测试套件,但我不想这样做。为什么?因为我正在通过调度程序运行测试。所以我需要一个可配置的testng.xml文件。

我尝试使用类似于以下代码的代码生成虚拟XML测试套件:

            TestListenerAdapter tla = new TestListenerAdapter();
                TestNG tng = new TestNG();
                tng.addListener(tla);

                XmlSuite loginSuite = new XmlSuite();
                loginSuite.setName("The Login Suite");

                    XmlTest first_test = new XmlTest();
                    first_test.setName("Some login check");
                    first_test.setSuite(loginSuite);

                List<XmlClass> fistlogin_classes = new ArrayList<XmlClass>();
                fistlogin_classes.add(new XmlClass("tests.fist_login"));

                    XmlTest second_test = new XmlTest();
                    second_test.setName("Another login check");
                    loginSuite.addTest(SOEtest);

                List<XmlClass> secondlogin_classes = new ArrayList<XmlClass>();
                secondlogin_classes.add(new XmlClass("tests.second_login"));



                List<XmlSuite> suites = new ArrayList<XmlSuite>();
                suites.add(loginSuite);
                tng.setXmlSuites(suites);

                tng.run();

但是,你猜怎么着……这也行不通。TestNg似乎找不到包含测试方法的类。代码成功执行,但没有运行任何测试,也没有失败或跳过任何测试。
我尝试的另一件事是将testng.xml导出为*.jar文件,并定义它的路径,看起来像这样:
                TestListenerAdapter tla = new TestListenerAdapter();
                TestNG tng = new TestNG();
                tng.setXmlPathInJar("tests.jar");
                tng.addListener(tla);
                tng.run();

注意:测试测试,jar位于项目的根目录。像<.../loginproject/tests.jar>这样。
到目前为止,我唯一做好的事情就是这个:
                TestListenerAdapter tla = new TestListenerAdapter();
                TestNG tng = new TestNG();

                tng.setDefaultTestName("Login check");
                tng.setDefaultSuiteName("The Login suite");
                tng.setTestClasses(new Class[] { fist_login.class });

                tng.addListener(tla);
                tng.run();

然而,这并不符合我的项目要求,我的要求是创建一个像上面XML中显示的测试套件。 我需要1个测试套件,其中包含不同的登录测试,每个测试都在自己的类中实现。 另外最后一个解决方案的问题是我添加到列表中的每个类都将被立即执行,但我需要在执行另一个之后运行它们。
我更喜欢的解决方案是允许我直接执行自定义testng.xml,但如果有人告诉我我在创建虚拟XML文件时做错了什么,我也会很高兴。
预先感谢大家的帮助。
更新和解决方案: 我已经想出了解决方案,将我的套件文件添加到列表中,并通过API方法将该列表添加到TestNG的套件列表中。具体如下:
        List<String> testFilesList = new ArrayList<String>();
        testFilesList.add("./testng.xml"); //test suite resides in the working directory's root folder
        **testng.setTestSuites(testFilesList);** //you can addd multiple suites either here by adding multiple files or include all suites needed in the testng.xml file 
        testng.setUseDefaultListeners(false);
        testng.addListener(htmlRep); 
        testng.run();

你是如何从调度程序触发测试的?你是使用Maven和Jenkins还是Jar文件? - niharika_neo
我正在使用 java.util.Timer 通过 TimerTask 触发它们。 - Christoph Zabinski
顺便说一下:我改用了Quartz调度程序。我尝试在Jenkins上运行它,但在Windows 7和受限制的企业设置下效果不佳。 - Christoph Zabinski
我正在尝试做类似的事情,我正在创建一个GUI,让您从Windows文件浏览器中选择一个XML文件,然后将XML的路径保存到一个字符串中。我已经使用了您更新的解决方案,但仍然返回一个错误,说它找不到我的测试类。 - colin
这种方式很难排除您代码中的问题。为什么不创建一个线程,发布您的代码,并在此处放置一个引用呢? - Christoph Zabinski
2个回答

6
public static void main(String[] args) {
    TestNG testng = new TestNG();
    List<String> suites = Lists.newArrayList();
    suites.add(".//TestNG.xml");
    testng.setTestSuites(suites);
    testng.run();
}

0
通过虚拟 XML 示例,您忘记将类添加到测试中,也忘记将测试添加到套件中。

i.e

first_test.getClasses().addAll(fistlogin_classes);
loginSuite.addTest(first_test);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接