2013-03-08 2 views
7

У меня есть сценарий развертывания PHP, который я хочу сначала запустить тесты PHPUnit, и остановится, если тесты не сработают. Я много разбираюсь в этом, и очень сложно найти документацию по запуску модульных тестов из 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

+0

Хороший намек! Есть ли какой-либо заранее реализованный способ собрать все мои тестовые классы для запуска? – Charles

+0

Я немного удивлен, что это не очень обычная вещь. Есть ли лучший способ автоматически запускать все ваши модульные тесты, когда вы делаете что-то вроде развертывания? – Charles

ответ

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

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(); 

Таким образом, результаты будут записываться в results.xml файл в формате JUnit, который может анализироваться. Если вам нужен другой формат, вы можете проверить documentation. Также вы можете добавить дополнительные параметры, изменив массив, переданный методу запуска.

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);