У меня есть сценарий развертывания PHP, который я хочу сначала запустить PHPUnit, и остановимся, если тесты не сработают. Я много разбираюсь в этом, и очень сложно найти документацию по запуску модульных тестов из php, а не из инструмента командной строки.
Для новейшей версии PHPUnit вы можете сделать что-то вроде:
$unit_tests = new PHPUnit('my_tests_dir'); $passed = $unit_tests->run();
Предпочтительно решение, которое не требует, чтобы я вручную указывал каждый набор тестов.
Догадаться:
$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."); }
Самый простой способ сделать это – создать экземпляр объекта класса 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, который может быть проанализирован. Если вам нужен другой формат, вы можете проверить документацию . Также вы можете добавить дополнительные параметры, изменив массив, переданный методу запуска.
Похоже, что 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);
-<?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);