テストの実行

Nette Tester のいちばん目に見える部分が、コマンドラインのテストの実行器です。これはきわめて速く堅牢です。すべてのテストを別々のプロセスとして、複数のスレッドで並行して自動的に走らせるからです。監視モードで自分を走らせ続けることもできます。

テストの実行器はコマンドラインから呼びます。パラメータにはテストの入ったディレクトリを渡します。現在のディレクトリならドットを入れるだけです。

vendor/bin/tester .

実行器は指定されたディレクトリとそのすべての下位のディレクトリを調べ、*.phpt*Test.php で終わるファイルをテストとして探します。そしてそのアノテーションも読んで評価し、どのテストをどう走らせるかを決めます。

それぞれのテストのファイルは自分だけの切り離された PHP のプロセスで走り、実行器はそれを何本も同時に動かします。つまり並行の単位はファイルです。ですからひとつのファイルの中のコードは順に走ります。TestCaseはひとつのファイルの中にあるので、既定ではそのメソッドはひとつのプロセスで次々と走ります。@testCaseのアノテーションで印を付ければ、実行器はテストのメソッドごとに別々の並行のプロセスとして走らせます。

そしてテストを実行します。実行中は、進み具合を示す文字を端末に出力します。

  • . – テストが通った
  • s – テストが飛ばされた
  • F – テストが落ちた

出力は次のようになります。

 _____ ___  ___ _____ ___  ___
|_   _/ __)( __/_   _/ __)| _ )
  |_| \___ /___) |_| \___ |_|_\  v2.6.1

PHP 8.5.2 (cli) | php | 8 threads

........s..........................

OK (35 tests, 1 skipped, 1.7 seconds)

もう一度走らせると、前回の実行で落ちたテストを最初に実行するので、エラーを直せたかどうかがすぐ分かります。

どのテストも落ちなければ Tester の終了コードはゼロです。そうでなければゼロ以外になります。

コマンドラインのオプション

コマンドラインのオプションの一覧は、Tester をパラメータなしで、あるいは -h のオプションで走らせると得られます。

 _____ ___  ___ _____ ___  ___
|_   _/ __)( __/_   _/ __)| _ )
  |_| \___ /___) |_| \___ |_|_\  v2.6.1

Usage:
    tester [options] [<test file> | <directory>]...

Options:
    -p <path>                    Specify PHP interpreter to run (default: php).
    -c <path>                    Use custom php.ini, ignore system configuration.
    -C                           With -c, include system configuration as well.
    -d <key=value>...            Define INI entry 'key' with value 'value'.
    -s                           Show information about skipped tests.
    --stop-on-fail               Stop execution upon the first failure.
    -j <num>                     Run <num> jobs in parallel (default: 8).
    -o <console|console-lines|tap|junit|log|none>  (e.g. -o junit:output.xml)
                                 Specify one or more output formats with optional file name.
    -w | --watch <path>          Watch directory.
    -i | --info                  Show tests environment info and exit.
    --setup <path>               Script for runner setup.
    --temp <path>                Path to temporary directory. Default by sys_get_temp_dir().
    --colors [1|0]               Enable or disable colors.
    --coverage <path>            Generate code coverage report to file.
    --coverage-src <path>        Path to source code.
    -h | --help                  This help.

-p <path>

テストを走らせるのに使う PHP の実行ファイルを指定します。既定では php です。

tester -p /home/user/php-7.2.0-beta/php-cgi tests

-c <path>

独自の php.ini ファイルを使い、システムの設定を無視します。特定の設定でテストを走らせるのに役立ちます。詳しくは 独自の php.iniをご覧ください。

-C

-c と一緒に使うと、システムの設定も取り込みます(無視しません)。独自の php.iniの節をご覧ください。

-d <key=value>

テストのために PHP の設定のディレクティブの値を設定します。このパラメータは何度でも使えます。

tester -d max_execution_time=20

-s

飛ばされたテストの情報を表示します。

--stop-on-fail

Tester は最初にテストが落ちた時点でテストをやめます。

-j <num>

テストを走らせる並行のプロセスの数を指定します。既定値は 8 です。テストを順に走らせたいなら 1 にします。

-o <console|console-lines|tap|junit|log|none>

出力の形式を設定します。既定はコンソールの形式です。出力を書き込むファイルの名前も指定できます(たとえば -o junit:output.xml)。-o のオプションを何度も繰り返せば、複数の形式を一度に生成できます。

  • console: 既定の形式と同じですが、この場合 ASCII のロゴは出力されません
  • console-lines: console に似ていますが、テストごとの結果が追加の情報とともに別々の行に並びます
  • tap: 機械での処理に向いた TAP 形式
  • junit: JUnit の XML 形式。これも機械での処理に向いています
  • log: テストの進み具合を出力します。落ちたテスト、飛ばされたテスト、通ったテストのすべてを含みます
  • none: 何も出力しません

-w | --watch <path>

テストが終わったあと、Tester は終了せずに動き続け、指定したディレクトリの PHP のファイルを見張ります。ファイルが変わると、テストをもう一度走らせます。複数のディレクトリを見張りたいなら、このパラメータを何度でも使えます。

ライブラリを整理し直したり、テストをデバッグしたりするときに役立ちます。

tester --watch src tests

-i | --info

テストの実行時の環境の情報を表示します。たとえば次のようにです。

tester -p /usr/bin/php7.1 -c tests/php.ini --info

PHP binary:
/usr/bin/php7.1

PHP version:
7.1.7-1+0~20170711133844.5+jessie~1.gbp5284f4 (cli)

Code coverage engines:
(not available)

Loaded php.ini files:
/var/www/dev/demo/tests/php.ini

PHP temporary directory:
/tmp

Loaded extensions:
Core, ctype, date, dom, ereg, fileinfo, filter, hash, ...

--setup <path>

Tester は起動時に指定した PHP のスクリプトを読み込みます。そのスクリプトの中では変数 Tester\Runner\Runner $runner が使えます。次の中身の tests/runner-setup.php というファイルがあるとしましょう。

$runner->outputHandlers[] = new MyOutputHandler;

Tester を次のように走らせます。

tester --setup tests/runner-setup.php tests

--temp <path>

Tester の一時ファイルのディレクトリへのパスを設定します。既定値は sys_get_temp_dir() が返すものです。既定値が使えない場合は知らせてくれます。

どのディレクトリが使われているか分からないなら、Tester を --info のパラメータで走らせてください。

--colors 1|0

既定では、Tester は端末が色に対応しているかを見分けて、それに応じて出力に色を付けます。このオプションはその自動の判別を上書きします。色付けは NETTE_TESTER_COLORS の環境変数で全体に設定できます。

--coverage <path>

Tester は、ソースコードがテストにどれだけ覆われているかを示す報告を生成します。このオプションには XdebugPCOVの PHP の拡張が入っているか、もっと速い PHPDBG の SAPI が要ります。対象のファイルの拡張子がその形式を決めます。HTML か Clover XML です。

tester tests --coverage coverage.html  # HTML の報告
tester tests --coverage coverage.xml   # Clover XML の報告

カバレッジのエンジンを選ぶ優先度は次のとおりです。

  1. PCOV
  2. PHPDBG
  3. Xdebug

PHPDBG を使う場合、大規模なテストはメモリを使い果たして落ちることがあります。コードカバレッジの情報を集める作業はメモリをたくさん使います。その場合は、テストの中で Tester\CodeCoverage\Collector::flush() を呼ぶと助けになります。集めたデータをディスクに書き出してメモリを解放します。この呼び出しが効くのは PHPDBG のエンジンのときだけで、PCOV や Xdebug のとき、あるいはデータの収集が動いていないときは何もしません。

コードカバレッジの `HTML の報告の例 をご覧ください。

--coverage-src <path>

--coverage のオプションと一緒に使います。<path> は報告の対象となるソースコードへのパスです。何度でも使えます。

独自の php.ini

テストには独自の php.ini ファイルを使えます。特定の拡張や特別な INI の設定が必要なら、自分の php.ini ファイルを作ってテストと一緒に配ることをおすすめします。そして Tester を -c のオプションで、たとえば tester -c tests/php.ini tests のように走らせます。INI のファイルは次のようになります。

[PHP]

extension=php_pdo_mysql.dll
extension=php_pdo_pgsql.dll

memory_limit=512M

-c を使うと、Tester はシステムの設定を無視します(PHP を -n のフラグで走らせます)。システムの設定も取り込みたいなら -C のオプションを足します。tester -c tests/php.ini -C tests のようにです。-c-C を組み合わせても、UNIX では /etc/php/conf.d/*.ini のほかの INI のファイルは読み込まれません。これは PHP の振る舞いで、Tester に固有のものではありません。

バージョン 2.6 より前は、-c なしだと Tester は PHP を -n のフラグで、つまり php.ini なしで走らせていて、-C のオプションがそれを抑えていました。バージョン 2.6 からは、既定でシステムの php.ini が読み込まれます。-c を使ったときの振る舞いは変わりません。