以编程方式添加黄瓜标记和功能文件



我正在使用带有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中的标记值。

最新更新