我想为我的测试框架实现重试选项。我做了一些挖掘,发现该选项可以合并,但不能像我的项目那样。我一直在尝试将其从使用 javaexec 结构转换为使用 project.test,但是当我去调用我的 gradle 任务时,我的测试步骤都没有被调用。我可能忽略了一些东西,我对这种实现方法不太熟悉,所以任何建议都会有帮助。
这是我现有的测试执行代码:
task smoke() {
dependsOn assemble, compileTestJava
doLast { runTests('smoke') }
}
task regression() {
dependsOn assemble, compileTestJava
doLast { runTests('regression') }
}
task newWork() {
dependsOn assemble, compileTestJava
doLast { runTests('newWork') }
}
private ExecResult runTests(String testType) {
javaexec {
mainClass = "io.cucumber.core.cli.Main"
classpath = configurations.cucumberRuntime + sourceSets.main.output + sourceSets.test.output
args = ['--plugin', 'pretty',
'--plugin', 'json:output/reports/report.json',
'--plugin', 'html:output/reports/html',
'--tags', ('@' + testType), '--glue', 'stepDefinitions', 'src/test/resources/features',
'--tags', 'not @disabled']
}
}
这是我尝试实施的:
task smoke() {
dependsOn assemble, compileTestJava
doLast { runTests('smoke') }
}
task regression() {
dependsOn assemble, compileTestJava
doLast { runTests('regression') }
}
task newWork() {
dependsOn assemble, compileTestJava
doLast { runTests('newWork') }
}
private void runTests(String testType) {
project.test {
workingDir = file('src/test/resources')
systemProperty 'cucumber.options', "--tags @${testType} --glue stepDefinitions:src/test/java/stepDefinitions"
retry {
maxRetries = 3
maxFailures = 20
failOnPassedAfterRetry = false
}
reports {
reports.html.required = true
reports.html.destination = file('alice/JavelinTAF/output/reports/html')
}
}
}
我检查了日志并尝试添加调试语句,但无法找到可能出现的问题。似乎根本没有找到测试。构建成功,但未运行任何测试。我还无法在相关部分中添加 .json 报告的输出,因为它会引发错误,但这现在没什么大不了的。我一直在努力寻找这方面的文档或示例,因此任何建议或示例都会有所帮助。
您的问题似乎是您没有在项目设置中的任何地方调用
io.cucumber.core.cli.Main
。我不知道如何在 Gradle 中做到这一点。
但是您可以结合使用 JUnit Platform Suite Engine、Cucumber JUnit Platform 引擎和
test-retry
插件来重新运行测试。
例如修改 cucumber-java-sculptor 项目:
plugins {
java
id("org.gradle.test-retry") version "1.5.8"
}
dependencies {
testImplementation(platform("org.junit:junit-bom:5.10.2"))
testImplementation(platform("io.cucumber:cucumber-bom:7.15.0"))
testImplementation("io.cucumber:cucumber-java")
testImplementation("io.cucumber:cucumber-junit-platform-engine")
testImplementation("org.junit.platform:junit-platform-suite")
testImplementation("org.junit.jupiter:junit-jupiter")
}
repositories {
mavenLocal()
mavenCentral()
}
tasks.withType<Test> {
useJUnitPlatform()
// Work around. Gradle does not include enough information to disambiguate
// between different examples and scenarios.
systemProperty("cucumber.junit-platform.naming-strategy", "long")
retry {
maxRetries.set(2)
}
}
然后
useJUnitPlatform
将导致 JUnit 平台使用从 junit-platform-suite
启动 Suite 引擎,这将执行一个套件:
@Suite
@IncludeEngines("cucumber")
@SelectClasspathResource("io/cucumber/skeleton")
@ConfigurationParameter(key = PLUGIN_PROPERTY_NAME, value = "pretty")
@ConfigurationParameter(key = GLUE_PROPERTY_NAME, value = "io.cucumber.skeleton")
public class RunCucumberTest {
}
然后,套件(再次使用 JUnit 平台)将从
cucumber-junit-platform-engine
启动 Cucumber 引擎并运行测试。
任何失败都会沿着链传递到 JUnit 平台,然后
test-retry
插件可以请求重新运行。
注意:重新运行会再次启动整个链,因此 Cucumber 写入的任何文件都将在重新运行期间被覆盖。