3

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

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

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

using (ShimsContext.Create()) {} 

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

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

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

谢谢。

4

2 回答 2

3

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

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

于 2014-02-17T21:40:50.630 回答
0

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

于 2014-08-28T12:18:09.327 回答