Ведение журнала с помощью 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?


person softbear    schedule 01.04.2016    source источник
comment
ты не можешь просто Trace.WriteLine или Debug.WriteLine в своих шагах?   -  person Sam Holder    schedule 14.04.2016
comment
Описано в ссылке, которую @Avalanchis предоставил в другом комментарии. но, к сожалению, xUnit2 не фиксирует вывод трассировки и отладки. Вы должны использовать ITestOutputHelper. [напыщенная речь] Мне все больше и больше начинает не нравиться xUnit.net. Даже на github, похоже, очень мало участников и не так много коммитов и ответов для решения проблем, о которых сообщалось. [разглагольствовать]   -  person softbear    schedule 15.04.2016


Ответы (2)


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

ScenarioContext.Current.ScenarioContainer.Resolve<ITestOutputHelper>().WriteLine("Hello");
person BenTaylor    schedule 09.07.2018
comment
Это сработало для меня — также обратите внимание, что вы можете получить ScenarioContext через внедрение зависимостей (DI) в .NET Core вместо использования ScenarioContext.Current. - person BearsEars; 27.05.2020

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

Вы создаете новый класс, реализующий созданный вами класс 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.

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

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

person Allen Rice    schedule 03.11.2016
comment
С августа ожидается запрос на включение, который делает именно это: github.com/techtalk/SpecFlow/pull/ 689 - person Lucero; 28.11.2016
comment
Классно, жаль, что не тянут - person Allen Rice; 01.12.2016