如何提高单元测试的效率?

时间:2013-01-30 10:23:57

标签: junit phpunit performance xunit

我们正在为现有的代码库创建单元测试用例,而在创建测试用例的过程中,测试文件的大小越来越大,并且非常重要执行时间很长。

我知道单元测试的局限性,我也做了一些研究来提高效率。在研究过程中,我发现了一个有用的想法来收紧提供的数据集。

我还在寻找更多关于如何提高运行/创建单元测试用例效率的想法?我们可以保留选项来增加此范围之外的服务器资源。

1 个答案:

答案 0 :(得分:0)

由于你的问题很普遍,我将介绍一些常见的选择。但大多数加速技术都有缺点。

如果您对外部组件(Web服务,文件系统等)有依赖性,您可以通过模拟它们来加快速度。无论如何,这通常适用于单元测试。您仍然需要使用真实组件进行集成/功能测试。

如果测试数据库,你可以通过使用内存数据库来获得相当快的速度(sqlite适用于PHP的PDO; java可能是H2?)。这可以有downsides,除非数据库可移植性已经是设计目标。 (我将要针对MySQL和sqlite运行一组单元测试。)完全模拟数据库(见上文)可能会更好。

PHPUnit允许您在每个测试中指定@group。您可以使用@group slow标记较慢的测试,然后使用--exclude-group命令行标记在大多数测试运行中排除它们,并将它们包含在隔夜构建中。 (您也可以在phpunit.xml.dist文件中specify groups to include/exclude。 (我不认为jUnit有这个选项,但TestNG没有;对于C#,NUnit offers categories就是这样。)

创建一次夹具,然后在测试之间共享它们比在每次测试之前创建夹具更快。 XUnit测试模式将整个章节用于这种方法的优缺点(主要是缺点)。

我知道在其中投掷硬件在您的问题中被明确禁止,但再次查看@group,并考虑它如何允许您跨多台计算机拆分测试。或者按目录拆分测试,并在LAN上的多台计算机上处​​理一个目录。 (PHPUnit是单线程的,因此您可以在同一台机器上运行多个实例,每个实例都在执行自己的目录:了解fixtures如何独立(包括您创建的数据库的唯一名称,模拟文件系统等),如果你走这条路。)