对于我的SpecFlow测试,我想在测试执行期间设置测试进度的单独记录/跟踪。例如。我想写
到windows事件日志(以便在测试期间将其与其他系统组件生成的事件日志消息同步)。
我尝试使用[BeforeFeature],[BeforeScenario],[BeforeStep] Hooks来做这件事,但事实证明我在这个钩子中没有所有必需的信息。例如。我不知道如何获取当前步骤的当前文本行(包括行信息等)或当前步骤的结果(失败/通过)。
在执行测试期间,有没有办法在这些钩子中或以任何其他方式获取此信息?
如果没有: 有没有办法以任何其他方式自定义Specflow创建的跟踪输出?
答案 0 :(得分:5)
为了提供ITestTracer的自定义实现,您应该为SpecFlow创建一个插件。
创建一个名为CustomTracer.SpecflowPlugin的类库项目。 CustomTracer是您插件的首选名称。
然后将以下代码放入新程序集
[assembly: RuntimePlugin(typeof(CustomTracer.SpecflowPlugin.CustomTracerPlugin))]
namespace CustomTracer.SpecflowPlugin
{
public class CustomTracerPlugin : IRuntimePlugin
{
public void RegisterDependencies(ObjectContainer container)
{
}
public void RegisterCustomizations(ObjectContainer container, RuntimeConfiguration runtimeConfiguration)
{
container.RegisterTypeAs<CustomTracer, ITestTracer>();
}
public void RegisterConfigurationDefaults(RuntimeConfiguration runtimeConfiguration)
{
}
}
public class CustomTracer : ITestTracer
{
// Your implementation here
}
}
编译程序集并放入规范所在的项目文件夹(.csprog文件所在的位置)。
编辑app.config,specFlow部分包括:
<plugins>
<add name="CustomTracer" path="." type="Runtime"/>
</plugins>
就是这样。您的插件应该加载,并且应该在场景执行期间调用您的自定义ITracer实现。如果在debug下运行方案,你甚至可以调试它。
答案 1 :(得分:3)
最后,经过一些调查,我发现你可以通过实现接口ITraceListener来替换你自己实现的DefaultTraceListener:
public class foo: TechTalk.SpecFlow.Tracing.ITraceListener
{
public void WriteTestOutput(string message)
{
EventLog.WriteEntry("mysource", "output: " + message);
}
public void WriteToolOutput(string message)
{
EventLog.WriteEntry("mysource", "specflow: " + message);
}
}
通过将其添加到“specflow”部分来修改App.config配置:
<trace traceSuccessfulSteps="true"
traceTimings="false"
minTracedDuration="0:0:0.1"
listener="MyNamespace.foo, MyAssemblyName"/>
然而,这对我来说更像是一种“解决方法”,因为我没有输入信息(例如StepInstance类),我必须依赖或修改SpecFlow的输出格式。
我希望以某种方式替换我自己的TestTracer(ITestTracer)实现,但我找不到这样做的方法。现在有人怎么做?
答案 2 :(得分:2)
在Specflow 2.1中它有点不同。
而不是:
public class CustomTracerPlugin : IRuntimePlugin
{
public void RegisterDependencies(ObjectContainer container)
{
}
public void RegisterCustomizations(ObjectContainer container, RuntimeConfiguration runtimeConfiguration)
{
container.RegisterTypeAs<CustomTracer, ITestTracer>();
}
public void RegisterConfigurationDefaults(RuntimeConfiguration runtimeConfiguration)
{
}
}
这样做:
public class CustomTracerPlugin : IRuntimePlugin
{
public void Initialize(RuntimePluginEvents runtimePluginEvents, RuntimePluginParameters runtimePluginParameters)
{
runtimePluginEvents.CustomizeTestThreadDependencies += (sender, args) => { args.ObjectContainer.RegisterTypeAs<CustomTracer, ITestTracer>(); };
}
}
其他任何事情都与弗拉基米尔佩雷瓦洛夫的答案相同。
答案 3 :(得分:0)
要在 SpecFlow 3.x 中注册自定义 ITestTracer
:
[assembly: RuntimePlugin(typeof(CustomTracerPlugin))]
public class CustomTracerPlugin : IRuntimePlugin
{
public void Initialize(
RuntimePluginEvents runtimePluginEvents,
RuntimePluginParameters runtimePluginParameters,
UnitTestProviderConfiguration unitTestProviderConfiguration)
{
runtimePluginEvents.CustomizeGlobalDependencies +=
(s, ea) => ea.ObjectContainer.RegisterTypeAs<CustomTracer, ITestTracer>();
}
}
public class CustomTracer : ITestTracer
{
...
}