在大型 c# 项目中进行 TDD 时如何处理缓慢的单元测试

How to deal with slow unit tests while doing TDD in large c# project

使用 visual studio 2017 NUnit 和 resharper 测试运行器,在大型 c# 项目(5000+)测试中进行 TDD 时如何保持良好的单元测试速度。即使这些测试中的每一个只需要 5 毫秒,也就是 25 秒,这对于 TDD 周期来说是相当慢的。

我们的测试不调用数据库,也不调用外部网络服务。他们只测试业务逻辑。

我发现使用最小起订量,单独执行 Mock.Setup() 需要将近 1 毫秒。由于每个测试我们可能有一些最小起订量设置调用,这是我们缓慢的单元测试的主要原因。

有什么方法可以加快单元测试速度吗?有没有比最小起订量更快的模拟库?或者可能是另一个更快的测试运行器?

你走错了路:总体 运行你所有单元测试的时间仍然在一个非常合理的范围内!

在进行开发(可能使用 TDD)时,您不关心 所有 单元测试。您只关心与当前 component/package/... !

相关的那些

如:当您在文件 A 中进行更改时,您可能想要(手动)运行 目录 A 所在的所有单元测试。您创建另一个小改动,你 运行 再次测试这些。

然后,稍后,当您想到:"I am done for now"、然后时,您调用所有单元测试,以确保您没有破坏另一端的东西通过重新布置这边那个房间里的家具来改造这座建筑。

所以,答案是:你很好,别担心。

我们有 5000 多个 Java 单元测试。在我们最快的构建服务器上,完成所有这些操作可能需要大约 10 分钟。但这仍然可以。后端构建在 20 分钟后仍然返回并告诉我们 "broken" 或 "all fine"。为什么?因为构建服务器只有在我确定我的更改集已完成时才会启动,并且我将其推送到服务器。

当这 25 秒成为问题时,因为您 运行 宁 所有 测试过于频繁,因为您手动触发它们。现在:在以有效的方式解决特定问题时,宁可花精力想办法只 运行 相关 测试。 (在使用 JUnit 的 Java 中,这很简单:我单击当前包,然后转到“运行 所有测试都在这里)

考虑取消大部分测试。

虽然我在单元测试和 TDD 方面没有很多经验,但我 的有限经验表明大多数单元测试都毫无用处。并且有经验的人支持我的观点,作为这个观点的例子,可以参考这两篇文章:

我不确定这个讨论的连续性(即谁是第一个提出来的),但是这里有几个人参考了上面的文章并同意它,并且可能会添加一些他们的自己的积分:

请注意,争论根本不是关于测试,而是关于广泛的单元测试,而不是集成和系统级测试。