phpunit – testing是痛苦的缓慢

我在unit testing的世界里越来越深入。

我遇到的一个问题,这是我想要的反馈,当一个运行多个testing套件,也许只是我,但我需要使用参数 – 进程隔离我的testing通过。 我可以单独运行我的任何套件,但没有问题,但是如果我运行时没有使用–process-isolation,那么运行我迄今为止拥有180个断言的6-7套件将会失败。 问题是使用这个参数使testing持续35分钟,而通常的2.5分钟。 这是一个懒惰的等待。

这个问题与使用模拟的DI容器进行特定的testing有关,当testing套件运行链接时容器不能正确地重新初始化。 在DI-Container上设置的静态属性可以testing预期的故障,使得以下套件中的testing失败。 容器有一个参数,可以将包含的对象保存在静态variables中,以便在每次调用时返回相同的实例。 一个变相的单身人士。 而且这在应用程序级别运行良好,这只是一个滋扰testing。

我可以避免这个容器参数,并编写应用程序不使用静态属性,但为方法的缘故避免一个有用的语言结构似乎是矫枉过正。

也许我做错了什么(我真的希望如此!)但是我有一个印象,如果一个人想在每个testing都以干净的状态运行SUTtesting,那么就不会使用–process-isolation。 这使得testing非常耗时,并且从中获得一点乐趣。 我在编码时单独运行套件和testing,并在主要提交之前在后台运行套件,从而绕过了这个问题。

是我正在经历的正常,有没有办法对付这个? 你如何确保testing时间是合理的? 如何处理静态以便不影响testing?

任何洞察赞赏/评论赞赏。

你有几个问题。

首先是进程隔离。 通常情况下,这不应该是必要的,你只是想用它来找出哪个特定的testing是致命的打破你的testing。 当你注意到自己,这是非常缓慢,这是你不能修复。 不过,您可能想要禁用备份每次testing可以节省一些毫秒的全局variables

导致你的第一个问题的第二个问题是,你的代码是不可testing的,因为静态variables是在testing期间保存的 – 我最讨厌的单例问题。 您可以通过在依赖容器中提供“清除”或“重置”方法来解决这个问题。 这些将从您的主要testing用例类中的setUp()方法中调用,并将所有内容重置为干净状态。

速度

关于testing的运行时间 – 我最近写了一篇关于找出哪些testing太慢的博客文章 。 通常情况下,如果在保存文件或每次提交之后无法运行testing,则testing速度太慢。 10秒对我来说是勉强可以接受的。 你有更多的testing,运行速度会越慢。

如果你真的有35分钟的时间,那么把你的testing分成合理的组,这样你就可以在你自己的机器上运行必要的testing – 只有那些testing你testing了代码的testing。 Pyrus是下一代PEAR安装程序,具有可以自动检测并运行需要运行的testing的function,具体取决于您更改的文件。 PHPUnit没有,但你可以手动模拟和phpunit --group .. 🙂

始终照顾嘲笑的Web服务和数据库,或至less运行数据库只有每个单一的testing必要的数据。 在validation是否可以将用户保存到数据库的testing中等待3秒钟的Web服务响应是您永远不想要的。

一些技巧;

  1. 过滤你的testing用例lfor例如,如果你想testingonw文件,只需要

    phpunit –filter'Default_My_Test'

  2. 在你的phpunit.xml文件中删除代码覆盖。 如果你想获得代码覆盖率:

    phpunit –coverage-html ./report reportTest

我通常做的事情之一,当我testing与MySQL而不是SQLite的:memory:我添加Hash::setRounds(5); 里面的tests/CreatesApplication.php像这样的特质。 我经历过这样会使得testing尤其是与MySQL更快:

 public function createApplication() { $app = require __DIR__ . '/../bootstrap/app.php'; $app->make(Kernel::class)->bootstrap(); // TODO: DON'T FORGET TO IMPORT HASH OBJECT ON TOP Hash::setRounds(5); return $app; }