Specflow 挂钩,如何获得不确定或待定结果?

Specflow hooks, how to get Inconclusive or Pending result?

我无法在 [AfterScenario] 挂钩中检测不确定的测试结果。

我有一大套 Specflow 测试,我 运行 大多数晚上在挂钩部分记录测试是通过还是失败以及标签上的一些信息,然后在结束时测试 运行 我将其输出到文件中。 我目前正在通过以下方式确定测试是通过还是失败:

bool failed = ScenarioContext.Current.TestError != null;
string result = failed ? "failed" : "passed";

这在大多数情况下都有效,但是当测试没有完成所有步骤时(场景结果不确定),该方法将场景报告为通过,这并不是我真正想要的。我试过在 App.Config 中将 missingOrPendingStepsOutcome 设置为错误或忽略,但它们都对 TestError 属性 没有任何影响,所以它再次被计算为 "passed".

我注意到 ScenarioContext.Current 中有几个看起来很方便的属性( MissingSteps 和 PendingSteps ),不幸的是它们是私有的,所以我无法访问它们。

我将 C#.4.5.2 和 Specflow 1.9.0.77 与 NUnit 2.6.4.14350 一起使用,并且 运行在 ReSharper 9.2 的单元测试会话 window 中 Visual Studio 进行测试] Windows 7 x64

企业版 2015

您可以检查 TestStatus 属性 不是 OK:

bool failed = ScenarioContext.Current.TestStatus != TestStatus.OK;

@Florent B. 解决方案更好,但如果您不想通过反射来完成,您可以使用我在 SpecFlow 1.9 中找到的技巧。

确实,当步骤不存在时,[BeforeStep] 钩子永远不会被调用。

[BeforeScenario]
public void BeforeScenario()
{
    ScenarioContext.Current.Set(false, "HasNotImplementedStep");
}

[BeforeStep]
public void BeforeStep()
{
    ScenarioContext.Current.Set(true, "IsBeforeStepCalled");
}

[AfterStep]
public void AfterStep()
{
    var beforeStepCalled = ScenarioContext.Current.Get<bool>("IsBeforeStepCalled");
    if (!beforeStepCalled)
    {
        ScenarioContext.Current.Set(true, "HasNotImplementedStep");
    }

    ScenarioContext.Current.Set(false, "IsBeforeStepCalled");
}

[AfterScenario]
public void AfterScenario()
{
    var hasNotImplementedStep = ScenarioContext.Current.Get<bool>("HasNotImplementedStep");
    if (hasNotImplementedStep)
    {
        // Do your stuff
    }
}