Specflow beforeScenario в базовом классе вызывается несколько раз, по одному разу для каждой функции в наборе - PullRequest
1 голос
/ 29 января 2020

У меня есть набор тестов, в котором используется среда отчетов о тестировании, которая мне нужна для запуска через базовый класс, все работает нормально, но [BeforeScenario] вызывается 10 раз для каждого запускаемого мной сценария, 1 раз для каждой функции в моем Как ни странно, демонтаж запускается только один раз.

Вот как выглядит мой базовый класс:

[Binding]
public class BaseStep : AllureReport
{
    public DriverSupport _support;
    public BaseStep(DriverSupport support)
    {
        _support = support;
    }

    [BeforeScenario]
    public void Setup(FeatureContext context)
    {
            _support.startDriver();
            AllureLifecycle.Instance.RunStep(() =>
            {
                TestContext.Progress.WriteLine(
                    $"Test \"{TestExecutionContext.CurrentContext.CurrentTest.FullName}\" is starting...");
            });

    }

    [AfterScenario, Order(0)]
    private void TearDown()
    {

        AllureLifecycle.Instance.RunStep(() =>
        {
            TestContext.Progress.WriteLine(
                $"Test {TestExecutionContext.CurrentContext.CurrentTest.FullName}\" is stopping...");
        });

}

И вот так выглядит мой файл шага функции (их 10)

[Binding]
public class TestSteps1:BaseStep
{

    public TestSteps1(DriverSupport support) : base(suppprt)
    {
    }

    [Given(@"user goes to (.*)")]
    public void GivenUserGoesTo(string p0)
    {
        _support.driver.GoToUrl(p0)
    }

Когда я запускаю только ОДИН сценарий в функции, она печатает стартовый драйвер и печатает "тест xxx запускается ..." 10 раз, по одному разу для каждой имеющейся функции, я просто хочу, чтобы он запускался один раз.

Я думал о переходе до сценария к самим классам шагов, но многие из моих функций используют шаги из нескольких файлов шагов, поэтому я думаю, что это будет проблемой. Есть ли способ сделать так, чтобы он запускался перед сценарием только один раз за сценарий?

1 Ответ

2 голосов
/ 29 января 2020

SpecFlow выполнит метод BeforeScenario для каждого типа, найденного в вашем тестовом проекте. Похоже, есть 10 типов, которые определяют или наследуют этот метод:

  • Класс BaseStep
  • Каждый подкласс BaseStep

Когда я хочу Перед сценарием, запускаемым только один раз за тестовый прогон, я помещу его в свой собственный класс "hooks".

Поскольку хуки и до, и после должны выполняться только один раз, просто поместите их оба в нечто вроде SpecFlowHooks.cs.

Объект веб-драйвера Selenium должен быть зарегистрирован в среде внедрения зависимостей SpecFlow и передан непосредственно каждому классу шага в качестве аргумента конструктора. Учитывая опубликованный вами код, я не уверен, что общий базовый класс для ваших определений шагов будет полезен.

См. Мой ответ для Как правильно управлять экземплярами веб-драйвера и обращаться к ним, чтобы избежать проблем с параллельным выполнением tests? для получения дополнительной информации о правильной регистрации объекта веб-драйвера Selenium с SpecFlow.

...