我正在使用带有TestNG的spring-bot-ccucumber来编写和API测试框架
想了解如何添加标签和功能文件,以执行基于环境选择的
以下是我目前的实现
@CucumberOptions(
features = {"src/test/resources/Features"},
glue = {"als.system.tests.stepDefinations"},
plugin = {"pretty", "html:target/cucumber-html-report.html"}
)
public class CucumberRunnerTests extends AbstractTestNGCucumberTests {
}
基于标签跳过测试,但这不是理想的解决方案,也不想在报告上显示跳过的测试
@Before
public void setup(Scenario scenario) {
if (!scenario.getSourceTagNames().contains("@" + productName.toLowerCase())) {
throw new SkipException("Skipping /Ignoring this scenario as not part of executions !!!");
}
}
有没有干净的方法来实现这一点?
以下是您的操作方法。
- 确保您使用的是最新发布的TestNG版本(截至目前为
7.6.1
,需要JDK11( - 通过实现TestNG接口
com.rationaleemotions.TagBasedInterceptor
构建数据提供程序拦截器 - 使用
<listener>
标记(或(使用服务提供商接口方法连接此侦听器。有关这方面的详细信息,你可以在这里参考官方的TestNG文档(或者(在这里参考我的博客文章
下面是监听器的示例实现
import io.cucumber.testng.PickleWrapper;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Optional;
import org.testng.IDataProviderInterceptor;
import org.testng.IDataProviderMethod;
import org.testng.ITestContext;
import org.testng.ITestNGMethod;
public class TagBasedInterceptor implements IDataProviderInterceptor {
@Override
public Iterator<Object[]> intercept(Iterator<Object[]> original,
IDataProviderMethod dataProviderMethod, ITestNGMethod method, ITestContext iTestContext) {
String rawTag = iTestContext.getCurrentXmlTest().getParameter("tag");
if (rawTag == null || rawTag.trim().isEmpty()) {
return original;
}
List<String> tags = Arrays.asList(rawTag.trim().split(","));
List<Object[]> pruned = new ArrayList<>();
while (original.hasNext()) {
Object[] currentElement = original.next();
Optional<Object> searchResult = findPickleWrapper(currentElement);
if (searchResult.isEmpty()) {
continue;
}
PickleWrapper pickleWrapper = searchResult.map(element -> (PickleWrapper) element).get();
boolean tagPresent = pickleWrapper.getPickle().getTags()
.stream().anyMatch(tags::contains);
if (tagPresent) {
pruned.add(currentElement);
}
}
return pruned.iterator();
}
private Optional<Object> findPickleWrapper(Object[] each) {
return Arrays.stream(each)
.filter(element -> element instanceof PickleWrapper)
.findFirst();
}
}
以下是套件xml看起来像的样子
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
<suite name="Default Suite" verbose="2">
<listeners>
<listener class-name="com.rationaleemotions.TagBasedInterceptor"/>
</listeners>
<parameter name="tag" value="dragon_warrior"/>
<test name="testng_playground">
<classes>
<class name="com.rationaleemotions.CucumberRunnerTests">
</class>
</classes>
</test>
</suite>
以下是我在这个示例中使用的依赖项
<dependencies>
<!-- https://mvnrepository.com/artifact/io.cucumber/cucumber-testng -->
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-testng</artifactId>
<version>7.8.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.cucumber/cucumber-java -->
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-java</artifactId>
<version>7.8.0</version>
</dependency>
</dependencies>
请随意增强监听器,以便它也能读取JVM参数(您可以使用-D
指定(,这样您就可以动态地使用可以通过JVM参数指定为标记(或逗号分隔的标记列表(的东西来覆盖套件xml中的标记值。