在另一个场景之前运行整个场景

时间:2015-06-16 06:49:45

标签: selenium-webdriver cucumber-jvm

我无法弄清楚如何在其他场景之前运行整个场景,因此我的测试不依赖于彼此。

我有这种想象的场景。

情景A
鉴于我有一些东西 当我汇总一些数据时 我应该在我的网页上看到它

情景B
鉴于情景A
当我删除数据时 我不应该在我的网页上看到它

当我运行这种情况时,软件无法识别方案B中的方案A ,并要求我创建步骤,就像这样......

您可以使用以下代码段实现缺少的步骤:

@Given("^Registrere formue og inntekt$")
public void registrere_formue_og_inntekt() throws Throwable {
// Write code here that turns the phrase above into concrete actions
throw new PendingException();
}

2 个答案:

答案 0 :(得分:3)

你可以:

  • 使用Background对不同情景之前需要执行的所有步骤进行分组:
Background:
Given I have something
When I submit some data
Then I should see it on my webpage 

Scenario: B
When I delete the data
Then I should not see it on my webpage 
  • 将它们分组为步骤定义的一部分:
@Given("^Scenario A")
public void scenario_A() {
    I_have_something();
    I_submit_some_data();
    I_should_see_it_on_my_page();
}

然后您可以像这样使用:

Given Scenario A
When I delete the data
Then I should not see it on my webpage

使用这种技术,您通常会注意到某些操作会不断重复使用,您可能需要将它们分解出来,以便可以在不同的步骤定义中重复使用它们。在这一点上,页面对象模式非常方便。

答案 1 :(得分:1)

黄瓜情景应该是独立的。假设并确保独立性,我们做了很多工作。试图反对将是一个障碍课程。

话虽如此,您可以创建Cucumber JUnit运行器的自定义实现。有了这个自定义实现,并通过查看原始运行器的源,您可以公开/包装/更改内部以允许您想要的内容。例如,使用以下跑步者:

public class MyCucumber extends Cucumber {

    private static Runtime runtime;
    private static JUnitReporter reporter;
    private static List<CucumberFeature> features;

    public MyCucumber(Class<?> clazz) throws InitializationError, IOException {
        super(clazz);
    }

    @Override
    @SuppressWarnings("static-access")
    protected Runtime createRuntime(ResourceLoader resourceLoader,
            ClassLoader classLoader, RuntimeOptions runtimeOptions)
            throws InitializationError, IOException {
        this.runtime = super.createRuntime(resourceLoader, classLoader, runtimeOptions);
        this.reporter = new JUnitReporter(runtimeOptions.reporter(classLoader), runtimeOptions.formatter(classLoader), runtimeOptions.isStrict());
        this.features = runtimeOptions.cucumberFeatures(resourceLoader);

        return this.runtime;
    }

    public static void runScenario(String name) throws Exception {
        new ExecutionUnitRunner(runtime, getScenario(name), reporter).run(new RunNotifier());
    }

    private static CucumberScenario getScenario(String name) {
        for (CucumberFeature feature : features) {
            for (CucumberTagStatement element : feature.getFeatureElements()) {
                if (! (element instanceof CucumberScenario)) {
                    continue;
                }

                CucumberScenario scenario = (CucumberScenario) element;
                if (! name.equals(scenario.getGherkinModel().getName())) {
                    continue;
                }

                return scenario;
            }
        }

        return null;
    }

}

您可以使用以下方式设置测试套件:

@RunWith(MyCucumber.class)
public class MyTest {
}

创建一个步骤定义,如:

@Given("^I first run scenario (.*)$")
public void i_first_run_scenario(String name) throws Throwable {
    MyCucumber.runScenario(name);
}

这是一个脆弱的自定义(可以轻松破坏新版本的cucumber-junit),但它应该有效。