如何处理长时间运行的单元测试?

时间:2008-12-15 15:02:13

标签: performance unit-testing http tdd legacy

我有大约100个单元测试,覆盖率为%20,我正在尝试增加覆盖率,这也是一个正在开发的项目,所以不断添加新的测试。

目前在每次构建之后运行我的测试是不可行的,他们需要大约2个时刻。

测试包括:

  • 从测试文件夹中读取文件(数据驱动样式以模拟某些HTTP内容)
  • 对本地Web服务器执行实际的HTTP请求(这是一个非常痛苦的模拟,所以我不会)
  • 不是所有的单元测试,但也有相当复杂的多线程类需要测试,我测试测试的整体行为。这可以被视为功能测试,但也需要每次都运行。

大多数功能都需要读取HTTP,执行TCP等。我无法更改它们,因为如果我更改这些测试就是项目的全部概念,测试内容将毫无意义。

此外,我认为我没有最快的工具来运行单元测试。我当前的设置使用VS TS与Gallio和nUnit作为框架。我认为VS TS + Gallio也比其他人慢一些。

你会建议我解决这个问题?我想在每一点点改变之后运行单元测试btu目前这个问题正在打断我的流程。

进一步澄清编辑:

代码高度耦合!不幸的是,变化就像一个巨大的复原过程。并且有一个鸡蛋综合症,我需要进行单元测试来重构这么大的代码,但如果我不重构那么我就不能有更多的单元测试:)

高度耦合的代码不允许我将测试分成更小的块。此外,我不测试私人物品,这是个人选择,这使我能够更快地发展并仍然获得大量的利益。

我可以确认所有单元测试(具有适当的隔离)实际上非常快,并且我没有性能问题。


进一步澄清:

代码高度耦合!不幸的是,变化就像一个巨大的复原过程。并且有一个鸡蛋综合症,我需要进行单元测试来重构这么大的代码,但如果我不重构那么我就不能有更多的单元测试:)

高度耦合的代码不允许我将测试分成更小的块。此外,我不测试私人物品,这是个人选择,这使我能够更快地发展并仍然获得大量的利益。

我可以确认所有单元测试(具有适当的隔离)实际上非常快,并且我没有性能问题。

6 个答案:

答案 0 :(得分:10)

这听起来不像我的单元测试,但更像是功能测试。这很好,自动化功能测试很好,但功能测试很慢很常见。他们正在测试整个系统(或大部分系统)。

单元测试往往很快,因为他们正在测试一件与其他事物隔离的东西。如果您无法独立于其他所有事情进行测试,则应考虑编码的警告标志紧密耦合

你能告诉你哪些测试是单元测试(仅测试1件事)和功能测试(同时测试2件或更多件事)?哪些是快的,哪些是慢的?

答案 1 :(得分:7)

您可以将测试分为两组,一组用于短测试,一组用于长时间运行的测试,并且在每次更改后运行短测试时,不经常运行长时间运行的测试。除此之外,模拟来自网络服务器的响应以及您的应用程序所做的其他请求将导致更短的测试运行。

答案 2 :(得分:7)

我建议您采用综合方法解决问题:

  • 经常运行与您更改的代码相近的测试子集(例如,来自相同包,模块或类似的测试)。运行较少的测试会从您当前正在处理的代码中进一步删除。
  • 将套件分成至少两个:快速运行和慢速运行测试。更频繁地运行快速运行测试。
  • 考虑让一些不太可能失败的测试只能由自动化的持续集成服务器执行。
  • 学习提高测试性能的技巧。最重要的是通过更快的假货取代对慢速系统资源的访问。例如,在内存流而不是文件中使用。存根/模拟http访问。等
  • 了解如何使用低风险依赖性破坏技术,例如(强烈推荐的)“有效使用遗留代码”一书中列出的技术。这些允许您在不应用高风险重构的情况下有效地使您的代码更易于测试(通常通过暂时使实际设计变得更糟,例如打破封装,直到您可以使用测试的安全网重构更好的设计)。

我从上面提到的那本书中学到的最重要的事情之一:没有魔法,使用遗留代码痛苦,并且总是痛苦。你所能做的只是接受这个事实,并尽力慢慢地摆脱困境。

答案 3 :(得分:3)

首先,这些不是单元测试。

在每次小小的改变之后,运行这样的功能测试并没有多少意义。经过大规模的更改后,您将需要运行功能测试。

其次,不要害怕嘲笑应用程序的Http部分。如果你真的想对应用程序进行单元测试,那就必须进行。如果您不愿意这样做,那么您将浪费更多时间来测试您的实际逻辑,等待HTTP请求返回并尝试设置数据。

我会继续进行集成级别测试,但要努力创建真正的单元测试。这将解决您的速度问题。实际单元测试没有数据库交互或HTTP交互。

答案 4 :(得分:1)

我总是使用“LongTest”类别。这些测试每晚执行,而不是在白天执行。这样你可以减少很多等待时间。试一试:将您的单元测试分类。

答案 5 :(得分:1)

听起来您可能还需要在开发团队中管理期望。

我认为人们每天都会进行多次构建,并且每次构建后都会遇到运行测试的问题。您可能我们可以很好地切换您的测试计划,以便在午餐期间运行测试,然后再过夜。

我同意布拉德这些声音就像是功能测试。如果你可以将代码分开,这将是很好的,但在那之前我会切换到不太频繁的测试。