selenium - 删除重复的 TestNG Cucumber Runner 文件
问题描述
我已经为我的 selenium 项目实现了 Testng 和 Cucumber。我通过运行我已将它们重定向到 Testng Runner 文件的 Testng.xml 来运行我的测试用例。每个 Runner 文件的唯一区别是链接到 Cucumber 功能场景的 @tag,因此我使用 @sanity @regression 等创建了单独的运行器文件。我想避免创建这么多运行器文件,因为只有 @tag 是一个变量. 我想参数化注释,以便我只有一个运行器文件。
package com.ibm.wce.scbn.cc.runner;
import org.apache.log4j.Logger;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import cucumber.api.CucumberOptions;
import cucumber.api.testng.CucumberFeatureWrapper;
import cucumber.api.testng.TestNGCucumberRunner;
@CucumberOptions(features = "./Features", glue = { "com.ibm.wce.scbn.cc.stepdefinitions" }, tags = { "@Sanity" }
)
public class Sanity {
private TestNGCucumberRunner testNGCucumberRunner;
private static final Logger logger = Logger.getLogger(Sanity.class.getName());
@BeforeClass(alwaysRun = true)
public void setUpClass() throws Exception {
logger.info("initialize TestNG cucumber runner");
testNGCucumberRunner = new TestNGCucumberRunner(this.getClass());
}
@Test(dataProvider = "features")
public void feature(CucumberFeatureWrapper cucumberFeature) {
logger.info("Running Cucumber features in loop");
testNGCucumberRunner.runCucumber(cucumberFeature.getCucumberFeature());
}
@DataProvider
public Object[][] features() {
logger.info("inside data provider");
return testNGCucumberRunner.provideFeatures();
}
@AfterClass(alwaysRun = true)
public void tearDownClass() throws Exception {
logger.info("close cucumber runner");
testNGCucumberRunner.finish();
}
}
Feature: Validating Mailbox response using Json data provider
@Sanity
Scenario: Validate Mailbox Bad Request response
Given We have an ENDPOINT_baseURI "api.baseUrl"
Given I set test report name "Mailbox API-Without required fields(Bad Request)"
And We declare a new Request
And We have Json request "bad_request" in file "api.mailboxJsonPayLoads"
And We have below Header parameters
| Content-Type | application/json |
When We send post request to service "api.mailboxService"
Then The response status code should be Bad Request
<suite name="Suite1">
<test name="Sanity">
<classes>
<class name="com.ibm.wce.scbn.cc.runner.Sanity" />
</classes>
</test> <!-- Test -->
<test name="Regression">
<classes>
<class name="com.ibm.wce.scbn.cc.runner.Regression" />
</classes>
</test> <!-- Test -->
</suite> <!-- Sanity1 -->
解决方案
注释不能参数化。
如果你想完成这件事,那么有一个关于这样做的方法。
以下是您需要遵循的步骤
- 您首先让一个类实现注释接口
cucumber.api.CucumberOptions
- 在此类中进行规定,以便它可以从 JVM 参数中读取要执行的标签,并在
cucumber.api.CucumberOptions#tags
调用时返回它。 - 构建一个实现的 TestNG 侦听器
org.testng.IInvokedMethodListener
- 在此侦听器的
beforeInvocation()
方法中,您将可以访问测试方法并通过它访问它的封闭类。检索类对象。 - 在检索到的类对象上,读取并检查它是否具有注释
cucumber.api.CucumberOptions
。如果它具有注释集,那么您需要对类使用反射,其中您将原始注释对象替换为您在 (1) 中创建的自定义对象 <listeners>
使用标签或通过服务提供者机制将此侦听器连接到您的套件文件中。
那应该注意让您完成您的要求。
以下是我构建的一个开源库中的一些代码示例,它利用了这个概念。
推荐阅读
- python-3.x - Bokeh 上的 HoverTool:时间格式问题(日期显示不正确)x 轴来自 pandas 中的 datetime DF 列
- uitextfield - 为什么光标没有显示在 tvOS 文本字段中
- python - 用 python 函数求解矢量投影
- java - 与休眠事务代码相关的问题
- reactjs - 为什么第一个 Jest 测试会导致第二个测试失败?
- javascript - 来自javascript的新行字符串
- go - Go YAML 解析:必填字段
- swift - 无法在此文件中预览 - SwiftUI Testing.app 可能已崩溃
- sql - 这个查询的输出应该是什么
- sql - 用另一个表的数据替换占位符值