2013-03-08 89 views
7

我有一个PHP部署脚本,我想先运行PHPUnit测试,并在测试失败时停止。我一直在使用googling,很难找到关于从php运行单元测试的文档,而不是从命令行工具。你可以从脚本运行PHPUnit测试吗?

对于PHPUnit的最新版本,你可以这样做:

$unit_tests = new PHPUnit('my_tests_dir'); 
$passed = $unit_tests->run(); 

最好,不需要我来手动指定每个测试套件的解决方案。

+0

PHPUnit的船舶。你可以[看看testrunner](https://github.com/sebastianbergmann/phpunit/blob/master/PHPUnit/TextUI/TestRunner.php)它包含了从脚本运行phpunit的代码。 – hakre 2013-03-08 20:14:25

+0

好提示!是否有任何预先实施的方法来收集我的所有测试套件来运行? – Charles 2013-03-08 21:46:53

+0

我有点惊讶,这不是一件很常见的事情。有没有更好的方法来在部署时进行所有的单元测试? – Charles 2013-03-08 22:00:27

回答

5

想通了:

$phpunit = new PHPUnit_TextUI_TestRunner; 

try { 
    $test_results = $phpunit->dorun($phpunit->getTest(__DIR__, '', 'Test.php')); 
} catch (PHPUnit_Framework_Exception $e) { 
    print $e->getMessage() . "\n"; 
    die ("Unit tests failed."); 
} 
+0

在上面的示例中,我们如何从$ test_results对象获取文本报告详细信息? – emeraldjava 2017-07-28 15:23:31

5

最简单的方法是通过实例化类PHPUnit_TextUI_Command的对象。

所以这里有一个例子:

require '/usr/share/php/PHPUnit/Autoload.php'; 

function dummy($input) 
{ 
    return ''; 
} 

//Prevent PHPUnit from outputing anything 
ob_start('dummy'); 

//Run PHPUnit and log results to results.xml in junit format 
$command = new PHPUnit_TextUI_Command; 
$command->run(array('phpunit', '--log-junit', 'results.xml', 'PHPUnitTest.php'), 
       true); 

ob_end_clean(); 

这样的结果会在JUnit的格式results.xml文件,可以解析被记录。如果你需要不同的格式,你可以检查documentation。您也可以通过更改传递给run方法的数组来添加更多选项。

0

它似乎并不像PHPUnit的具有任何内置配置,以防止它直接倾倒其输出到响应(至少不是作为PHPUnit的5.7)。

所以,我使用ob_start分流输出到一个变量,以及doRun第三个参数设置为false以防止从PHPUnit的暂停脚本:与源

<?php 

$suite = new PHPUnit_Framework_TestSuite(); 
$suite->addTestSuite('App\Tests\DatabaseTests'); 

// Shunt output of PHPUnit to a variable 
ob_start(); 
$runner = new PHPUnit_TextUI_TestRunner; 
$runner->doRun($suite, [], false); 
$result = ob_get_clean(); 

// Print the output of PHPUnit wherever you want 
print_r($result);