如何设置单独的跟踪/日志与SpecFlow
本文关键字:跟踪 日志 SpecFlow 单独 何设置 设置 | 更新日期: 2023-09-27 17:50:06
对于我的SpecFlow测试,我想在测试执行期间设置一个单独的测试进度日志/跟踪。例如:我想写
- 所有通过/失败的步骤
- 开始/结束场景
- 开始/结束功能
到Windows事件日志(为了在测试期间与其他系统组件生成的事件日志消息同步)。
我试图使用[BeforeFeature], [BeforeScenario], [BeforeStep]钩子来做到这一点,但事实证明,我没有在这个钩子中所有必需的信息。例如,我不知道如何获得当前步骤执行的当前文本行(包括行信息等)或当前步骤的结果(失败/通过)。
是否有一种方法可以在这些钩子中或在测试执行期间以任何其他方式获得此信息?
如果没有:是否有一种方法可以自定义Specflow以任何其他方式创建的跟踪输出?
为了提供一个自定义的ITestTracer实现,你应该为SpecFlow创建一个插件。
创建一个名为customtracker . 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
}
}
编译程序集并放入你的specs所在的项目文件夹(.csprog文件所在的文件夹)。
编辑app.config, specFlow部分,包括:
<plugins>
<add name="CustomTracer" path="." type="Runtime"/>
</plugins>
就是这样。您的插件应该被加载,您的自定义ITracer实现应该在场景执行期间被调用。如果在debug下运行场景,您甚至可以调试它
最后,经过一番调查,我发现您可以通过实现Interface 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);
}
}
修改你的App.config配置,把这个添加到"specflow"部分:
<trace traceSuccessfulSteps="true"
traceTimings="false"
minTracedDuration="0:0:0.1"
listener="MyNamespace.foo, MyAssemblyName"/>
然而,这对我来说更多的是一个"变通",因为我没有键入的信息(例如,StepInstance类),我必须依赖或修改SpecFlow的输出格式。
我更喜欢用我自己的方式替换TestTracer (ITestTracer)实现,但我没有找到这样做的方法。有人知道怎么做吗?
在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>(); };
}
}
其他都是Vladimir Perevalovs的答案
在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
{
...
}