2013-03-08 90 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);