首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >phpunit - testing非常慢

phpunit - testing非常慢
EN

Stack Overflow用户
提问于 2011-05-29 19:04:29
回答 3查看 22K关注 0票数 47

我对单元测试的研究越来越深入。

我遇到的一个问题,也是我希望得到反馈的地方,是当一个人运行多个测试套件时,可能只有我一个人,但我需要使用参数--进程隔离来通过我的测试。我可以单独运行我的任何一个套件,没有问题,但是如果我运行时没有--进程隔离,那么运行到目前为止我拥有的6-7个套件和分布在它们之间的180个断言将失败。问题是,使用此参数会使测试运行持续35分钟,而通常为2.5分钟。这是一个漫长的等待。

该问题与使用模拟DI容器进行特定测试有关,并且当测试套件以链式方式运行时,容器未正确重新初始化。为测试预期失败而在DI-Container上设置的静态属性会使以下套件中的测试失败。容器有一个参数,可以将包含的对象保存在静态变量中,以便在每次调用时返回相同的实例。一个伪装的独生子。这在应用程序级别上运行得很好,只是测试的麻烦。

我可以避免使用容器参数,并将应用程序编码为不使用静态属性,但为了方法论而避免使用有用的语言构造似乎有点过头了。

也许我做错了什么(我当然希望如此!)但我的印象是,如果有人想在每次测试中都以干净的状态使用SUT运行测试,那么就没有办法使用--进程--隔离。这使得测试变得非常耗时,并使joy少花了一点时间。我在编写代码时单独运行套件和测试,并在主要提交之前在后台运行套件,从而在某种程度上绕过了这个问题。

我正在经历的是正常的吗,有什么方法可以解决这个问题吗?你们的测试人员如何确保测试时间是合理的?如何在不影响测试的情况下处理静态?

欣赏任何洞察力/评论。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-29 20:26:37

你有几个问题。

第一个是进程隔离。通常,它不应该是必要的,您只想使用它来找出哪个特定的测试会致命地破坏您的测试。正如您自己指出的那样,它非常慢,这是您无法修复的。不过,您可能希望禁用备份全局变量,这样可以为每个测试节省一些毫秒。

第二个问题导致了你的第一个问题,那就是你的代码是不可测试的,因为静态变量是在测试过程中保存的--我最讨厌的单例问题。您可以通过在依赖项容器中提供"cleanup“或"reset”方法来解决该问题。这些将从您的主测试用例类中的setUp()方法调用,并将所有内容重置为干净的状态。

速度

关于测试的运行时--我最近写了一篇关于找出哪些测试太慢的blog entry。通常,如果在保存文件或在您自己的机器上每次提交后不能运行测试,那么测试就太慢了。10秒对我来说是很难接受的。你有的测试越多,运行它们的速度就越慢。

如果你真的有35分钟的时间,那么把你的测试分成合理的组,这样你就可以在你自己的机器上运行必要的测试-只运行测试你更改的代码的测试。下一代PEAR安装程序Pyrus具有automatically detect and run the tests that need to be run的出色特性,这取决于您更改了哪些文件。PHPUnit没有这样的功能,但您可以手动和phpunit --group ..进行模拟:)

始终注意模拟web服务和数据库,或者至少使用每个单独测试所需的数据来运行数据库。在验证您是否可以将用户保存到数据库的测试中,等待3秒的web服务响应是您永远不想要的。

票数 38
EN

Stack Overflow用户

发布于 2017-11-02 02:29:40

当我使用MySQL而不是SQLite的:memory:进行测试时,我通常会做的一件事就是在tests/CreatesApplication.php特征中添加Hash::setRounds(5);,如下所示。我的经验是,这将使测试变得更快,特别是使用MySQL时:

代码语言:javascript
复制
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;
}
票数 4
EN

Stack Overflow用户

发布于 2011-07-06 15:22:58

一些技巧;

  1. 过滤你的测试用例例如,如果你想测试一个文件,只需要

代码语言:javascript
复制
    phpunit --filter 'Default_My_Test'

  1. 正在删除phpunit.xml文件中的代码覆盖率。如果你想得到一个代码覆盖率,那就去做:

代码语言:javascript
复制
    phpunit --coverage-html ./report reportTest
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6167382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档