有关在运行时生成testng.xml的更多信息

在这篇文章中,我们将重点介绍一些新的和令人兴奋的事情,我们可以在运行时或以编程方式制作testng.xml。

我们将涵盖以下内容。

首先,让我们创建一个测试类(比如CodekruTest)和一些案例,我们将在整个帖子中使用这些案例,并学习一些令人兴奋的东西。

java 复制代码
package Test;
 
import org.testng.Assert;
import org.testng.annotations.Test;
 
public class CodekruTest {
 
    @Test
    public void test1() {
        System.out.println("Executing test1");
        Assert.assertTrue(true);
    }
 
    @Test
    public void test2() {
        System.out.println("Executing test2");
        Assert.assertTrue(true);
    }
 
    @Test
    public void test3() {
        System.out.println("Executing test3");
        Assert.assertTrue(true);
    }
     
}
如何在运行时创建testng.xml时使用包含的方法功能?

正如你所看到的,我们在CodekruTest类中有三个测试方法(test1、test2和test3),但是如果我们只想执行类中的两个测试方法(test1、test3),那该怎么办呢?我们如何做到这一点?

我们将使用include标记创建一个XML文件,然后将这两个方法包含在include标记中,并忽略第三个方法。

html 复制代码
<suite name="codekru">
    <test name="codekruTest">
        <classes>
            <class name="Test.CodekruTest">
                <methods>
                    <include name="test1" />
                    <include name="test3" />
                </methods>
            </class>
        </classes>
    </test>
</suite>

现在,我们如何以编程方式创建上述XML文件?

我们在XML文件中有一个与include标记等效的标记,它是TestNG中的XmlInclude类。因此,包含测试方法的语法如下所示:

java 复制代码
XmlInclude includedtestMethod1 = new XmlInclude("test1");
XmlInclude includedtestMethod3 = new XmlInclude("test3");

我们将这些方法添加到列表中,然后将该列表进一步添加到类中。

java 复制代码
List<XmlInclude> includedMethodsList = new ArrayList<XmlInclude>();
includedMethodsList.add(includedtestMethod1);
includedMethodsList.add(includedtestMethod3);
xmlClass.setIncludedMethods(includedMethodsList);

上面的XML文件的整个程序将如下所示。

java 复制代码
import java.util.ArrayList;
import java.util.List;
 
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.TestNG;
import org.testng.annotations.Test;
import org.testng.xml.XmlClass;
import org.testng.xml.XmlInclude;
import org.testng.xml.XmlSuite;
import org.testng.xml.XmlTest;
 
public class GenerateAndExecuteXML {
 
    public static void main(String[] args) {
 
        XmlSuite suite = new XmlSuite();
        suite.setName("codekru"); // equivalent of <suite> tag
 
        XmlTest test = new XmlTest(suite);
        test.setName("codekruTest"); // equivalent of <test> tag
 
        List<XmlClass> classes = new ArrayList<XmlClass>(); // equivalent of <classes> tag
        XmlClass xmlClass = new XmlClass("Test.CodekruTest"); // equivalent of <class> tag
 
        // including only two test methods of a class
        XmlInclude includedtestMethod1 = new XmlInclude("test1");
        XmlInclude includedtestMethod3 = new XmlInclude("test3");
        List<XmlInclude> includedMethodsList = new ArrayList<XmlInclude>();
        includedMethodsList.add(includedtestMethod1);
        includedMethodsList.add(includedtestMethod3);
        xmlClass.setIncludedMethods(includedMethodsList);
 
        classes.add(xmlClass);
        test.setXmlClasses(classes);
 
        List<XmlSuite> suites = new ArrayList<XmlSuite>();
        suites.add(suite);
        TestNG tng = new TestNG();
        tng.setXmlSuites(suites);
        tng.run();
 
    }
}

现在,您可以运行上面的程序,它将产生与XML文件本身产生的输出相同的输出。

复制代码
Executing test1
Executing test3

===============================================
codekru
Total tests run: 2, Passes: 2, Failures: 0, Skips: 0
如何在运行时创建testng.xml时使用排除方法功能?

现在,我们想从类中排除一个特定的测试,比如说我们想从类中排除test1方法。我们可以通过使用exclude标记来实现这一点,如下面的XML所示,其中只有test1()方法被添加到exclude标记中。

html 复制代码
<suite name="codekru">
    <test name="codekruTest">
        <classes>
            <class name="Test.CodekruTest">
                <methods>
                    <exclude name="test1"/>
                </methods>
            </class>
        </classes>
    </test>
</suite>

现在的问题是我们如何使用代码来实现同样的事情?TestNG为我们提供了一种简单的方法来完成它,但与XmlInclude类不同的是,我们没有XmlExlude类。相反,我们可以向类传递一个排除方法的列表,如下所示。

java 复制代码
// adding "test1" as an excluded method
List<String> excludedMethods = new ArrayList<String>();
excludedMethods.add("test1");
xmlClass.setExcludedMethods(excludedMethods);

完整代码

java 复制代码
import java.util.ArrayList;
import java.util.List;
 
import org.testng.TestNG;
import org.testng.annotations.Test;
import org.testng.xml.XmlClass;
import org.testng.xml.XmlSuite;
import org.testng.xml.XmlTest;
 
public class Practice {
 
    public static void main(String[] args) {
 
        XmlSuite suite = new XmlSuite();
        suite.setName("codekru"); // equivalent of <suite> tag
 
        XmlTest test = new XmlTest(suite);
        test.setName("codekruTest"); // equivalent of <test> tag
 
        List<XmlClass> classes = new ArrayList<XmlClass>(); // equivalent of <classes> tag
        XmlClass xmlClass = new XmlClass("Test.CodekruTest"); // equivalent of <class> tag
 
        // adding "test1" as an excluded method
        List<String> excludedMethods = new ArrayList<String>();
        excludedMethods.add("test1");
        xmlClass.setExcludedMethods(excludedMethods);
 
        classes.add(xmlClass);
        test.setXmlClasses(classes);
 
        List<XmlSuite> suites = new ArrayList<XmlSuite>();
        suites.add(suite);
        TestNG tng = new TestNG();
        tng.setXmlSuites(suites);
        tng.run();
 
    }
}

现在,我们可以将上面的程序作为一个标准的java应用程序运行,它将产生与等价的XML文件相同的输出。

复制代码
Executing test2
Executing test3

===============================================
codekru
Total tests run: 2, Passes: 2, Failures: 0, Skips: 0
现在,如何使用程序将报告的输出目录更改为特定目录?

使用TestNG也相对容易,因为它为我们提供了一种方法来做同样的事情。

java 复制代码
TestNG tng = new TestNG();
tng.setOutputDirectory("D:\\Test");

完整代码:

java 复制代码
import java.util.ArrayList;
import java.util.List;
 
import org.testng.TestNG;
import org.testng.annotations.Test;
import org.testng.xml.XmlClass;
import org.testng.xml.XmlSuite;
import org.testng.xml.XmlTest;
 
public class Practice {
 
    public static void main(String[] args) {
 
        XmlSuite suite = new XmlSuite();
        suite.setName("codekru"); // equivalent of <suite> tag
 
        XmlTest test = new XmlTest(suite);
        test.setName("codekruTest"); // equivalent of <test> tag
 
        List<XmlClass> classes = new ArrayList<XmlClass>(); // equivalent of <classes> tag
        XmlClass xmlClass = new XmlClass("Test.CodekruTest"); // equivalent of <class> tag
 
        classes.add(xmlClass);
        test.setXmlClasses(classes);
 
        List<XmlSuite> suites = new ArrayList<XmlSuite>();
        suites.add(suite);
        TestNG tng = new TestNG();
        tng.setOutputDirectory("D:\\Test"); // pass the path of the directory in the argument where you want to store
                            // the reports 
        tng.setXmlSuites(suites);
        tng.run();
 
    }
}

现在,类中的所有测试方法都将运行,测试报告保存在D:\Test文件夹中,而不是默认的测试输出文件夹中。

我们如何以编程方式并行运行案例?

让我们假设我们想要并行运行一个类的方法。然后下面的XML文件可以帮助我们实现相同的。

html 复制代码
<suite name="codekru">
    <test name="codekruTest" parallel = "methods">
        <classes >
            <class name="Test.CodekruTest" >
            </class>
        </classes>
    </test>
</suite>

要使用该程序执行相同的操作,我们只需在代码中添加以下行。

java 复制代码
test.setParallel(ParallelMode.METHODS);

在这里,EschelMode是一个枚举。

现在,我们的整个程序将如下所示。

java 复制代码
public class GenerateXmlAndExecuteAtRuntime {
     
    public static void main(String[] args) {
        XmlSuite suite = new XmlSuite();
        suite.setName("codekru"); // this means <suite name = "codekru">
 
        XmlTest test = new XmlTest(suite);
        test.setName("codekru"); // this means <test name = "codekru">
        List<XmlClass> classes = new ArrayList<XmlClass>(); // <classes>
        classes.add(new XmlClass("Test.CodekruTest")); // this means <class name = "Test.CodekruTest">
        test.setXmlClasses(classes);
        test.setParallel(ParallelMode.METHODS);
 
        List<XmlSuite> suites = new ArrayList<XmlSuite>();
        suites.add(suite);
        TestNG testng = new TestNG();
        testng.setXmlSuites(suites);
        testng.run();
    }
}

产出-

复制代码
Executing test3
Executing test1
Executing test2

===============================================
codekru
Total tests run: 3, Passes: 3, Failures: 0, Skips: 0

如果我们想并行运行我们的类,我们可以使用下面的行。

|---|-------------------------------------------|
| 1 | test.setParallel(ParallelMode.METHODS); |

相关推荐
荒诞硬汉8 分钟前
JavaBean相关补充
java·开发语言
提笔忘字的帝国22 分钟前
【教程】macOS 如何完全卸载 Java 开发环境
java·开发语言·macos
2501_9418824839 分钟前
从灰度发布到流量切分的互联网工程语法控制与多语言实现实践思路随笔分享
java·开发语言
華勳全栈1 小时前
两天开发完成智能体平台
java·spring·go
alonewolf_991 小时前
Spring MVC重点功能底层源码深度解析
java·spring·mvc
沛沛老爹1 小时前
Java泛型擦除:原理、实践与应对策略
java·开发语言·人工智能·企业开发·发展趋势·技术原理
专注_每天进步一点点1 小时前
【java开发】写接口文档的札记
java·开发语言
代码方舟1 小时前
Java企业级实战:对接天远名下车辆数量查询API构建自动化风控中台
java·大数据·开发语言·自动化
zgl_200537791 小时前
ZGLanguage 解析SQL数据血缘 之 标识提取SQL语句中的目标表
java·大数据·数据库·数据仓库·hadoop·sql·源代码管理
liwulin05061 小时前
【JAVA】创建一个不需要依赖的websocket服务器接收音频文件
java·服务器·websocket