【问题标题】:Unit tests become slow when using Microsoft fakes in OTHER tests在 OTHER 测试中使用 Microsoft fakes 时单元测试变慢
【发布时间】:2013-11-01 09:59:06
【问题描述】:

我们有一个单元测试项目,它在许多测试中仍在使用“旧式”私有访问器。 由于它们是维护的噩梦,我们正试图摆脱它们,并迁移到新的 Microsoft Fakes 框架,并在需要时使用 Shims。

最近我们编写了一些使用 Shims 的新单元测试,并注意到由于某种原因,这会导致一些未修改的其他旧测试运行得相当慢。较慢是指受影响测试的运行时间约为 10 秒,而不是 900 毫秒。 不过,自行运行受影响的测试似乎没有这种效果 - 它仅在使用 Shims 进行测试后运行它们时才会发生。

最初我们认为这可能只是由于初始化问题,导致测试相互影响。 然而,经过一些实验,我们发现即使没有实际添加任何新的测试代码,也会出现减速。简单地在其中一个减慢的测试之前添加以下 sn-p 会导致测试运行速度变慢的相同效果:

using (ShimsContext.Create()) {} 

调试似乎表明正在测试的代码确实运行得慢得多(不是单元测试代码本身),但我们无法确定它的哪一部分。我们无法确定为什么这些测试会受到影响,而其他测试则不会。 此时我们尝试分析这些测试(使用 VisualStudio 中新的“分析测试”选项)。然而,事实证明,由于某种原因,无法使用 Shims 进行分析测试。抛出以下异常:

Microsoft.QualityTools.Testing.Fakes.UnitTestIsolation.UnitTestIsolationException:UnitTestIsolation 检测未能初始化。请重新启动 Visual Studio 并重新运行此测试

作为最后的手段,我们还尝试将所有使用 Shims 的测试转移到同一解决方案中的单独测试项目中。这似乎确实有所帮助,并且所有测试运行时间都恢复了正常。我们使用测试播放列表在其他项目之前运行每个项目的测试,并且在这两种情况下运行时间都还可以。但这并不是真正的解决方案,感觉更像是在规避实际问题。 所以,我们不确定如何进行。任何想法和想法都会有所帮助。

谢谢。

【问题讨论】:

  • 您是否正在使用 VS Test Runner 运行这些测试?还可以尝试删除您的测试项目并再次重新添加所有测试。包括旧的测试以及新的 Shims 单元测试。
  • 是的,我们正在使用 VS 测试运行器。您的建议似乎没有帮助...
  • 问题很可能与垫片的性质有关。创建 ShimsContext 时,您是在告诉代码您计划重定向方法,这可能表现为检查每个生成了 shim 的方法调用,以查看是否已分配任何重定向。

标签: c# .net performance unit-testing microsoft-fakes


【解决方案1】:

Microsoft 文档 Better Unit Testing with Microsoft Fakes (RTM).pdf 指出,使用 Shims 会降低性能。

本文还讨论了 Shims 对性能的影响: http://technet.microsoft.com/en-us/windows/jj863250.aspx

【讨论】:

    【解决方案2】:

    “其他”测试应在无垫片上下文 (ShimsContext.ExecuteWithoutShims) 中显式执行,因为看起来即使在其他测试中已处置的 ShimsContext 也可能会绕道不使用垫片的逻辑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-19
      • 2017-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多