Spec-Zone.ru › PHPUnit 8

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

Запуск исполняемого файла 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_path PHP.

-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

Spec-Zone.ru

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