【问题标题】:Why does Run All cause a crash in VS2012 unit testing but running one by one doesn't?为什么 Run All 会导致 VS2012 单元测试崩溃,而一个一个运行却不会?
【发布时间】:2013-10-03 21:35:11
【问题描述】:

我们刚刚从 Visual Studio 2008“升级”到 Visual Studio 2012。我们更新了单元测试,现在它们在单独运行时通过了,但是当我尝试全部运行时,出现以下错误:

The active Test Run was aborted because the execution process exited unexpectedly. To investigate further, enable local crash dumps either 
at the machine level or for process vstest.executionengine.appcontainer.x86.exe. Go to more details: [http://go.microsoft.com/fwlink/?linkid=232477][1]

所以我去了link 并按照说明添加注册表项以启用本地故障转储。然后错误信息变为:

The active Test Run was aborted because the execution process exited unexpectedly. Check the execution process logs for more information. 
If the logs are not enabled, then enable the logs and try again.

显然它注意到了我在注册表中为启用崩溃所做的更改。但是,当我查看 %LOCALAPPDATA%\CrashDumps 时,没有创建任何文件。

如果我一次运行一个测试(甚至一次运行几个测试),我可以让它们全部通过。问题仅在于 Run All。

有没有其他人遇到过类似的问题?如果有,你是怎么解决的?

MSDN 上提出了基本相同的问题,但答案类似于“单击故障转储的链接”。该答案对我没有帮助,因为我没有看到任何指向故障转储的链接,并且我无法生成故障转储。

StackOverflow 上的This question 也类似,最终导致bug being logged on Microsoft Connect(由于某种原因看起来被推迟了),但我的问题可能不同,因为我的代码与“异步任务”无关(我不认为)。

编辑:问题似乎自行消失了,但问题可能是单元测试代码中未捕获的异常,正如下面的一些答案所暗示的那样。但是,我仍然很困惑为什么问题只出现在 Run All 中,而不是在运行较小的测试组或 Debug All 时出现。

【问题讨论】:

  • 您是否能够运行测试子集并使其崩溃?如果没有看到您的代码,很难猜测可能导致问题的原因。
  • @MikeParkhill 是的,如果我将测试分成足够小的子集,它们都可以运行而不会崩溃。
  • 我想要解决的是是否存在导致崩溃的特定子集。可能是一两个测试一起导致了问题。知道哪些可能会暴露问题。
  • 奇怪的是,没有。好像没有模式。我跑了所有,它失败了。然后我可能跑了 50 次,但它失败了。然后我运行 25 并且它可以工作。然后接下来的25个工作呢!换句话说,我不能把它缩小到一个特定的测试或一组测试。如果我尝试越来越小的小组,每个测试最终都会通过。
  • 自救..有趣的VS!

标签: unit-testing visual-studio-2012


【解决方案1】:

我遇到了同样的问题,测试显然无缘无故地失败了。后来我发现一个错误的方法导致了StackOverflowException。当我修复我的错误时,VS 错误消失了。

也许它在大多数情况下都能正常工作,因为您没有运行错误的代码。

【讨论】:

  • 使用了@interrobang 的答案并得到了您的 StackOverflowException。我意识到我的一个类(classA)初始化了另一个类对象(classB),而classB初始化了一个classA。这造成了某种无限循环,但没有 for 循环可供寻找,所以我很困惑。
  • 对我来说也是StackOverflowException。当 SOE 被触发时,Debug All Tests 工作并实际产生了一个程序错误,这让我可以中断并检查调用堆栈。
  • 我也遇到过 StackOverFlowException
  • 我还有一个堆栈溢出错误(通过从未满足其基本情况的递归方法)。我不能称它为 StackOverFlowException b/c,显然/令人沮丧的是,没有抛出异常。
【解决方案2】:

到目前为止,我最好的解决方法是全部调试。这是通过 TEST -> Debug -> All Tests 完成的。它显然速度较慢,但​​不会崩溃。

【讨论】:

  • 感谢这帮助我确定了问题。这是一个 stackoverflow 异常。
  • 知道为什么会这样吗?当我右键单击 > 运行测试时,我的 VS 崩溃了。但是,如果我执行 Test > Run All Tests 或 Test > Debug All Tests 它工作正常......我的猜测是右键单击快捷方式运行不同的命令,并且以某种方式被破坏,但是以单击测试工具栏按钮开始的命令是不是吗?
【解决方案3】:

这可能发生在某些错误中,例如 stackoverflow。大概这会使测试运行程序崩溃,因此当它遇到导致问题的测试时它无法继续。

因此,解决方案是在调试中运行所有测试(从“测试”->“调试”菜单),Visual Studio 将显示此类错误。

【讨论】:

    【解决方案4】:

    对于将来可能需要此功能的其他人:当通过单元测试执行控制台特定命令 (Environment.Exit(-1);) 时,我的测试运行程序崩溃了。即使在调试模式下运行也会崩溃 - 我无法获得有用的错误消息。

    所以我的场景与主要问题场景不同,因为 a) 调试根本不起作用 b) 全部运行与单独运行没有区别。那是因为我的错误场景总是出现,但原始问题的堆栈溢出并没有出现。

    底线:测试运行器很糟糕,如果它发现它不喜欢的东西就会崩溃。您需要手动隔离并找出 Bad Thing™ 是什么。

    【讨论】:

      【解决方案5】:

      对于寻找这个的其他人:我有一些调用 System.Environment.Exit(123) 的代码,但我没有意识到这一点。所以检查是否有任何终止进程的代码。

      【讨论】:

        【解决方案6】:

        我也遇到了同样的问题。原来那是我的代码——WCF 服务调用存在无限循环。在你的情况下,这可能是别的东西。所以我的建议是要么记住(版本控制系统中的日志?),要么找出(通过从运行中排除不同的测试,例如使用二分法)在代码中导致这种行为的位置。还有哇!这是问题的原因,同时也是代码中的错误。

        更新 至于您编辑中的问题。运行较小的测试组可能不会重现该问题。在这种情况下,鉴于这些组包括所有测试,可以假设某些测试会干扰。也许测试类中的一些静态数据或字段? 至于在调试模式下运行测试 - 我并不感到惊讶。 Visual Studio 测试运行器在“运行”模式与“调试”模式下的行为不同。

        【讨论】:

        • 感谢您的回答。我相信您是对的,我已对我的问题进行了编辑。
        【解决方案7】:

        我遇到了类似的问题,只是它不是 stackoverflow 异常。这是由我使用 Entity Framework 测试的项目和包含在 EntityFramework 和 EntityFramework.SqlServer 模块中的 NUnit 项目 not having references 引起的。添加对实体框架模块的引用修复了它。

        【讨论】:

          【解决方案8】:

          刚刚遇到同样的问题。关闭并重新打开 Visual Studio 为我解决了这个问题。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-03-27
            • 1970-01-01
            • 1970-01-01
            • 2011-04-14
            • 2021-06-28
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多