在 Cucumber Java 项目的 build.gradle 中从 javaexec 更改为 project.test

问题描述 投票:0回答:1

我想为我的测试框架实现重试选项。我做了一些挖掘,发现该选项可以合并,但不能像我的项目那样。我一直在尝试将其从使用 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 报告的输出,因为它会引发错误,但这现在没什么大不了的。我一直在努力寻找这方面的文档或示例,因此任何建议或示例都会有所帮助。

gradle cucumber build.gradle cucumber-java
1个回答
0
投票

您的问题似乎是您没有在项目设置中的任何地方调用

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 写入的任何文件都将在重新运行期间被覆盖。

© www.soinside.com 2019 - 2024. All rights reserved.