在cucumber-junit中动态传递黄瓜选项?

时间:2014-03-31 23:26:50

标签: java cucumber cucumber-jvm cucumber-junit

我知道@CucumberOptions用于传递Cucumber选项。但是,由于Java注释仅允许内联常量的限制,使用@CucumberOptions非常麻烦。那么,使用cucumber-junit时是否有一种动态的方式来传递Cucumber选项?非常感谢你。

4 个答案:

答案 0 :(得分:3)

这个问题现在很老了,但答案是肯定的,你可以。

如果您正在使用maven,例如只需像这样添加它。

mvn test -Dcucumber.options="--tags @your_tag"

您可以在运行时以这种方式过滤场景。

希望这有帮助。

答案 1 :(得分:2)

如上所述here,请尝试使用通用的通用代码,并尝试根据您的要求创建最佳优势,而不是依赖于TestNG和jUnit。 根据需要添加更多选项。

  private void defaultRun() {
        List<String> arguments = new ArrayList<String>();
        rguments.add("featureFiles");
           String[] tags = tagsToExecute;
           for (String tag : tags) {
               arguments.add("--tags");
               arguments.add(tag);
           }
        arguments.add("--plugin");
        arguments.add(html);
        arguments.add("--plugin");
        arguments.add(json);
        arguments.add("--plugin");
        arguments.add(rerun);
        String[] gluepackages = gluePackage.split(",");
        for (String packages : gluepackages) {
            if (!packages.contains("none")) {
                arguments.add("--glue");
                arguments.add(packages);
            }
        }
        final String[] argv = arguments.toArray(new String[0]);
        try {
            executetests(argv);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

 public byte executetests(final String[] argv) throws InterruptedException, IOException {

        RuntimeOptions runtimeOptions = new RuntimeOptions(new ArrayList(Arrays.asList(argv)));
        MultiLoader resourceLoader = new MultiLoader(this.getClass().getClassLoader());
        ResourceLoaderClassFinder classFinder = new ResourceLoaderClassFinder(resourceLoader, this.getClass().getClassLoader());
        Runtime runtime = new Runtime(resourceLoader, classFinder, this.getClass().getClassLoader(), runtimeOptions);
        runtime.run();
        System.out.println(runtime.exitStatus());
        return runtime.exitStatus();

    }

答案 2 :(得分:0)

您可以有多个Junit Before和After方法,每个方法都由您想要的特定标记(@mytag)执行。在每种方法中,您都可以设置所需的条件。

答案 3 :(得分:0)

这是一个受Sugat Mankar优美线索启发的解决方案,但具有完整的代码,并且已修复错误(尽管对您有用,但对于Gherkin功能文件,您必须具有与我相同的软件包结构和位置)做):

package mypack.cukes;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import cucumber.runtime.RuntimeOptions;
import cucumber.runtime.io.MultiLoader;
import cucumber.runtime.io.ResourceLoaderClassFinder;
import cucumber.runtime.Runtime;

public class MyRunnerTest {

    public String[] tagsToExecute = {"@SmokeUtilizationData, @SmokeSummaryData, @SmokeCompliance"};
    public String html = "com.cucumber.listener.ExtentCucumberFormatter:target/cucumber-reports/report.html";
    public String gluePackage = "mypack.cukes.stepDefinitions";
    public String[] argv = null;
    
    public void defaultRun() {
        List<String> arguments = new ArrayList<String>();
        arguments.add("src/main/java/mypack/cukes/features");
        String[] tags = tagsToExecute;
        for (String tag : tags) {
            arguments.add("--tags");
            arguments.add(tag);
        }
        arguments.add("--plugin");
        arguments.add(html);
        arguments.add("--glue");
        arguments.add(gluePackage);
        argv = arguments.toArray(new String[arguments.size()]);
        try {
            executeTests(argv);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }  catch (IOException ioex) {
            ioex.printStackTrace();
        }
    }


    public byte executeTests(final String[] argv) throws InterruptedException, IOException {
        RuntimeOptions runtimeOptions = new RuntimeOptions(new ArrayList(Arrays.asList(argv)));
        MultiLoader resourceLoader = new MultiLoader(this.getClass().getClassLoader());
        ResourceLoaderClassFinder classFinder = new ResourceLoaderClassFinder(resourceLoader, this.getClass().getClassLoader());
        Runtime runtime = new Runtime(resourceLoader, classFinder, this.getClass().getClassLoader(), runtimeOptions);
        runtime.run();
        System.out.println(runtime.exitStatus());
        return runtime.exitStatus();
    }

    public static void main(String[] args) {
        System.out.println("Testing MyRunnerTest");
        MyRunnerTest myRun = new MyRunnerTest();
        myRun.defaultRun();
    }

}

顺便说一句,我的pom文件说: 1.2.4