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

时间:2013-06-15 13:30:26

标签: 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);
    }
}
?>

现在,如果我需要在开发期间连续运行测试,这个时间是不可接受的。 我该怎么做才能加快这个过程?

1 个答案:

答案 0 :(得分:3)

自从我在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;
}