【问题标题】:How to set up individual tracing / logging with SpecFlow如何使用 SpecFlow 设置个人跟踪/日志记录
【发布时间】:2014-04-17 03:55:41
【问题描述】:

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

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

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

我尝试使用 [BeforeFeature]、[BeforeScenario]、[BeforeStep] Hooks 来执行此操作,但结果证明我没有此 hooks 中的所有必需信息。例如。我不知道如何获取当前步骤执行的当前文本行(包括行信息等)或当前步骤的结果(失败/通过)。

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

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

【问题讨论】:

  • 我想记录下哪个scenario 被执行了,Test Outcome 是什么。我想将此记录到CSV 文件中。我正在使用 Serilog 。我怎样才能做到这一点?

标签: c# testing bdd specflow gherkin


【解决方案1】:

最后,经过一番调查,我发现您可以通过实现接口 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】:

    为了提供 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 实现应该在场景执行期间被调用。如果你在调试下运行场景,你甚至可以调试它。

    【讨论】:

    • 所以我使用了它,它运行良好,直到我升级到 SpecFlow 2.0。有其他人打过这个吗?
    • @Vladimir 我正在寻找实现一个logger,它只捕获Test Outcome```` and the Scenario``` 名称并将其写入CSV 文件。除了 Scenario 名称之外,无法从钩子中获取任何内容
    【解决方案3】:

    在 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 的回答相同。

    【讨论】:

    • @Jason- 我正在使用 SpecFlow 3+,我的要求是捕获 ScanarioTestOutcome 。我怎样才能做到这一点?我必须将这些信息登录到CSV 文件中
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-13
      • 2011-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多