Java Cucumber:从外部源获取@CucumberOptions,如属性文件

时间:2017-07-14 05:48:46

标签: java selenium-webdriver bdd cucumber-java cucumber-junit

是否可以从java .properties文件中获取黄瓜选项值?

this SO帖子中,它显示它是从CLI传递的。

这是我的示例类:

@RunWith(Cucumber.class)
@CucumberOptions(
        features = {"resources/features/"},
        glue = {"classpath:com/"},
        tags = {"@foo, @bar"}
)
public class UITestRunner {

}

我不想在这里硬编码标签,而是想从属性文件中取出它。 任何帮助表示赞赏!

6 个答案:

答案 0 :(得分:4)

Cucumber最初会查找由cucumber.api.cli.Main@CucumberOptions

提供的参数

但你可以覆盖它们(按照这个特定的顺序):

  1. 操作系统环境变量CUCUMBER_OPTIONS
  2. Java系统属性cucumber.options
  3. 具有cucumber.properties属性
  4. 的Java资源包cucumber.options

    一旦找到上述选项中的一个,就会使用它。覆盖在名为cucumber.optionsCUCUMBER_OPTIONS的变量(或属性)中提供。除插件参数外的所有值都将覆盖cucumber.api.cli.Main@CucumberOptions提供的值。插件选项将累加到cucumber.api.cli.Main@CucumberOptions指定的插件。

答案 1 :(得分:2)

希望您知道如果从命令行运行,您可以使用系统属性

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类来实现自己的JUnit Cucumber运行器。有关示例,请参阅this。所以在构造函数中你应该完全控制。

答案 2 :(得分:1)

我通过扩展黄瓜转轮解决了这个问题。您可以在此处找到示例:

对于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的设置,但不确定是否有放置此代码的更好的地方。

改写跑步者不是很优雅,但它就像一个魅力!

答案 3 :(得分:0)

项目树中cumulant.properties文件中的替代要素源行的示例是:

cucumber.options=-g StepDefs src\\test\\resources\\Testfeature.feature

Java Book的黄瓜很酷。阅读这篇文章后,我明白了。 我尝试了一段时间,以查看CucumberOptions属性接受的路径...因此,以上是快速解决方案。 ;)

StepDefs是我的步骤定义在项目树中的文件夹。

我更喜欢这种方式将所有内容都放在一个地方。也许是为了将测试套件移植到另一个系统,更常见的是在目标系统中设置一个System变量,这样可能的客户总是在一个目录中放置特征文件。

答案 4 :(得分:0)

我正在寻找一个解决方案,该方法如何在 Dcucumber 选项中的命令行中传递(覆盖)特征文件路径粘合(步骤)路径。这非常具有挑战性,我无法在许多论坛中找到确切的解决方案。终于找到了可行的解决方案

只需在此处发布它就可以帮助任何人。

gradle -Dcucumber.options="-g XX.XXX.XXX.steps --tags @xxxxxx featurefilepath/features/" test

您必须遵循以-g作为第一个选项的顺序。 Thaanks

答案 5 :(得分:-1)

我这样做: -

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类: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);
       }
    
  3. 运行此方法的主要方法: -

        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是我的Cucumber类

    @RunWith(Cucumber.class)
    @CucumberOptions(
            monochrome = true,
            tags = {"@passed"},
            glue =  "cucumberTest.steps")
    public class RunGwMLCompareTests {
    
        public RunGwMLCompareTests(){
    
        }
    }
    

    所以基本上nopw你可以通过属性文件和其他选项来设置输出报告和功能文件夹,比如胶水定义java类。运行测试用例只需运行主类。

    此致 维克拉姆帕坦尼亚