如何使用SpecFlow设置单独的跟踪/日志记录

时间:2014-03-12 18:58:07

标签: testing bdd specflow gherkin

对于我的SpecFlow测试,我想在测试执行期间设置测试进度的单独记录/跟踪。例如。我想写

  • 所有通过/失败的步骤
  • 开始/结束的场景
  • 开始/结束功能

到windows事件日志(以便在测试期间将其与其他系统组件生成的事件日志消息同步)。

我尝试使用[BeforeFeature],[BeforeScenario],[BeforeStep] Hooks来做这件事,但事实证明我在这个钩子中没有所有必需的信息。例如。我不知道如何获取当前步骤的当前文本行(包括行信息等)或当前步骤的结果(失败/通过)。

在执行测试期间,有没有办法在这些钩子中或以任何其他方式获取此信息?

如果没有: 有没有办法以任何其他方式自定义Specflow创建的跟踪输出?

4 个答案:

答案 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
{
    ...
}