Запуск всего сценария перед другим сценарием

Я не могу понять, как запустить весь сценарий перед другим сценарием, чтобы мой тест не зависел друг от друга.

У меня есть воображаемые сценарии.

Сценарий A
Учитывая, что у меня что-то есть
Когда я суммирую некоторые данные
, я должен увидеть это на своей веб-странице

Сценарий B
Учитывая СЦЕНАРИЙ A
Когда я удаляю данные
, я не должен видеть их на своей веб-странице

Когда я запускаю этот случай сценария, программа не распознает сценарий A в сценарии B и просит меня создать шаг, например этот...

Вы можете реализовать недостающие шаги с помощью приведенных ниже фрагментов:

@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();
}


person johanserik    schedule 16.06.2015    source источник
comment
Можете ли вы уточнить свой вопрос? Потому что, хотя вы говорите, что мои тесты не зависят, то, о чем вы спрашиваете, сделает тесты явно зависимыми друг от друга.   -  person m4ktub    schedule 16.06.2015
comment
Я хочу, чтобы Сценарий B выполнял все шаги, которые делает Сценарий A, но я не хочу копировать все 3 шага в Сценарии A, в B... Я хочу только ссылаться на A. И сделать Сценарий B зависимым от A, было бы сделать что-то вроде этого: Сценарий B Когда я удаляю данные, я не должен видеть их на своей веб-странице.   -  person johanserik    schedule 16.06.2015


Ответы (2)


Вы можете:

  • Используйте 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

Используя этот метод, вы обычно замечаете, что некоторые действия постоянно используются повторно, и вы можете захотеть выделить их, чтобы их можно было повторно использовать в разных определениях шагов; в этот момент шаблон Page Object оказывается очень удобным.

person Sébastien Le Callonnec    schedule 16.06.2015

Сценарии Cucumber должны быть независимыми. Проделана большая работа по принятию и обеспечению этой независимости. Попытка пойти против будет полосой препятствий.

Сказав это, вы можете создать собственную реализацию бегуна 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), но она должна работать.

person m4ktub    schedule 16.06.2015