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

提供的参数

但您可以覆盖它们,提供(按此特定顺序):

  1. OS环境变量CUCUMBER_OPTIONS
  2. Java系统属性cucumber.options
  3. Java 资源包 cucumber.properties 带有 cucumber.options 属性

一旦找到上述选项之一,就会使用它。覆盖在名为 cucumber.optionsCUCUMBER_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
  1. 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();
                }
            }
        }
    }
    
  2. 获取和设置 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 作为第一个选项。谢谢