Java Cucumber:像 属性 文件一样从外部源获取 @CucumberOptions
Java Cucumber: Take @CucumberOptions from external source like a property file
是否可以从 java.properties 文件中获取 cucumber 选项值?
在 SO post中,说明是从CLI传过来的。
这是我的示例 class:
@RunWith(Cucumber.class)
@CucumberOptions(
features = {"resources/features/"},
glue = {"classpath:com/"},
tags = {"@foo, @bar"}
)
public class UITestRunner {
}
我不想在此处对标签进行硬编码,而是想从 属性 文件中获取它。
感谢您的帮助!
希望您知道,如果从命令行 运行,您可以使用系统属性
mvn test -Dcucumber.options="--features resources/features/ --tags ~@ignore" -Dtest=AnimalsTest
这意味着您可以通过编程方式设置这些属性:
@RunWith(Cucumber.class)
public class CatsRunner {
@BeforeClass
public static void before() {
System.setProperty("cucumber.options", "--features resources/features/ --tags ~@ignore");
}
}
希望能给你一些想法。例如,您可以手动从文件中读取属性,然后实现您想要的。
编辑:显然上面的方法不起作用。所以这是我的下一个想法,通过扩展 Cucumber
class 来实现你自己的 JUnit Cucumber runner。示例参见 this。所以在构造函数中你应该有完全的控制权。
Cucumber 最初会查找 cucumber.api.cli.Main
或 @CucumberOptions
提供的参数
但您可以覆盖它们,提供(按此特定顺序):
- OS环境变量
CUCUMBER_OPTIONS
- Java系统属性
cucumber.options
- Java 资源包
cucumber.properties
带有 cucumber.options
属性
一旦找到上述选项之一,就会使用它。覆盖在名为 cucumber.options
或 CUCUMBER_OPTIONS
的变量(或 属性)中提供。除插件参数外,所有值都将覆盖 cucumber.api.cli.Main
或 @CucumberOptions
提供的值。插件选项将添加到 cucumber.api.cli.Main
或 @CucumberOptions
.
指定的插件
我是这样做的:-
cucmberOption.properties
#cucumber.options=--plugin html:output/cucumber-html-report
#src/test/resources
cucumber.options.feature =src/test/resources
cucumber.options.report.html=--plugin html:output/cucumber-html-report
Java Class: CreateCucumberOptions.java
加载属性文件的方法:-
private static void loadPropertiesFile(){
InputStream input = null;
try{
String filename = "cucumberOptions.properties";
input = CreateCucumberOptions.class.getClassLoader().getResourceAsStream(filename);
if(input==null){
LOGGER.error("Sorry, unable to find " + filename);
return;
}
prop.load(input);
}catch(IOException e){
e.printStackTrace();
}finally{
if(input!=null) {
try {
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
获取和设置 CucumberOptions 的方法
private String createAndGetCucumberOption(){
StringBuilder sb = new StringBuilder();
String featureFilesPath =
prop.getProperty("cucumber.options.feature");
LOGGER.info(" featureFilesPath: " +featureFilesPath);
String htmlOutputReport =
prop.getProperty("cucumber.options.report.html");
LOGGER.info(" htmlOutputReport: " +htmlOutputReport);
sb.append(htmlOutputReport);
sb.append(" ");
sb.append(featureFilesPath);
return sb.toString();
}
private void setOptions(){
String value = createAndGetCucumberOption();
LOGGER.info(" Value: " +value);
System.setProperty(KEY, value);
}
和 运行 这个的主要方法:-
public static void main(String[] args) {
CreateCucumberOptions cucumberOptions = new CreateCucumberOptions();
JUnitCore junitRunner = new JUnitCore();
loadPropertiesFile();
cucumberOptions.setOptions();
junitRunner.run(cucumberTest.runners.RunGwMLCompareTests.class);
}
而RunGwMLCompareTests.class是我的黄瓜class
@RunWith(Cucumber.class)
@CucumberOptions(
monochrome = true,
tags = {"@passed"},
glue = "cucumberTest.steps")
public class RunGwMLCompareTests {
public RunGwMLCompareTests(){
}
}
所以基本上现在您可以通过属性文件和其他选项(如粘合定义)设置输出报告和功能文件夹 java class。 运行 测试用例只是 运行 你的主要 class.
此致,
维克拉姆帕塔尼亚
我通过扩展 Cucumber runner 解决了这个问题。您可以在此处找到示例:
对于 cucumber-jvm 4.0.0:https://github.com/martinschneider/yasew/blob/master/src/main/java/io/github/martinschneider/yasew/junit/YasewRunner.java
对于 cucumber-jvm 2.4.0:https://github.com/martinschneider/yasew/blob/db8cd74281139c14603e9ae05548530a7aebbade/src/main/java/io/github/martinschneider/yasew/junit/YasewRunner.java
正如一些回复和评论中所讨论的那样,关键部分是设置 cucumber.options
系统 属性:
String cucumberOptions =
"--tags @"
+ getProperty(PLATFORM_KEY, DEFAULT_PLATFORM)
+ " --glue io.github.martinschneider.yasew.steps --glue "
+ getProperty(STEPS_PACKAGE_KEY)
+ " --plugin pretty --plugin html:report --plugin json:"
+ getProperty(CUCUMBER_REPORT_DIRECTORY_KEY,
DEFAULT_CUCUMBER_REPORT_DIRECTORY)
+ "/cucumber.json"
+ " "
+ getProperty(FEATURES_DIRECTORY_KEY);
LOG.info("Setting cucumber options ({}) to {}", CUCUMBER_OPTIONS_KEY, cucumberOptions);
System.setProperty(CUCUMBER_OPTIONS_KEY, cucumberOptions);
我正在使用 Spring 和 JUnit 的设置,我不确定是否有更好的地方放置此代码。
覆盖跑步者不是很优雅,但它很有魅力!
项目树中 cucumber.properties 文件中覆盖功能源代码行的示例是:
cucumber.options=-g StepDefs src\test\resources\Testfeature.feature
Java 书中的 Cucumber 很酷。看完这个我明白了post。
我尝试了一些时间来查看 CucumberOptions 属性 接受的路径......所以上面是快速解决方案。 ;)
StepDefs 是我的步骤定义在项目树中所在的文件夹。
我更喜欢这种将所有内容集中在一个地方的方式。也许为了将测试套件移植到另一个系统,更常见的是在目标系统中设置一个系统变量,这样可能的客户总是有一个目录来放置特性文件。
我正在寻找一种解决方案,如何在 Dcucumber 选项的命令行中传递(覆盖)特征文件路径粘合(步骤)路径。这非常具有挑战性,我无法在许多论坛中找到确切的解决方案。终于找到了可行的解决方案
只要张贴在这里它可以帮助任何人。
gradle -Dcucumber.options="-g XX.XXX.XXX.steps --tags @xxxxxx featurefilepath/features/" test
您必须遵循此顺序,将 -g 作为第一个选项。谢谢
是否可以从 java.properties 文件中获取 cucumber 选项值?
在
这是我的示例 class:
@RunWith(Cucumber.class)
@CucumberOptions(
features = {"resources/features/"},
glue = {"classpath:com/"},
tags = {"@foo, @bar"}
)
public class UITestRunner {
}
我不想在此处对标签进行硬编码,而是想从 属性 文件中获取它。 感谢您的帮助!
希望您知道,如果从命令行 运行,您可以使用系统属性
mvn test -Dcucumber.options="--features resources/features/ --tags ~@ignore" -Dtest=AnimalsTest
这意味着您可以通过编程方式设置这些属性:
@RunWith(Cucumber.class)
public class CatsRunner {
@BeforeClass
public static void before() {
System.setProperty("cucumber.options", "--features resources/features/ --tags ~@ignore");
}
}
希望能给你一些想法。例如,您可以手动从文件中读取属性,然后实现您想要的。
编辑:显然上面的方法不起作用。所以这是我的下一个想法,通过扩展 Cucumber
class 来实现你自己的 JUnit Cucumber runner。示例参见 this。所以在构造函数中你应该有完全的控制权。
Cucumber 最初会查找 cucumber.api.cli.Main
或 @CucumberOptions
但您可以覆盖它们,提供(按此特定顺序):
- OS环境变量
CUCUMBER_OPTIONS
- Java系统属性
cucumber.options
- Java 资源包
cucumber.properties
带有cucumber.options
属性
一旦找到上述选项之一,就会使用它。覆盖在名为 cucumber.options
或 CUCUMBER_OPTIONS
的变量(或 属性)中提供。除插件参数外,所有值都将覆盖 cucumber.api.cli.Main
或 @CucumberOptions
提供的值。插件选项将添加到 cucumber.api.cli.Main
或 @CucumberOptions
.
我是这样做的:-
cucmberOption.properties
#cucumber.options=--plugin html:output/cucumber-html-report
#src/test/resources
cucumber.options.feature =src/test/resources
cucumber.options.report.html=--plugin html:output/cucumber-html-report
Java Class: CreateCucumberOptions.java
加载属性文件的方法:-
private static void loadPropertiesFile(){ InputStream input = null; try{ String filename = "cucumberOptions.properties"; input = CreateCucumberOptions.class.getClassLoader().getResourceAsStream(filename); if(input==null){ LOGGER.error("Sorry, unable to find " + filename); return; } prop.load(input); }catch(IOException e){ e.printStackTrace(); }finally{ if(input!=null) { try { input.close(); } catch (IOException e) { e.printStackTrace(); } } } }
获取和设置 CucumberOptions 的方法
private String createAndGetCucumberOption(){ StringBuilder sb = new StringBuilder(); String featureFilesPath = prop.getProperty("cucumber.options.feature"); LOGGER.info(" featureFilesPath: " +featureFilesPath); String htmlOutputReport = prop.getProperty("cucumber.options.report.html"); LOGGER.info(" htmlOutputReport: " +htmlOutputReport); sb.append(htmlOutputReport); sb.append(" "); sb.append(featureFilesPath); return sb.toString(); } private void setOptions(){ String value = createAndGetCucumberOption(); LOGGER.info(" Value: " +value); System.setProperty(KEY, value); }
和 运行 这个的主要方法:-
public static void main(String[] args) {
CreateCucumberOptions cucumberOptions = new CreateCucumberOptions();
JUnitCore junitRunner = new JUnitCore();
loadPropertiesFile();
cucumberOptions.setOptions();
junitRunner.run(cucumberTest.runners.RunGwMLCompareTests.class);
}
而RunGwMLCompareTests.class是我的黄瓜class
@RunWith(Cucumber.class)
@CucumberOptions(
monochrome = true,
tags = {"@passed"},
glue = "cucumberTest.steps")
public class RunGwMLCompareTests {
public RunGwMLCompareTests(){
}
}
所以基本上现在您可以通过属性文件和其他选项(如粘合定义)设置输出报告和功能文件夹 java class。 运行 测试用例只是 运行 你的主要 class.
此致, 维克拉姆帕塔尼亚
我通过扩展 Cucumber runner 解决了这个问题。您可以在此处找到示例:
对于 cucumber-jvm 4.0.0:https://github.com/martinschneider/yasew/blob/master/src/main/java/io/github/martinschneider/yasew/junit/YasewRunner.java
对于 cucumber-jvm 2.4.0:https://github.com/martinschneider/yasew/blob/db8cd74281139c14603e9ae05548530a7aebbade/src/main/java/io/github/martinschneider/yasew/junit/YasewRunner.java
正如一些回复和评论中所讨论的那样,关键部分是设置 cucumber.options
系统 属性:
String cucumberOptions =
"--tags @"
+ getProperty(PLATFORM_KEY, DEFAULT_PLATFORM)
+ " --glue io.github.martinschneider.yasew.steps --glue "
+ getProperty(STEPS_PACKAGE_KEY)
+ " --plugin pretty --plugin html:report --plugin json:"
+ getProperty(CUCUMBER_REPORT_DIRECTORY_KEY,
DEFAULT_CUCUMBER_REPORT_DIRECTORY)
+ "/cucumber.json"
+ " "
+ getProperty(FEATURES_DIRECTORY_KEY);
LOG.info("Setting cucumber options ({}) to {}", CUCUMBER_OPTIONS_KEY, cucumberOptions);
System.setProperty(CUCUMBER_OPTIONS_KEY, cucumberOptions);
我正在使用 Spring 和 JUnit 的设置,我不确定是否有更好的地方放置此代码。
覆盖跑步者不是很优雅,但它很有魅力!
项目树中 cucumber.properties 文件中覆盖功能源代码行的示例是:
cucumber.options=-g StepDefs src\test\resources\Testfeature.feature
Java 书中的 Cucumber 很酷。看完这个我明白了post。 我尝试了一些时间来查看 CucumberOptions 属性 接受的路径......所以上面是快速解决方案。 ;)
StepDefs 是我的步骤定义在项目树中所在的文件夹。
我更喜欢这种将所有内容集中在一个地方的方式。也许为了将测试套件移植到另一个系统,更常见的是在目标系统中设置一个系统变量,这样可能的客户总是有一个目录来放置特性文件。
我正在寻找一种解决方案,如何在 Dcucumber 选项的命令行中传递(覆盖)特征文件路径粘合(步骤)路径。这非常具有挑战性,我无法在许多论坛中找到确切的解决方案。终于找到了可行的解决方案
只要张贴在这里它可以帮助任何人。
gradle -Dcucumber.options="-g XX.XXX.XXX.steps --tags @xxxxxx featurefilepath/features/" test
您必须遵循此顺序,将 -g 作为第一个选项。谢谢