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

Posted

技术标签:

【中文标题】TestNG:如何以编程方式运行自定义 TestNG.XML 文件【英文标题】:TestNG: how do I run a custom TestNG.XML File programmatically 【发布时间】:2015-03-09 12:52:13 【问题描述】:

我浏览了几个不同的线程和网站(以及 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();

注意:Test 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 方法将该列表添加到 TestNGs 的套件列表中。 看起来像这样:

        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 文件? 我通过 TimerTask 使用 ->>> java.util.Timer 触发它们 顺便说一句:我改为使用 Quartz 调度程序。我尝试用 jenkins 运行它,但它不适用于 Windows 7 和受限的企业设置。 我想做类似的事情,我正在创建一个 GUI,让您从 Windows 文件资源管理器中选择一个 XML 文件,然后将 XML 的路径保存到一个字符串中。我已经使用了你更新的解决方案,但我仍然收到一个错误,说它找不到我的测试类 通过这种方式很难排除您的代码存在的问题。你为什么不创建一个线程,发布你的代码并在这里引用它。 【参考方案1】:
public static void main(String[] args) 
    TestNG testng = new TestNG();
    List<String> suites = Lists.newArrayList();
    suites.add(".//TestNG.xml");
    testng.setTestSuites(suites);
    testng.run();

【讨论】:

【参考方案2】:

对于虚拟 xml 示例,您错过了将类添加到测试和测试到您的套件。

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

【讨论】:

以上是关于TestNG:如何以编程方式运行自定义 TestNG.XML 文件的主要内容,如果未能解决你的问题,请参考以下文章

TestNG学习随笔

TestNG 报告中的自定义测试方法名称

TestNG - 如何在 testng 自定义电子邮件报告中打印运行时 testng 参数?

在 xib 中以编程方式自定义 UIView

如何以编程方式调整自定义视图的大小?

iOS - 如何以编程方式为控件设置自定义类