如何将Gradle命令行参数传递至Cucumber的步骤定义中?
问题描述
我想在Cucumber的步骤定义文件中获取Gradle传入的命令行参数,类似Maven里执行mvn test -Dbrowser=firefox的方式,然后在Java步骤定义里通过以下代码获取参数:
String browser = System.getProperty("browser", "chrome");
我的build.gradle内容如下:
plugins { id 'application' } repositories { mavenCentral() } application { mainClass = 'ts.api.automation.App' } configurations { cucumberRuntime { extendsFrom testImplementation } } task cucumber() { dependsOn assemble, testClasses doLast { javaexec { main = "io.cucumber.core.cli.Main" classpath = configurations.cucumberRuntime + sourceSets.main.output + sourceSets.test.output args = ['--plugin', 'pretty', '--glue', 'smartconnect.steps.grab', 'src/test/java/smartconnect/features/grab'] } } } task runTests(type: JavaExec, dependsOn: 'classes') { main = 'org.testng.TestNG' classpath = files("./src/test/resources", project.sourceSets.main.runtimeClasspath, project.sourceSets.test.runtimeClasspath) args = ["-parallel", "methods", "-threadcount", "1", "-d", "./build/test-output", "./src/test/resources/TestNG.xml"] }
请问该如何通过Gradle从命令行获取参数并传递到我的步骤定义文件中?我也可以在基础Java类中访问这些参数。
解决方案
要让Gradle把命令行传入的系统属性传递给Java代码,需要在对应的Gradle任务中配置systemProperties,实现命令行参数的透传。
1. 配置Cucumber任务
修改cucumber任务内的javaexec块,添加系统属性透传配置,这样就能把命令行传入的所有系统属性传递给Cucumber的Java进程:
task cucumber() { dependsOn assemble, testClasses doLast { javaexec { main = "io.cucumber.core.cli.Main" classpath = configurations.cucumberRuntime + sourceSets.main.output + sourceSets.test.output args = ['--plugin', 'pretty', '--glue', 'smartconnect.steps.grab', 'src/test/java/smartconnect/features/grab'] // 透传所有命令行传入的系统属性 systemProperties = System.getProperties() // 若只需传递指定属性,比如仅传递browser: // systemProperties['browser'] = System.getProperty('browser', 'chrome') } } }
执行Cucumber任务时,通过-D参数传入属性:
./gradlew cucumber -Dbrowser=firefox
2. 配置TestNG的runTests任务
如果你的TestNG测试也需要获取这些参数,同样修改runTests任务,添加系统属性透传:
task runTests(type: JavaExec, dependsOn: 'classes') { main = 'org.testng.TestNG' classpath = files("./src/test/resources", project.sourceSets.main.runtimeClasspath, project.sourceSets.test.runtimeClasspath) args = ["-parallel", "methods", "-threadcount", "1", "-d", "./build/test-output", "./src/test/resources/TestNG.xml"] // 透传系统属性 systemProperties = System.getProperties() }
执行TestNG任务时同样用-D传入参数:
./gradlew runTests -Dbrowser=firefox
3. 在Java代码中获取参数
不管是Cucumber步骤定义还是基础Java类,都可以用你原本的代码获取参数:
String browser = System.getProperty("browser", "chrome");
内容的提问来源于stack exchange,提问作者Tt tt
相关产品推荐
相关产品推荐

