Запуск тестов из командной строки
Запуск исполняемого файла PHPUnit из командной строки можно осуществить с помощью команды phpunit. Следующий код демонстрирует запуск тестов с помощью исполняемого файла PHPUnit:
$ phpunit ArrayTest PHPUnit 8.5.0 by Sebastian Bergmann and contributors. .. Time: 0 seconds OK (2 tests, 2 assertions)
При вызове, как показано выше, исполняемый файл PHPUnit будет искать ArrayTest.php исходный файл в текущей рабочей директории, загружать его и ожидать наличия ArrayTest класса тестовых кейсов. Затем он выполнит тесты этого класса.
Для каждого запущенного теста утилита PHPUnit выводит один символ, указывающий на прогресс:
.
Выводится при успешном завершении теста.
F
Выводится, когда при выполнении метода теста происходит сбой утверждения.
E
Выводится, когда при выполнении метода теста происходит ошибка.
R
Выводится, когда тест помечен как рискованный (см. Рискованные тесты).
S
Выводится, когда тест пропущен (см. Неполные и пропущенные тесты).
I
Выводится, когда тест помечен как неполный или не реализованный (см. Неполные и пропущенные тесты).
PHPUnit различает ошибки и неудачи. Неудачей считается нарушение утверждения PHPUnit, например, вызов assertSame(), завершившийся ошибкой. Ошибка представляет собой непредвиденное исключение или ошибку PHP. Иногда это различие оказывается полезным, так как ошибки, как правило, легче исправить, чем неудачи. Если у вас большой список проблем, лучше сначала устранить ошибки, а затем проверить, остались ли неудачи после их исправления.
Параметры командной строки
Рассмотрим параметры командной строки для запуска тестов на примере следующего кода:
$ phpunit --help
PHPUnit 8.5.0 by Sebastian Bergmann and contributors.
Usage: phpunit [options] UnitTest [UnitTest.php]
phpunit [options] <directory>
Code Coverage Options:
--coverage-clover <file> Generate code coverage report in Clover XML format
--coverage-crap4j <file> Generate code coverage report in Crap4J XML format
--coverage-html <dir> Generate code coverage report in HTML format
--coverage-php <file> Export PHP_CodeCoverage object to file
--coverage-text=<file> Generate code coverage report in text format
Default: Standard output
--coverage-xml <dir> Generate code coverage report in PHPUnit XML format
--whitelist <dir> Whitelist <dir> for code coverage analysis
--disable-coverage-ignore Disable annotations for ignoring code coverage
--no-coverage Ignore code coverage configuration
--dump-xdebug-filter <file> Generate script to set Xdebug code coverage filter
Logging Options:
--log-junit <file> Log test execution in JUnit XML format to file
--log-teamcity <file> Log test execution in TeamCity format to file
--testdox-html <file> Write agile documentation in HTML format to file
--testdox-text <file> Write agile documentation in Text format to file
--testdox-xml <file> Write agile documentation in XML format to file
--reverse-list Print defects in reverse order
Test Selection Options:
--filter <pattern> Filter which tests to run
--testsuite <name,...> Filter which testsuite to run
--group ... Only runs tests from the specified group(s)
--exclude-group ... Exclude tests from the specified group(s)
--list-groups List available test groups
--list-suites List available test suites
--list-tests List available tests
--list-tests-xml <file> List available tests in XML format
--test-suffix ... Only search for test in files with specified
suffix(es). Default: Test.php,.phpt
Test Execution Options:
--dont-report-useless-tests Do not report tests that do not test anything
--strict-coverage Be strict about @covers annotation usage
--strict-global-state Be strict about changes to global state
--disallow-test-output Be strict about output during tests
--disallow-resource-usage Be strict about resource usage during small tests
--enforce-time-limit Enforce time limit based on test size
--default-time-limit=<sec> Timeout in seconds for tests without @small, @medium or @large
--disallow-todo-tests Disallow @todo-annotated tests
--process-isolation Run each test in a separate PHP process
--globals-backup Backup and restore $GLOBALS for each test
--static-backup Backup and restore static attributes for each test
--colors=<flag> Use colors in output ("never", "auto" or "always")
--columns <n> Number of columns to use for progress output
--columns max Use maximum number of columns for progress output
--stderr Write to STDERR instead of STDOUT
--stop-on-defect Stop execution upon first not-passed test
--stop-on-error Stop execution upon first error
--stop-on-failure Stop execution upon first error or failure
--stop-on-warning Stop execution upon first warning
--stop-on-risky Stop execution upon first risky test
--stop-on-skipped Stop execution upon first skipped test
--stop-on-incomplete Stop execution upon first incomplete test
--fail-on-warning Treat tests with warnings as failures
--fail-on-risky Treat risky tests as failures
-v|--verbose Output more verbose information
--debug Display debugging information
--loader <loader> TestSuiteLoader implementation to use
--repeat <times> Runs the test(s) repeatedly
--teamcity Report test execution progress in TeamCity format
--testdox Report test execution progress in TestDox format
--testdox-group Only include tests from the specified group(s)
--testdox-exclude-group Exclude tests from the specified group(s)
--printer <printer> TestListener implementation to use
--resolve-dependencies Resolve dependencies between tests
--order-by=<order> Run tests in order: default|defects|duration|no-depends|random|reverse
--random-order-seed=<N> Use a specific random seed <N> for random order
--cache-result Write run result to cache to enable ordering tests defects-first
Configuration Options:
--prepend <file> A PHP script that is included as early as possible
--bootstrap <file> A PHP script that is included before the tests run
-c|--configuration <file> Read configuration from XML file
--no-configuration Ignore default configuration file (phpunit.xml)
--no-logging Ignore logging configuration
--no-extensions Do not load PHPUnit extensions
--include-path <path(s)> Prepend PHP's include_path with given path(s)
-d key[=value] Sets a php.ini value
--generate-configuration Generate configuration file with suggested settings
--cache-result-file=<FILE> Specify result cache path and filename
Miscellaneous Options:
-h|--help Prints this usage information
--version Prints the version and exits
--atleast-version <min> Checks that version is greater than min and exits
--check-version Check whether PHPUnit is the latest version
phpunit UnitTest
Запускает тесты, предоставленные классом
UnitTest. Ожидается, что этот класс объявлен в файлеUnitTest.php.
UnitTestдолжен быть либо классом, унаследованным отPHPUnit\Framework\TestCase, либо классом, предоставляющим методpublic static suite(), который возвращает объектPHPUnit\Framework\Test, например, экземпляр классаPHPUnit\Framework\TestSuite.
phpunit UnitTest UnitTest.php
Запускает тесты, предоставленные классомUnitTest. Ожидается, что этот класс объявлен в указанном файле.
--coverage-clover
Генерирует файл журнала в формате XML с информацией о покрытии кода для выполненных тестов. Для получения более подробной информации см. Ведение журнала.
Обратите внимание, что эта функциональность доступна только при установленных расширениях токенизатора и Xdebug.
--coverage-crap4j
Генерирует отчет о покрытии кода в формате Crap4j. Для получения более подробной информации см. Анализ покрытия кода.
Обратите внимание, что эта функциональность доступна только при установленных расширениях токенизатора и Xdebug.
--coverage-html
Генерирует отчет о покрытии кода в формате HTML. Для получения более подробной информации см. Анализ покрытия кода.
Обратите внимание, что эта функциональность доступна только при установленных расширениях токенизатора и Xdebug.
--coverage-php
Генерирует сериализованный объект PHP_CodeCoverage с информацией о покрытии кода.
Обратите внимание, что эта функциональность доступна только при установленных расширениях токенизатора и Xdebug.
--coverage-text
Генерирует файл журнала или вывод в командной строке в удобочитаемом формате с информацией о покрытии кода для выполненных тестов. Для получения более подробной информации см. Ведение журнала.
Обратите внимание, что эта функциональность доступна только при установленных расширениях токенизатора и Xdebug.
--log-junit
Генерирует файл журнала в формате JUnit XML для выполненных тестов. Для получения более подробной информации см. Ведение журнала.
--testdox-html и --testdox-text
Генерирует документацию в формате HTML или обычном тексте для выполненных тестов (см. TestDox).
--filter
Запускает только те тесты, имена которых соответствуют заданному шаблону регулярного выражения. Если шаблон не заключен в разделители, PHPUnit заключит шаблон в разделители
/.Имена тестов для сопоставления будут в одном из следующих форматов:
TestNamespace\TestCaseClass::testMethodПо умолчанию формат имени теста эквивалентен использованию магической константы__METHOD__внутри метода теста.
TestNamespace\TestCaseClass::testMethod with data set #0Когда тест имеет поставщик данных, каждый итерация данных получает текущий индекс, добавленный в конец имени теста по умолчанию.
TestNamespace\TestCaseClass::testMethod with data set "my named data"Когда тест имеет поставщик данных, использующий именованные наборы, каждая итерация данных получает текущее имя, добавленное в конец имени теста по умолчанию. См. Пример 3.1 для примера именованных наборов данных.
Пример 3.1 Именованные наборы данных<?php use PHPUnit\Framework\TestCase; namespace TestNamespace; class TestCaseClass extends TestCase { /** * @dataProvider provider */ public function testMethod($data) { $this->assertTrue($data); } public function provider() { return [ 'my named data' => [true], 'my data' => [true] ]; } }
/path/to/my/test.phptИмя теста для PHPT-теста — это путь к файлу в файловой системе.См. Пример 3.2 для примеров допустимых шаблонов фильтра.
Пример 3.2 Примеры шаблонов фильтра--filter 'TestNamespace\\TestCaseClass::testMethod' --filter 'TestNamespace\\TestCaseClass' --filter TestNamespace --filter TestCaseClase --filter testMethod --filter '/::testMethod .*"my named data"/' --filter '/::testMethod .*#5$/' --filter '/::testMethod .*#(5|6|7)$/'См. Пример 3.3 для дополнительных сокращений, доступных для сопоставления поставщиков данных.
Пример 3.3 Сокращения фильтра--filter 'testMethod#2' --filter 'testMethod#2-4' --filter '#2' --filter '#2-4' --filter 'testMethod@my named data' --filter 'testMethod@my.*data' --filter '@my named data' --filter '@my.*data'
--testsuite
Запускает только набор тестов, имя которого соответствует заданному шаблону.
--group
Запускает только тесты из указанной группы (групп). Тест может быть помечен как принадлежащий к группе с помощью аннотации
@group.Аннотации
@authorи@ticketявляются псевдонимами для аннотации@group, позволяя фильтровать тесты по авторам или идентификаторам задач соответственно.
--exclude-group
Исключает тесты из указанной группы (групп). Тест может быть помечен как принадлежащий к группе с помощью аннотации@group.
--list-groups
Отображает доступные группы тестов.
--test-suffix
Ищет только файлы тестов с указанным(и) суффиксом(ами).
--dont-report-useless-tests
Не отображает тесты, которые ничего не проверяют. Для получения дополнительной информации см. Рискованные тесты.
--strict-coverage
Строго относится к непреднамеренно покрытому коду. Для получения дополнительной информации см. Рискованные тесты.
--strict-global-state
Строго относится к манипуляциям с глобальным состоянием. Для получения дополнительной информации см. Рискованные тесты.
--disallow-test-output
Строго относится к выводу во время тестов. Для получения дополнительной информации см. Рискованные тесты.
--disallow-todo-tests
Не выполняет тесты, у которых аннотация@todoприсутствует в блоке документации.
--enforce-time-limit
Выполняет контроль времени, основанный на размере теста. Для получения дополнительной информации см. Рискованные тесты.
--process-isolation
Выполняет каждый тест в отдельном процессе PHP.
--no-globals-backup
Не выполняет резервное копирование и восстановление $GLOBALS. Для получения более подробной информации см. Глобальное состояние.
--static-backup
Создаёт резервные копии и восстанавливает статические атрибуты пользовательских классов. Для получения более подробной информации см. Глобальное состояние.
--colors
Использование цветов в выводе. В Windows используйте ANSICON или ConEmu.
Возможны три значения для этого параметра:
never: никогда не отображает цвета в выводе. Это значение по умолчанию, когда опция--colorsне используется.auto: отображает цвета в выводе, если текущий терминал поддерживает цвета, или если вывод перенаправлен в команду или файл.always: всегда отображает цвета в выводе, даже если текущий терминал не поддерживает цвета, или если вывод перенаправлен в команду или файл.Когда
--colorsиспользуется без значения, выбирается значениеauto.
--columns
Определяет количество колонок для вывода прогресса. Еслиmaxзадано, количество колонок будет максимальным для текущего терминала.
--stderr
При необходимости выводит вSTDERRвместоSTDOUT.
--stop-on-error
Останавливает выполнение при первой ошибке.
--stop-on-failure
Останавливает выполнение при первой ошибке или отказе.
--stop-on-risky
Останавливает выполнение при первом рискованном тесте.
--stop-on-skipped
Останавливает выполнение при первом пропущенном тесте.
--stop-on-incomplete
Останавливает выполнение при первом неполном тесте.
--verbose
Выводит более подробную информацию, например, имена тестов, которые были неполными или пропущены.
--debug
Выводит отладочную информацию, например, имя теста при начале его выполнения.
--loader
Указывает используемую реализацию загрузчика набора тестов.
Стандартный загрузчик набора тестов будет искать исходный файл в текущей рабочей директории и в каждой директории, указанной в директиве конфигурации PHP
include_path. Имя класса, напримерProject_Package_Class, сопоставляется с именем исходного файлаProject/Package/Class.php.
--repeat
Повторяет запуск указанного набора тестов заданное количество раз.
--testdox
Отчитывает ход выполнения тестов в формате TestDox (см. TestDox).
--printer
Указывает используемый принтер результатов. Класс принтера должен расширятьPHPUnit\Util\Printerи реализовывать интерфейсPHPUnit\Framework\TestListener.
--bootstrap
Файл PHP «запуска», который выполняется перед тестами.
--configuration, -c
Считывает конфигурацию из XML-файла. Дополнительные сведения см. в Файле конфигурации XML.
Если
phpunit.xmlилиphpunit.xml.dist(в указанном порядке) существуют в текущей рабочей директории и--configurationне используется, конфигурация будет автоматически считываться из этого файла.Если указан каталог и если
phpunit.xmlилиphpunit.xml.dist(в указанном порядке) существуют в этом каталоге, конфигурация будет автоматически считываться из этого файла.
--no-configuration
Игнорироватьphpunit.xmlиphpunit.xml.distиз текущей рабочей директории.
--include-path
Добавляет указанный путь(и) кinclude_pathPHP.
-d
Устанавливает значение заданного параметра конфигурации PHP.
Примечание
Обратите внимание, что начиная с версии 4.8, параметры можно указывать после аргумента(ов).
TestDox
Функциональность TestDox PHPUnit анализирует класс теста и все имена методов тестов и преобразует их из верблюжьего регистра (или snake_case) имён PHP в предложения: testBalanceIsInitiallyZero() (или test_balance_is_initially_zero() становится «Баланс изначально равен нулю». Если несколько методов тестов различаются только суффиксом из одной или нескольких цифр, например, testBalanceCannotBecomeNegative() и testBalanceCannotBecomeNegative2(), предложение «Баланс не может стать отрицательным» будет отображаться только один раз, предполагая, что все эти тесты пройдены.
Давайте рассмотрим документацию, сгенерированную для класса BankAccount:
$ phpunit --testdox BankAccountTest PHPUnit 8.5.0 by Sebastian Bergmann and contributors. BankAccount ✔ Balance is initially zero ✔ Balance cannot become negative
В качестве альтернативы, гибкая документация может быть сгенерирована в формате HTML или простого текста и записана в файл с помощью аргументов --testdox-html и --testdox-text.
Гибкая документация может использоваться для документирования предположений, которые вы делаете о внешних пакетах, которые вы используете в вашем проекте. Когда вы используете внешний пакет, вы подвергаетесь риску, что пакет будет вести себя не так, как вы ожидаете, и что будущие версии пакета будут изменяться незаметными способами, которые сломают ваш код, не подозревая об этом. Вы можете справиться с этими рисками, написав тест каждый раз, когда вы делаете предположение. Если ваш тест проходит, ваше предположение справедливо. Если вы документируете все свои предположения с помощью тестов, будущие выпуски внешнего пакета не будут вызывать беспокойства: если тесты проходят, ваша система должна продолжить работу.
© 2005–2020 Sebastian Bergmann
Licensed under the Creative Commons Attribution 3.0 Unported License.
https://phpunit.readthedocs.io/en/8.5/textui.html