w3resource

The Command-Line Test Runner (1)

Introduction

PHPUnit command line test runner is used to run PHPUnit tests at the terminal. This

command line test runner can be invoked using the `phpunit` command. The code snippet below shows how to run tests with the PHPUnit command-line test runner:
$ phpunit ArrayTest
PHPUnit |version|.0 by Sebastian Bergmann and contributors.

..

Time: 0 seconds

OK (2 tests, 2 assertions)

When the above command is invoked as shown, the PHPUnit command-line test runner will look for an `ArrayTest.php` file in the current working directory, load it, and expect to find an `ArrayTest` test class in it. It will then execute the tests of this class.

For each test executed, the PHPUnit command-line tool uses one character to indicate the progress of the test being executed. Some of these characters include:

  • `.` This is printed when a test succeeds.
  • `F` This indicates that an assertion failed during the execution of a test method.
  • `E` Indicates the occurrence of an error while running a test method.
  • `R` Printed when the test has been marked as risky.
  • `S` This is printed when a test has been skipped
  • `I` Indicates tests marked as being incomplete or not yet implemented.

PHPUnit distinguishes between failures and errors. A failure is a violated PHPUnit assertion such as a failing `assertSame()` call.

An error is an unexpected exception or a PHP error. Sometimes this distinction proves useful since errors tend to be easier to fix than failures.

#Command-Line Options

PHPUnit has a lot of command line options engineered to making out PHPUnit test easy and seamless.The command `phpunit --help` will give you a comprehensive list of all PHPUnit command line options as shown below.

$ phpunit --help

PHPUnit |version|.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 test
--list-tests-xml <file> List available tests in XML format
--test-suffix ... Only search for the test in files with a 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
--testdox-text <file> Write agile documentation in Text format to file
--testdox-xml <file> Write agile documentation in XML format to file
--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 a 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|reverse|random|defects|depends
--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

#Command-Line Commands

`phpunit UnitTest`

This command the tests that are provided by the class `UnitTest`. This class is expected to be declared in the `UnitTest.php` file.

`UnitTest` must be either a class that inherits from `PHPUnit\Framework\TestCase` or a class that provides a `public static suite()` method which returns a `PHPUnit\Framework\Test` object, for example an instance of the `PHPUnit\Framework\TestSuite` class.

`phpunit UnitTest UnitTest.php`

Runs the tests that are provided by the class `UnitTest`. This class is expected to be declared in the specified source file.

Some optional flags can also be passed to the above command, some of these optional flags are:

`--coverage-clover`

Generates a logfile in XML format with the code coverage information for the tests run.

It should be noted that this functionality is only available when the tokenizer and Xdebug extensions are installed.

`--coverage-crap4j`

Generates a code coverage report in Crap4j format. This functionality is also only available upon the installation of  tokenizer and Xdebug extensions.

`--coverage-html`

Generates a code coverage report in HTML format.  This option also  only works when the tokenizer and Xdebug extensions are installed.

`--coverage-php`

This generates a serialized PHP_CodeCoverage object with the code coverage information.

Please note that this functionality is only available when the tokenizer and Xdebug extensions are installed.

`--coverage-text`

Generates a logfile or command-line output in human readable format with the code coverage information for the tests run. This functionality is only available when the tokenizer and Xdebug extensions are installed.

`--log-junit`

Generates a logfile in JUnit XML format for the tests run.

`--testdox-html` and `--testdox-text`

Generates agile documentation in HTML or plain text format for the tests that are run

`--filter`

Only runs tests whose name matches the given regular expression pattern. If the pattern is not enclosed in delimiters, PHPUnit will enclose the pattern in `/`  delimiters.

The test names to match will be in one of the following formats:

`TestNameSpace\TestCaseClass::testMethod`

The default test name format is the equivalent of using the `__METHOD__` magic constant inside the test method.

`TestNamespace\TestCaseClass::testMethod with data set #0`

When a test has a data provider, each iteration of the data gets the current index appended to the end of the default test name.

`TestNamespace\TestCaseClass::testMethod with data set "my named data" `

When a test has a data provider that uses named sets, each iteration of the data gets the current name appended to the end of the default test name.

The code snippet below illustrates an example of named data sets.

<?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.php`

The test name for a PHPUnit test is the filesystem path. The example below illustrates some valid filter patterns.

--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)$/'

Shortcuts, could also be used to check for available for matching data providers, examples are shown below on some filter shortcuts.

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

Previous: Writing tests for phpunit (exceptions and errors)
Next: The command-line test runner (2)



Follow us on Facebook and Twitter for latest update.