分布式/更快的python单元测试

时间:2009-04-30 23:25:02

标签: python unit-testing

我为一个项目进行了很多python单元测试,并且它已经到了运行它们需要很长时间的程度。我不想添加更多,因为我知道他们会让事情变得更慢。人们如何解决这个问题?有没有简单的方法在集群上分发测试执行?

5 个答案:

答案 0 :(得分:4)

您不能经常运行所有测试,因为它们太慢了。这是你的项目变得越来越大的必然结果,并且不会消失。当然,你可以并行运行测试并获得一个很好的加速,但问题会在稍后回来,而且它永远不会像你的项目那么小。

为了提高工作效率,您需要能够在几秒钟内编码并运行相关的单元测试并获得结果。如果你有一个测试层次结构,你可以有效地做到这一点:为你经常工作的模块运行测试,偶尔进行你正在处理的组件的测试,以及不经常进行项目范围的测试(可能在你之前) “正在考虑检查它。您可能需要进行集成测试,或者可以在一夜之间运行的完整系统测试:此策略是该想法的延伸。

您需要做的就是组织代码和测试以支持层次结构。

答案 1 :(得分:3)

请参阅py.test,它能够将单元测试传递给一组计算机,或者Nose,它(从主干开始,不是当前发布的版本)支持与多处理模块并行运行测试。

答案 2 :(得分:2)

描述它们以查看真正的缓慢。您可以通过分发解决此问题。如果测试是真正的单元测试,那么我发现在多个执行引擎上运行测试没有太多问题。

答案 3 :(得分:1)

解决此问题的第一部分是仅运行需要运行的测试。在提交到共享分支之间,只运行一个新工作与之交互的测试;这应该花费全部五秒钟。如果采用这种模型,在提交共享资源之前,最重要的是要运行整个测试套件。

运行完整测试套件以进行回归的问题当然仍然存在,尽管通过简单地运行整个套件已经部分解决了这个问题。为了避免在该作业运行时等待,可以将测试任务卸载到另一台机器上。这很快就变成了一个持续集成系统的任务; buildbot似乎非常适合您的用例。

您还应该能够使用buildbot在主机上分发测试,解雇两个具有不同测试套件入口点的作业。但是我不相信这会在我提到的前两个步骤中获得更多的收益;它应该保留给测试运行时间比共享资源提交间隔时间长的情况。

D'A

[警告说:我对buildbot的理解在很大程度上是理论上的,而且它可能比它看起来更难。]

答案 4 :(得分:1)

编码时,只运行刚刚更改的类的测试,而不是整个项目中的所有测试。

但是,在提交代码之前运行所有测试仍然是一个好习惯(但Continuous Integration服务器可以为您执行此操作)。