Как проверить программу командной строки с помощью PHPUnit?

Как проверить программу командной строки с помощью PHPUnit? Я вижу большую помощь в использовании PHPUnit из командной строки, но не для тестирования самой командной строки с помощью PHPUnit.

Это происходит потому, что я пишу программы с командной строкой в ​​PHP и Joomla, но не вижу способа проверить их вывод, особенно когда возникают ошибки (потому что вы не можете тестировать вывод ошибки с использованием PHPUnit expectOutputString () ).

(EDIT: Обратите внимание, что основная часть моего кода уже находится в классах, проверенных PHPUnit – я ищу способ протестировать логику программы командной строки (оболочки).)

Один из способов – использовать оператор backtick (`) для захвата вывода программы, а затем изучить этот вывод. Это хорошо работает в ОС Unix / Linux, так как вы также можете записывать ошибки, такие как STDERR. (В Windows это более болезненно, но может быть сделано (особенно с использованием Cygwin).)

Например:

public function testHelp() { $output = `./add-event --help 2>&1`; $this->assertRegExp( '/^usage:/m', $output, 'no help message?' ); $this->assertRegExp( '/where:/m', $output, 'no help message?' ); $this->assertNotRegExp( '/where event types are:/m', $output, 'no help message?' ); } 

Вы можете видеть, что как STDOUT, так и STDERR были записаны в $ output , тогда утверждения regex использовались для проверки того, был ли вывод похож на правильный вывод.

Тестируйте так же, как и на веб-странице, просто напишите тесты и выполните их против своего кода. Предполагается, что вы тестируете объекты своей программы, а не возвращаете код из командной строки.

В вашем коде содержатся классы, которые выполняют и обрабатывают данные. просто без создания веб-страницы. Просто напишите те же тесты для классов, манипуляции с данными и т. Д., Поскольку вы запускаете тесты против фрагментов кода, а не полный исполняемый файл.

У меня есть класс, который разбирает параметры командной строки, например, и позволяет коду перебирать значения. Я написал тесты для передачи командной строки объекту (без чтения фактических args, argv), а затем может проверить, что он возвращается правильно.