如何仅通过TestNG执行Test类中的第一个测试
问题描述:
我正在组合一个导航测试套件,以在我公司的内部应用程序的每个页面上使用Java/Selenium/TestNG行使一点功能。如何仅通过TestNG执行Test类中的第一个测试
假设我的NavigationTests目录中有一个名为ApplicationsIT的测试类。在这个类中,我有10个@Tests注释,所以每次运行完整的NavigationTests套件时,都会运行10个测试。
但是,为了时间的缘故,我有没有办法让每个测试班都只进行第一次测试?
我试图搞乱“(alwaysRun = false)”标签,但它似乎没有工作,我的预期。
我知道这是一个构造不好的问题/帖子,所以我很乐意澄清我能做的任何事情。
答
动态地做到这一点至少有两种方法。
- 使用
org.testng.IAnnotationTransformer
的实现。在这里,您基本上实现了接口org.testng.IAnnotationTransformer
,并在其transform()
方法中检查传入的对象,以检查其名称是否与要运行或未运行的对象匹配。您可以通过JVM参数指定运行/不运行一堆方法的意图。如果有匹配,那么你基本上通过annotation.setEnabled(false)
在这里禁用测试方法annotation
是org.testng.annotations.ITestAnnotation
类型。您需要通过服务加载器(或)在套件xml文件中使用<listeners>
标签连接此侦听器。有关一般听众的更多信息,你可以看看我的博客文章here - 另一种选择是利用beanshell。下面的示例展示了如何使用beanshell。您可以从我的博客文章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.*.qn47230879.TestclassSample"/>
</classes>
</test>
</suite>
测试类看起来像下面
package com.rationaleemotions.*.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
(例如),那么只有这些方法得到执行。
这实在是一个TestNG问题,与Selenium无关。我会删除标签,以免混淆他人。你看过TestNG文档吗?我相信它会描述至少有一种方法来做到这一点。 – JeffC