【问题标题】:Resolving SpecFlow ScenarioContext being disposed errors解决 SpecFlow ScenarioContext 正在处理的错误
【发布时间】:2016-08-02 16:35:56
【问题描述】:

在我们的应用程序测试套件中,我们有随机测试失败并出现以下错误: 测试“Some_Test_Name”超过了执行超时时间。

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

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

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

【问题讨论】:

    标签: c# specflow


    【解决方案1】:

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

    我相信这个警告是良性的,可以放心地忽略。当您阻止测试超时或允许测试成功运行完成时(通过阻止 AfterScenario 方法抛出),它就会消失。

    【讨论】:

    • 我差不多就是这么说的。我明确表示的是,我想删除发生这种情况时出现的误报。当您的测试运行充满误报时,这不是良性的。
    • 很抱歉,如果您认为这没有回答您的问题。我只是在解释这个警告是如何从 specflow 代码中产生的。防止警告的唯一方法是防止超时或停止后续方案方法中的异常,这会阻止运行清理的代码运行。另一种选择是修复 specflow 代码,以便在导致此问题的任何一种情况下清理场景。
    • 如果您在 specflow github 页面上提出问题,我会尝试看看可以采取哪些措施来解决它,但不能承诺任何时间表。
    • 您无法处置场景上下文。此问题存在于 specflow 基础架构中。
    • @SamHolder 实际上可以。
    【解决方案2】:

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

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

    在我看来,这也应该对你有用。

    【讨论】:

    • 这在一次运行多个测试时不起作用,因为如果一个失败,例如打到finally,那么司机就被处理掉了
    • 最终应该在每次测试后实际处理驱动程序,不管它是否失败。这就是最后的重点。
    • @Danny 因为这段代码写在标签'@After 场景下,不管场景如何,o/p 最终都会被执行并且驱动程序将被释放。
    【解决方案3】:
        private void DisposeSpecFlowContext()
        {
            try
            {
                var disposableContext = ScenarioContext.Current as IDisposable;
                disposableContext.Dispose();
            }
            catch
            {
            }
        }
    

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

    See here for explicit interface implementations.

    【讨论】:

    • 我认为这在某些情况下会有所帮助,但通常这不会解决问题吗?如果AfterScenario 方法在调用此方法之前抛出,那么我认为不会执行此方法。如果您在最后一个之前执行此操作,那么您将无法使用它,这可能是一个问题。真的这需要在基础设施代码中修复。我已经有一段时间没有进去看了,所以也许它已经……
    猜你喜欢
    • 2020-08-13
    • 2020-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-11
    • 2012-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多