Ведение журнала с помощью Specflow и xUnit 2 (ITestOutputHelper)

К сожалению, у меня есть тест Specflow, проходящий локально, но он не проходит на сервере VSO Build vNext, и мне действительно нужно видеть подробную информацию во время выполнения теста, чтобы я мог выяснить, что происходит.

Но я изо всех сил пытаюсь ввести ITestOutputHelper в привязку Specflow, как так

public SomeSteps(ITestOutputHelper outputHelper)

но Specflow жалуется с сообщением

BoDi.ObjectContainerException Interface cannot be resolved: Xunit.Abstractions.ITestOutputHelper (resolution path: ...)

Как на самом деле можно просматривать журнал и просматривать вывод во время теста Specflow?

4 ответа

Не уверен, что я использую более новую версию, и теперь стало проще, но мне кажется, это работает:

ScenarioContext.Current.ScenarioContainer.Resolve<ITestOutputHelper>().WriteLine("Hello");

Это лучшее, что я могу придумать, оно не идеальное, но оно выполняет то, что вы хотите.

Вы создаете новый класс, который реализует ваш сгенерированный класс xunit. В моем примере сгенерированный класс называется YourNormalFeatureClass

public class SpecialTest : YourNormalFeatureClass
{
    private Xunit.Abstractions.ITestOutputHelper helper;

    public SpecialTest(ITestOutputHelper helper) : base()
    {
        this.helper = helper;   
    }

    public override void ScenarioSetup(ScenarioInfo scenarioInfo)
    {
        base.ScenarioSetup(scenarioInfo);

        // you'd want a better way to keep track of this string
        TechTalk.SpecFlow.TestRunnerManager.GetTestRunner().ScenarioContext.Set(this.helper, "helper");
    }

}

Теперь вы можете получить доступ к вашему XUnit ITestOutputHelper из файла шагов через

var helper = this._scenarioContext.Get<Xunit.Abstractions.ITestOutputHelper>("helper");
helper.WriteLine("output from within the steps file that will be written to xunit!");

Вы должны были бы защищаться с этим helper переменная, чтобы убедиться, что вы не получите NullReferenceException"s

Недостатком является то, что теперь у вас есть 2 копии одного теста, потому что вы унаследовали старый тест. Так что в этом случае у вас есть тесты от SpecialTest а также YourNormalFeatureClass, Это означает, что вам не нужно бежать YourNormalFeatureClass тесты и только запустить SpecialTest тесты.

Все это будет легко решено, если SpecFlow позволит вам настроить процесс генерации кода. Таким образом, вы могли бы выставить ITestOutputHelper через сгенерированный код. Потребление этого из шагов будет таким же.

Это может быть новое дополнение к SpecFlow, так как этот вопрос был задан (6 лет назад), но TechTalk.SpecFlow.Infrastructure.ISpecFlowOutputHelper должен решить вашу проблему. Вставьте его и используйте почти так же, как с ITestOutputHelper xUnit, например

      [Binding]
public class SomeSteps
{
    private readonly ISpecFlowOutputHelper output;

    public SomeSteps(ISpecFlowOutputHelper output)
    {
        this.output = output;
    }

    [When(@"I write some debug info")]
    public void WhenIWriteSomeDebugInfo()
    {
        this.output.WriteLine("Hello world!");
    }
}

В рамках параллельной среды вы больше не можете использовать статический ScenarioContext, но можете использовать:

      var console= _scenarioContext.ScenarioContainer.Resolve<ISpecFlowOutputHelper>();

Ссылка: https://docs.specflow.org/projects/specflow/en/latest/Execution/Parallel-Execution.html#xunit-configuration .

Другие вопросы по тегам