"Executing a test in testNG based on condition"
"Executing a test in testNG based on condition"
我有一个 testNG xml,它将执行一个(一个)测试用例 2 次。每次之间的差异是测试级别参数。所以我必须使用 2 个不同的参数(2 个用户)执行测试用例。
现在我将创建新的 xml(xml 的套件),我将从中调用现有的 xml。我将在套件 xml 中为用户定义一个新参数。
期望是如果套件 xml 参数="user2",那么子 xml 应该只执行一次测试用例,其参数为 user2。
我尝试了 beanshell 脚本,发现它对方法选择器很有用。但我想决定测试级别而不是方法级别。
下面是testNG.xml,它用不同的用户值调用测试用例 2 次。第一次使用 User="USER1" 调用 TestCase,第二次使用 User="USER2".
<?xml version="1.0"?>
<suite name="TestLoad">
<test verbose="10" name="TestForUser1" preserve-order="true">
<parameter name="User" value="USER1"/>
<classes>
<class name="com.dummy.test.TestCase"/>
</classes>
</test>
<test verbose="10" name="TestForUser2" preserve-order="true">
<parameter name="User" value="USER2"/>
<classes>
<class name="com.dummy.test.TestCase"/>
</classes>
</test>
</suite>
下面是 xml 的套件,我将新创建它来调用上面描述的许多 testng.xml。
<?xml version="1.0"?>
<suite name="suiteOfXml">
<parameter name="User" value="USER1"/>
<suite-files>
<suite-file path="TestLoad.xml"/>
<suite-file path="TestStage.xml"/>
</suite-files>
</suite>
期望是这样的:
- 如果 suiteOfXml 有 User="USER1" 那么每个 testNG xml 应该 运行 TestCase 只有一次 User=USER1.
- 如果 suiteOfXml 有 User="USER2" 那么每个 testNG xml 应该 运行 TestCase 只有一次 User=USER2.
- 如果 suiteOfXml 有 User="ALL" 那么每个 testNG xml 应该 运行 TestCase 两次。一次使用 User=USER1,下一次使用 User=USER2。
我无法对测试用例进行任何更改(java class 级别)。条件应仅在 xml 处进行。
请提供可能的解决方案。提前致谢
这是解决此问题所需要做的事情(您不需要一套套件等)
- 创建 TestNG 侦听器接口
org.testng.IAlterSuiteListener
的实现,您基本上可以在其中读取参数值,然后根据它来决定应该创建哪个 <test>
以及它的外观像等等,
- 您创建了一个套件 xml 文件,该文件仅包含可帮助您决定
<test>
应该存在的参数以及对上一步中新创建的侦听器的引用。
应该可以。使用这种方法,您基本上可以完成您列出的所有事情。
示例侦听器的外观如下(在此示例中,我们通过 JVM 参数获取要执行的包,然后基于此构建我们的 <test>
标记)
package com.rationaleemotions.wordpress;
import org.testng.IAlterSuiteListener;
import org.testng.xml.XmlPackage;
import org.testng.xml.XmlSuite;
import org.testng.xml.XmlTest;
import java.util.Collections;
import java.util.List;
public class SimpleSuiteAlterer implements IAlterSuiteListener {
@Override
public void alter(List suites) {
XmlSuite suite = suites.get(0);
XmlTest xmlTest = new XmlTest(suite);
xmlTest.setName("CommandLine_Test");
String packages = System.getProperty("package", suite.getParameter("package"));
XmlPackage xmlPackage = new XmlPackage(packages);
xmlTest.setXmlPackages(Collections.singletonList(xmlPackage));
}
}
下面是套房 xml 的样子
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Package-Suites" verbose="2">
<parameter name="package" value="com.rationaleemotions"/>
<listeners>
<listener class-name="com.rationaleemotions.wordpress.SimpleSuiteAlterer"/>
</listeners>
</suite>
更详细的解释和一些代码示例,请参考我的博客post https://rationaleemotions.com/building_dynamic_testng_suites/
我有一个 testNG xml,它将执行一个(一个)测试用例 2 次。每次之间的差异是测试级别参数。所以我必须使用 2 个不同的参数(2 个用户)执行测试用例。
现在我将创建新的 xml(xml 的套件),我将从中调用现有的 xml。我将在套件 xml 中为用户定义一个新参数。
期望是如果套件 xml 参数="user2",那么子 xml 应该只执行一次测试用例,其参数为 user2。
我尝试了 beanshell 脚本,发现它对方法选择器很有用。但我想决定测试级别而不是方法级别。
下面是testNG.xml,它用不同的用户值调用测试用例 2 次。第一次使用 User="USER1" 调用 TestCase,第二次使用 User="USER2".
<?xml version="1.0"?>
<suite name="TestLoad">
<test verbose="10" name="TestForUser1" preserve-order="true">
<parameter name="User" value="USER1"/>
<classes>
<class name="com.dummy.test.TestCase"/>
</classes>
</test>
<test verbose="10" name="TestForUser2" preserve-order="true">
<parameter name="User" value="USER2"/>
<classes>
<class name="com.dummy.test.TestCase"/>
</classes>
</test>
</suite>
下面是 xml 的套件,我将新创建它来调用上面描述的许多 testng.xml。
<?xml version="1.0"?>
<suite name="suiteOfXml">
<parameter name="User" value="USER1"/>
<suite-files>
<suite-file path="TestLoad.xml"/>
<suite-file path="TestStage.xml"/>
</suite-files>
</suite>
期望是这样的:
- 如果 suiteOfXml 有 User="USER1" 那么每个 testNG xml 应该 运行 TestCase 只有一次 User=USER1.
- 如果 suiteOfXml 有 User="USER2" 那么每个 testNG xml 应该 运行 TestCase 只有一次 User=USER2.
- 如果 suiteOfXml 有 User="ALL" 那么每个 testNG xml 应该 运行 TestCase 两次。一次使用 User=USER1,下一次使用 User=USER2。
我无法对测试用例进行任何更改(java class 级别)。条件应仅在 xml 处进行。
请提供可能的解决方案。提前致谢
这是解决此问题所需要做的事情(您不需要一套套件等)
- 创建 TestNG 侦听器接口
org.testng.IAlterSuiteListener
的实现,您基本上可以在其中读取参数值,然后根据它来决定应该创建哪个<test>
以及它的外观像等等, - 您创建了一个套件 xml 文件,该文件仅包含可帮助您决定
<test>
应该存在的参数以及对上一步中新创建的侦听器的引用。
应该可以。使用这种方法,您基本上可以完成您列出的所有事情。
示例侦听器的外观如下(在此示例中,我们通过 JVM 参数获取要执行的包,然后基于此构建我们的 <test>
标记)
package com.rationaleemotions.wordpress;
import org.testng.IAlterSuiteListener;
import org.testng.xml.XmlPackage;
import org.testng.xml.XmlSuite;
import org.testng.xml.XmlTest;
import java.util.Collections;
import java.util.List;
public class SimpleSuiteAlterer implements IAlterSuiteListener {
@Override
public void alter(List suites) {
XmlSuite suite = suites.get(0);
XmlTest xmlTest = new XmlTest(suite);
xmlTest.setName("CommandLine_Test");
String packages = System.getProperty("package", suite.getParameter("package"));
XmlPackage xmlPackage = new XmlPackage(packages);
xmlTest.setXmlPackages(Collections.singletonList(xmlPackage));
}
}
下面是套房 xml 的样子
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Package-Suites" verbose="2">
<parameter name="package" value="com.rationaleemotions"/>
<listeners>
<listener class-name="com.rationaleemotions.wordpress.SimpleSuiteAlterer"/>
</listeners>
</suite>
更详细的解释和一些代码示例,请参考我的博客post https://rationaleemotions.com/building_dynamic_testng_suites/