嗨,在我的项目中,我们有数百个测试用例。这些测试用例是构建过程的一部分,在每次签入时都会触发并将邮件发送到我们的开发人员组。这个项目相当大,已经有五年多了。
现在我们有这么多测试用例,构建需要一个多小时。有些测试用例的结构不正确,在重构它们之后,我能够大大减少运行时间,但是我们有数百个测试用例,并且一个一个地重构它们一个似乎有点太多了。
现在我运行一些测试用例(这需要很长时间才能执行)仅作为夜间构建的一部分,而不是作为每次签入的一部分。
我很好奇其他人是如何做到这一点的。
3 回答
我相信他在“有效地使用遗留代码”中说,如果您的测试套件花费的时间超过几分钟,它将大大降低开发人员的速度,并且测试将开始被忽视。听起来你正在掉进那个陷阱。
您的测试用例是否针对数据库运行?那么这很可能是您性能问题的最大来源。作为一般规则,如果可能的话,测试用例不应该进行 I/O。依赖注入可以让您用模拟代码的数据库部分的模拟对象替换数据库对象。这使您可以测试代码而不必担心数据库是否设置正确。
我强烈推荐Michael Feathers 的《有效使用遗留代码》 。他讨论了如何处理您似乎遇到的许多令人头疼的问题,而无需一次全部重构代码。
更新:
另一个可能的帮助是 NDbUnit。我还没有广泛使用它,但它看起来很有希望:http ://code.google.com/p/ndbunit/
也许您可以考虑保留您的 oracle 数据库但从内存驱动器运行它?它不需要很大,因为它只包含测试数据。
我们有大约 1000 个测试,其中很大一部分通过 REST 通信并访问数据库。总运行时间约为 8 分钟。一个小时似乎太长了,但我不知道您在做什么以及您的测试有多复杂。
但我认为有一种方法可以帮助你。我们正在使用 TeamCity,它有一个很好的能力来拥有多个构建代理。您可以做的是将您的测试项目拆分为子项目,每个子项目仅包含一些测试。您可以使用 JNunit/NUnit 类别来分隔它们。然后,您将配置 TeamCity,以便每个代理只构建一种类型的子项目。这样,您将获得并行执行测试。使用很少的代理(您可以免费获得 3 个),您应该能够达到 20 分钟,这甚至是可以接受的。如果您将每个代理放入 VM,您甚至可能不需要额外的机器,您只需要大量 RAM。