我无法弄清楚如何在其他场景之前运行整个场景,因此我的测试不依赖于彼此。
我有这种想象的场景。
情景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();
}
答案 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
),但它应该有效。