断言失败时phpunit运行速度非常慢

标签 php phpunit

我正在研究 phpunit,我注意到当我的断言失败时,摘要需要很长时间才能显示结果(但在测试正确时则不会)。

例如,如果我运行此测试,则需要半秒才能显示绿色条:

<?php
class SomeTest extends PHPUnit_Framework_TestCase {

    public function testSomething() {
        $this->assertTrue(true);
    }
}
?>

但是使用失败断言的相同测试需要 12 秒才能显示红色条:

<?php
class SomeTest extends PHPUnit_Framework_TestCase {

    public function testSomething() {
        $this->assertTrue(false);
    }
}
?>

现在,如果我需要在开发过程中不断运行测试,那么这个时间是 Not Acceptable 。 我可以做什么来加快这个过程?

最佳答案

自从我在 Windows 7 盒子上升级到 php 5.4/phpunit 3.7.24 以来,我遇到了同样的问题。 我调试后发现 PHPUnit_Util_GlobalState#phpunitFiles() 是罪魁祸首,它花费了大约 7 秒的时间查找 PHPUnit 和 PEAR 文件以从堆栈跟踪中过滤掉。

我提出了一个问题:https://github.com/sebastianbergmann/phpunit/issues/1007

目前作为解决方法,我将尝试将文件数组缓存在磁盘上

public static function phpunitFiles()
{
    if (self::$phpunitFiles === NULL) {
        $phpunitFilesCache = '/path/to/my/file/phpunitFiles'; // CHANGED
        if (is_file($phpunitFilesCache)) { // CHANGED
            self::$phpunitFiles = unserialize(file_get_contents($phpunitFilesCache)); // CHANGED
            return self::$phpunitFiles; // CHANGED
        } // CHANGED
        self::addDirectoryContainingClassToPHPUnitFilesList('File_Iterator');
        self::addDirectoryContainingClassToPHPUnitFilesList('PHP_CodeCoverage');
        self::addDirectoryContainingClassToPHPUnitFilesList('PHP_Invoker');
        self::addDirectoryContainingClassToPHPUnitFilesList('PHP_Timer');
        self::addDirectoryContainingClassToPHPUnitFilesList('PHP_Token');
        self::addDirectoryContainingClassToPHPUnitFilesList('PHPUnit_Framework_TestCase', 2);
        self::addDirectoryContainingClassToPHPUnitFilesList('PHPUnit_Extensions_Database_TestCase', 2);
        self::addDirectoryContainingClassToPHPUnitFilesList('PHPUnit_Framework_MockObject_Generator', 2);
        self::addDirectoryContainingClassToPHPUnitFilesList('PHPUnit_Extensions_SeleniumTestCase', 2);
        self::addDirectoryContainingClassToPHPUnitFilesList('PHPUnit_Extensions_Story_TestCase', 2);
        self::addDirectoryContainingClassToPHPUnitFilesList('Text_Template');

        file_put_contents($phpunitFilesCache, serialize(self::$phpunitFiles)); // CHANGED
    }

    return self::$phpunitFiles;
}

关于断言失败时phpunit运行速度非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17124190/

相关文章:

php - 当用户阅读时将论坛标记为已读,然后在发布新回复时标记为新

php - 如何在 wordpress 中创建带有限制语句的 RSS 提要

php - 动态包含 设置默认包含 PHP

php - 如何在 PHPUnit 测试中覆盖 Laravel 的异常处理程序?

unit-testing - 测试抽象类

php - 使用 JavaScript 重定向到 PHP 脚本中的动态 href

php - "Web interface"到 PHPUnit 测试?

php - 文件导入导出模块的单元测试

php - 模拟 HTTP 请求进行单元测试

javascript - 使用 JS 或 PHP 在另一个网站上创建帐户