我正在组建一个导航测试套件,用Java / Selenium / TestNG在我公司内部应用程序的每个页面上运用一些功能。
假设我的NavigationTests目录中有一个名为ApplicationsIT的测试类。在这个课程中,我有10个@Tests注释,因此每次运行完整的NavigationTests套件时,所有10个测试都会运行。
但是,为了时间的推移,我是否只能在每个测试类中运行第一个测试?
我试过搞乱“(alwaysRun = false)”标签,但它看起来并不像我预期的那样。
我知道这是一个构造不良的问题/帖子,所以我很乐意澄清我能做的任何事情。
答案 0 :(得分:1)
至少有两种方法可以动态执行此操作。
org.testng.IAnnotationTransformer
的实现。在这里,您基本上实现了接口org.testng.IAnnotationTransformer
,并在其transform()
方法中检查传入的testMethod
java.lang.reflect.Method
对象,以检查其名称是否与您要运行的内容相匹配跑。您可以通过JVM参数指定运行/不运行一堆方法的意图。如果匹配,那么您基本上通过annotation.setEnabled(false)
来禁用测试方法,此处annotation
类型为org.testng.annotations.ITestAnnotation
。您需要使用套件xml文件中的<listeners>
标记通过服务加载程序(或)连接此侦听器。有关一般听众的更多信息,您可以查看我的博客文章here <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="47230879_Suite" parallel="false" verbose="2">
<test name="47230879_test" verbose="2">
<method-selectors>
<method-selector>
<script language="beanshell">
<![CDATA[
try {
input = System.getProperty("methods","");
if (input.trim().isEmpty()) {
return true;
}
methods= input.split(",");
for (int i =0; i< methods.length; i++) {
if (method.getName().equals(methods[i])) {
return true;
}
}
return false;
} catch( e ) {
print(e);
}
]]>
</script>
</method-selector>
</method-selectors>
<classes>
<class name="com.rationaleemotions.stackoverflow.qn47230879.TestclassSample"/>
</classes>
</test>
</suite>
测试类如下所示
package com.rationaleemotions.stackoverflow.qn47230879;
import org.testng.annotations.Test;
public class TestclassSample {
@Test
public void a() {
System.err.println("a()");
}
@Test
public void b() {
System.err.println("b()");
}
@Test
public void c() {
System.err.println("c()");
}
@Test
public void d() {
System.err.println("d()");
}
@Test
public void e() {
System.err.println("e()");
}
}
如果在没有通过JVM参数指定任何方法的情况下运行套件,则所有方法都会运行,但如果通过JVM参数-Dmethods=a,b,c
指定一堆方法名称(例如),则只执行那些方法。