Spec-Zone.ru › PHPUnit 9

Запуск тестов PHPUnit из командной строки

Запуск исполнителя тестов PHPUnit из командной строки выполняется с помощью команды phpunit. Следующий код демонстрирует, как запустить тесты с помощью исполнителя тестов PHPUnit из командной строки:

$ phpunit ArrayTest
PHPUnit 9.5.0 by Sebastian Bergmann and contributors.

..

Time: 0 seconds

OK (2 tests, 2 assertions)

При вызове, как показано выше, исполнитель тестов PHPUnit из командной строки ищет файл ArrayTest.php в текущем рабочем каталоге, загружает его и ожидает найти класс теста ArrayTest. Затем он выполнит тесты этого класса.

Для каждого проведённого запуска теста инструмент PHPUnit выводит один символ, отображающий ход выполнения:

.

Выводится при успешном выполнении теста.

F

Выводится, когда в методе теста происходит ошибка проверки (assertion) при его выполнении.

E

Выводится, когда при выполнении метода теста возникает ошибка.

R

Выводится, когда тест помечен как рискованный (см. Рискованные тесты).

S

Выводится, когда тест пропущен (см. Неполные и пропущенные тесты).

I

Выводится, когда тест помечен как неполный или ещё не реализованный (см. Неполные и пропущенные тесты).

PHPUnit различает ошибки (failures) и недоразумения (errors). Ошибка — это нарушение утверждения PHPUnit, например, вызов assertSame(), который завершается неудачей. Недоразумение — это непредвиденное исключение или ошибка PHP. Иногда это различие полезно, так как ошибки легче исправить, чем ошибки утверждений. Если у вас большой список проблем, лучше сначала устранить ошибки и посмотреть, остаются ли какие-либо ошибки, после исправления всех ошибок.

Параметры командной строки

Рассмотрим параметры командной строки для запуска тестов в следующем коде:

$ phpunit --help
PHPUnit 9.5.0 by Sebastian Bergmann and contributors.

Usage:
  phpunit [options] 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
  --coverage-cache <dir>      Cache static analysis results
  --warm-coverage-cache       Warm static analysis cache
  --coverage-filter <dir>     Include <dir> in code coverage analysis
  --path-coverage             Perform path coverage analysis
  --disable-coverage-ignore   Disable annotations for ignoring code coverage
  --no-coverage               Ignore code coverage configuration

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
  --no-logging                Ignore logging configuration

Test Selection Options:
  --filter <pattern>          Filter which tests to run
  --testsuite <name>          Filter which testsuite to run
  --group <name>              Only runs tests from the specified group(s)
  --exclude-group <name>      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 <suffixes>    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-incomplete        Treat incomplete tests as failures
  --fail-on-risky             Treat risky tests as failures
  --fail-on-skipped           Treat skipped tests as failures
  --fail-on-warning           Treat tests with warnings as failures
  -v|--verbose                Output more verbose information
  --debug                     Display debugging information

  --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)
  --no-interaction            Disable TestDox progress animation
  --printer <printer>         TestListener implementation to use

  --order-by <order>          Run tests in order: default|defects|duration|no-depends|random|reverse|size
  --random-order-seed <N>     Use a specific random seed <N> for random order
  --cache-result              Write test results to cache file
  --do-not-cache-result       Do not write test results to cache file

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)
  --extensions <extensions>   A comma separated list of PHPUnit extensions to load
  --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
  --cache-result-file <file>  Specify result cache path and filename
  --generate-configuration    Generate configuration file with suggested settings
  --migrate-configuration     Migrate configuration file to current format

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 с информацией о покрытии кода для выполненных тестов. Для получения более подробной информации см. Анализ покрытия кода.

--coverage-crap4j

Генерирует отчет о покрытии кода в формате Crap4j. Для получения более подробной информации см. Анализ покрытия кода.

--coverage-html

Генерирует отчет о покрытии кода в формате HTML. Для получения более подробной информации см. Анализ покрытия кода.

--coverage-php

Генерирует сериализованный объект PHP_CodeCoverage с информацией о покрытии кода.

--coverage-text

Генерирует файл журнала или вывод в командной строке в удобочитаемом формате с информацией о покрытии кода для выполненных тестов.

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

Указывает реализацию PHPUnit\Runner\TestSuiteLoader для использования.

Стандартный загрузчик набора тестов будет искать исходный файл в текущей рабочей директории и в каждой директории, указанной в директиве конфигурации include_path PHP. Имя класса, например, Project_Package_Class, сопоставляется с именем файла исходного кода Project/Package/Class.php.

--repeat

Повторяет запуск указанного(ых) теста(ов) заданное количество раз.

--testdox

Отчет о ходе выполнения тестов в формате TestDox (см. TestDox).

--printer

Указывает используемый принтер результатов. Класс-принтер должен расширять PHPUnit\Util\Printer и реализовывать интерфейс PHPUnit\Framework\TestListener.

--bootstrap

Файл PHP «bootstrap», который выполняется перед тестами.

--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_path PHP.

-d

Устанавливает значение заданного параметра конфигурации PHP.

Примечание

Обратите внимание, что параметры могут быть помещены после аргумента(ов).

TestDox

Функциональность TestDox PHPUnit анализирует класс тестов и все имена методов тестов и преобразует их из именования в стиле camel case (или snake_case) PHP в предложения: testBalanceIsInitiallyZero() (или test_balance_is_initially_zero() становится «Баланс изначально равен нулю». Если есть несколько методов тестов, имена которых отличаются только суффиксом из одного или нескольких цифр, например, testBalanceCannotBecomeNegative() и testBalanceCannotBecomeNegative2(), предложение «Баланс не может стать отрицательным» будет отображаться только один раз, предполагая, что все эти тесты пройдены.

Давайте рассмотрим сгенерированную гибкую документацию для класса %%%CODE_BLOCK_107%%:

$ phpunit --testdox BankAccountTest.php
PHPUnit 9.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/9.5/textui.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API