为什么PHPUnit在我公司上的电脑测试失败非常慢?如果这是一个常见问题,我想作者早就已经改过了,我想是出于公司电脑的特殊性,公司电脑一共装了两个特殊的软件,一个是监控上网的,一个是隔离工作区和正常使用区。第二个软件的两个区是不可以随意通信的软件名称SDC,在隔离的工作只有少数的软件可以上网,而且对文件系统的操作都是有监控的,文件不能外发,我猜想每次操作它都监控了,这样导致PHPUnit在扫描它本身的文件时非常慢,巨慢无比。在我的Arch上,是秒杀的。刚开始时什么也不知道的,想用xhprof去找出时间都消耗在哪里,可惜我找的是一个PHPUnit的xhprof扩展,它不测试PHPUnit本身的性能。只能自己一个一个通过die(‘fuck’)去跟踪代码(比较笨)。
最终我找到了PHPUnit/Util/GlobalState.php文件,有一个函数phpunitFiles,查找PHPUnit框架自身框架的文件名,并添加到静态数组中,用处是在测试失败时,过滤丢出异常里的PHPUnit框架文件路径,从而只显示被测试函数的文件路径及行号。优化的第一步,我自然的想到了缓存,于是我把这个数组缓存起来了,从缓存中读取文件列表。
* @return array
* @since Method available since Release 3.6.0
*/
public static function phpunitFiles()
{
$cachefile = sys_get_temp_dir() . '/phpunit.cache' ;
if (!file_exists($cachefile) ) {
if (self::$phpunitFiles === NULL) {
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($cachefile,serialize(self::$phpunitFiles));
}else{
self::$phpunitFiles = unserialize(file_get_contents($cachefile));
}
return self::$phpunitFiles;
}
这不是PHPUnit的问题,而是我该死的。。you know..

