php - 集成测试中的并行 PHPUnit 测试

标签 php unit-testing phpunit integration-testing parallel-testing

随着运行完整 PHPUnit 套件所需时间的增加,我们的团队开始考虑是否有可能并行运行单元测试。最近我读了一篇关于 Paraunit 的文章,也是 Sebastian Bergman 写的,他将在 PHPUnit 3.7 中添加并行性。

但是集成测试仍存在问题,或者更一般地说,与数据库交互的测试。为了保持一致性,每次测试后都必须重置 testDB 并加载 fixtures。但是在并行测试中存在竞争条件问题,因为所有进程都使用相同的数据库

因此,为了能够并行运行集成测试,我们必须为每个进程分配自己的数据库。我想问一下,是否有人对如何解决这个问题有一些想法。也许已经在另一个 xUnit 实现中针对这个问题实现了解决方案。

在我的团队中,我们使用的是 MongoDB,因此一种解决方案是以编程方式为每个 PHPUnit 进程创建一个配置文件,生成数据库名称(为此进程),并在 setUp() 方法中我们可以将主 TestDb 克隆到这个临时的中。但在我们开始实现这种方法之前,我想征求您对这个主题的看法。

最佳答案

这是一个很好的问题:准备并行单元测试需要学习一些新的最佳实践,我怀疑其中一些会减慢我们的测试速度。

最高级别的建议是:尽可能避免使用数据库进行测试。抽象与数据库的所有交互,然后模拟该类。但是您已经注意到您的问题是关于集成测试的,而这是不可能的。

在使用PDO时,我一般使用sqlite::memory:每个测试都有自己的数据库。它是匿名的,并在测试结束时自动清理。 (但是当你的实际应用程序不使用 sqlite 时,我注意到一些问题:Suggestions to avoid DB deps when using an in-memory sqlite DB to speed up unit tests)

当使用没有内存选择的数据库时,使用随机名称创建数据库。如果并行化在 PHPUnit 进程级别,相当粗糙,您可以使用进程 pid。但这与随机名称相比并没有真正的优势。 (我知道 PHP 是单线程的,但也许将来我们会有一个自定义的 phpUnit 模块,它使用线程并行运行测试;我们不妨为此做好准备。)

如果您有 xUnit 测试模式一书,第 13 章是关于测试数据库的(相对较短)。第 8 章和第 9 章关于瞬时与持久固定装置的对比也很有用。当然,本书的大部分内容都是关于抽象层的,以使模拟更容易:-)

关于php - 集成测试中的并行 PHPUnit 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17019763/

相关文章:

zend-framework2 - 如何 phpunit 测试 $_SERVER ['REMOTE_ADDR' ]

php - str_replace() 与关联数组

swift - viewDidLoad 后未在测试中设置 XCTest 单元测试数据响应

phpunit - PhpStorm: "Run with coverage"结果为 "Cannot load Xdebug - extension already loaded"

PHPunit - 测试自定义错误处理类

objective-c - Objective-C - 单元测试和模拟对象?

php - xdebug 配置显示错误版本的 php

php - 如果模块位置有模块,如何将类名添加到 body 标签?

php - 在 MySQL : "Integrity constraint violation" 中创建记录时出错

ruby-on-rails - 未初始化的常量设计 RSPEC