C# 使用Specflow和xUnit 2(ITestOutputHelper)进行日志记录
不幸的是,我有一个在本地通过的Specflow测试,但是它在VSO Build vNext服务器上失败了,我真的需要在测试运行期间查看详细信息,这样我才能弄清楚到底发生了什么 但是我正在努力尝试将C# 使用Specflow和xUnit 2(ITestOutputHelper)进行日志记录,c#,specflow,xunit,xunit2,C#,Specflow,Xunit,Xunit2,不幸的是,我有一个在本地通过的Specflow测试,但是它在VSO Build vNext服务器上失败了,我真的需要在测试运行期间查看详细信息,这样我才能弄清楚到底发生了什么 但是我正在努力尝试将ITestOutputHelper注入到像这样的Specflow绑定中 publicsomesteps(ITestOutputHelper outputHelper) 但是Specflow抱怨这条消息 无法解析BoDi.ObjectContainerException接口:Xunit.Abstracti
ITestOutputHelper
注入到像这样的Specflow绑定中
publicsomesteps(ITestOutputHelper outputHelper)
但是Specflow抱怨这条消息
无法解析BoDi.ObjectContainerException接口:Xunit.Abstractions.ITestOutputHelper(解析路径:…)
在Specflow测试期间,究竟如何查看日志和输出?这是我能想到的最好的方法,虽然不理想,但它确实实现了您想要的 您将创建一个新类来实现生成的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");
}
}
现在,您可以通过访问steps文件中的XUnitITestOutputHelper
var helper = this._scenarioContext.Get<Xunit.Abstractions.ITestOutputHelper>("helper");
helper.WriteLine("output from within the steps file that will be written to xunit!");
var helper=this.\u scenarioContext.Get(“helper”);
WriteLine(“将写入xunit的steps文件中的输出”);
您需要使用helper
变量进行防御,以确保不会得到任何NullReferenceException
这样做的缺点是,由于继承了旧的测试,现在您有了同一测试的两个副本。因此,在本例中,您有来自SpecialTest
和YourNormalFeatureClass
的测试。这意味着您不需要运行YourNormalFeatureClass
测试,而只需要运行SpecialTest
测试
如果SpecFlow允许您自定义代码生成过程,那么所有这些问题都将很容易解决。这样,您就可以通过生成的代码公开
ITestOutputHelper
。步骤中的消耗量是相同的。不确定我是否使用了更新的版本,现在更容易了,但这似乎对我有效:
ScenarioContext.Current.ScenarioContainer.Resolve<ITestOutputHelper>().WriteLine("Hello");
ScenarioContext.Current.ScenarioContainer.Resolve().WriteLine(“Hello”);
您不能在步骤中跟踪.WriteLine或调试.WriteLine
吗?@avalancis在另一条评论中提供的链接中描述了这一点。但不幸的是,xUnit2没有捕获跟踪和调试输出。您必须使用ITestOutputHelper。我开始越来越不喜欢xUnit.net了。即使在github上,似乎也只有很少的贡献者,没有多少提交和回复来解决报告的问题。[rant off]自8月份以来,有一个拉取请求正在等待,它正是这样做的:太棒了,pitty,他们没有拉取它。这对我来说很有效——还要注意,您可以通过.NET Core中的依赖项注入(DI)而不是使用ScenarioContext.Current来获取中的ScenarioContext。