解决 SpecFlow ScenarioContext 被处置错误

Resolving SpecFlow ScenarioContext being disposed errors

在我们的应用程序测试套件中,我们有随机测试因以下错误而失败: 测试 'Some_Test_Name' 超出了执行超时期限。

当我们遇到这样的错误时,紧随其后的测试也会失败并出现此错误: System.Threading.ThreadAbortException: 线程被中止。 标准输出消息: -> 警告:之前的 ScenarioContext 没有被释放。 -> 错误:线程被中止。

我已经尝试了各种方法来解决这个问题,但我还没有找到一种方法来访问 ScenarioContext 以在它应该在的情况下处理它。我试过从 BeforeScenario 访问它,但总是在它被击中之前发生错误。

我们解决了一些超时问题,但对于仍然出现的随机问题,我希望能够减少由 ScenarioContext 问题引起的失败并从我的测试结果中删除那些误报。有什么想法吗?

警告 The previous ScenarioContext was not disposed 通常在测试未完成或 AfterScenario 方法抛出异常时发生。

我相信这个警告是良性的,可以安全地忽略。当您防止测试超时或允许测试 运行 成功完成(通过防止 AfterScenario 方法抛出。

我也遇到了同样的问题。我通过在 [AfterScenario] 块中实现 try-finally 解决了这个问题。

try
{
    //your stuff
}
finally
{
    driver.Dispose();
}

在我看来,这应该也适用于您。

    private void DisposeSpecFlowContext()
    {
        try
        {
            var disposableContext = ScenarioContext.Current as IDisposable;
            disposableContext.Dispose();
        }
        catch
        {
        }
    }

[AfterScenario()]方法中调用此方法。 能够处理的技巧是将其转换为 IDisposable。显然这是明确实施的。 如果你想更加安全,你可以检查 disposableContext 不是 null.

See here for explicit interface implementations.