我们有一个单元测试项目,在许多测试中仍然使用“旧式”私有访问器。 由于它们是维护的噩梦,我们正试图摆脱它们,并在必要时使用垫片转移到新的Microsoft Fakes框架。
最近我们编写了一些使用Shims的新单元测试,并注意到由于某种原因,这导致一些未经修改的旧的测试运行得相当慢。慢一点意味着受影响的测试的运行时间约为10秒而不是约900毫秒。 尽管运行受影响的测试似乎没有这种效果 - 它只会在使用Shims进行测试后运行时才会出现。
最初我们认为这可能仅仅是由于初始化问题,导致测试相互影响。 但是,经过一些实验,我们发现即使没有实际添加任何新的测试代码也会发生减速。只需在其中一个减慢的测试之前添加以下代码段,就会导致测试运行速度变慢:
using (ShimsContext.Create()) {}
调试似乎表明正在测试的代码确实运行得慢得多(不是单元测试代码本身),但我们无法识别它的哪一部分。我们无法确定为什么这些测试会受到影响,而其他测试却没有。 此时我们尝试分析这些测试(使用VisualStudio中新的“配置文件测试”选项)。但是,事实证明,由于某些原因,无法使用Shims进行性能分析测试。引发了以下异常:
Microsoft.QualityTools.Testing.Fakes.UnitTestIsolation.UnitTestIsolationException:UnitTestIsolation检测无法初始化。请重新启动Visual Studio并重新运行此测试
作为最后的手段,我们还尝试将所有使用Shims的测试移动到同一解决方案中的单独测试项目中。这似乎有所帮助,所有测试运行时间都恢复正常。我们使用测试播放列表在另一个项目之前运行每个项目的测试,并且在两种情况下运行时都可以。然而,这并不是一个真正的解决方案,而且更像是在规避实际问题。 所以,我们不确定如何继续。任何想法和想法都会有所帮助。
感谢。
答案 0 :(得分:3)
Microsoft文档,使用Microsoft Fakes进行更好的单元测试(RTM).pdf,声明在使用Shims时会看到性能下降。
本文还讨论了Shims的性能影响: http://technet.microsoft.com/en-us/windows/jj863250.aspx
答案 1 :(得分:0)
“其他”测试应该在无间隔上下文中显式执行(ShimsContext.ExecuteWithoutShims),因为看起来甚至在其他测试中处理ShimsContext可能会绕不到使用填充程序的逻辑。