Nette Tester を始める

優れたプログラマでも間違いを犯します。優れたプログラマとそうでないプログラマの違いは、優れたプログラマは一度だけ間違いを犯し、次回は自動テストでそれを検出することです。

  • 「テストしない者は、自分の過ちを繰り返す運命にある。」(ことわざ)
  • 「1 つのエラーを取り除くと、別のエラーが現れる。」(マーフィーの法則)
  • 「画面に変数を表示したくなったら、代わりにテストを書いてください。」(マーティン・ファウラー)

PHP でこのようなコードを書いたことがありますか?

$obj = new MyClass;
$result = $obj->process($input);

var_dump($result);

つまり、関数の呼び出し結果を表示して、それが期待どおりのものを返すかどうかを目で確認するためだけに?きっと毎日何度もやっているでしょう。正直に言って:すべてが正しく機能する場合、このコードを削除しますか?クラスが将来壊れないと期待しますか?マーフィーの法則は逆を保証します :-)

基本的に、あなたはテストを書きました。それを少し修正して、目視検査を必要とせず、自己チェックするようにするだけです。そして、テストを削除しなければ、将来いつでも実行して、すべてがまだ期待どおりに機能することを確認できます。時間が経つにつれて、そのようなテストを多数作成することになるため、それらを自動的に実行できると便利です。

そして、これらすべてを Nette Tester が支援します。

Tester は何がユニークなのか?

Nette Tester のテスト作成がユニークなのは、各テストが個別に実行できる通常の PHP スクリプトである ことです。

したがって、テストを作成するときに、それを簡単に実行して、たとえばプログラミングエラーがないかどうかを確認できます。正しく機能するかどうか。そうでない場合は、IDE で簡単にステップ実行してエラーを探すことができます。ブラウザで開くことさえできます。

そして何よりも – それを実行することによって、テストを実行します。合格したか失敗したかをすぐに確認できます。どのように?見てみましょう。PHP 配列を操作する簡単なテストを作成し、ArrayTest.php ファイルに保存します。

<?php
use Tester\Assert;

require __DIR__ . '/vendor/autoload.php';  # Composer オートローダーの読み込み
Tester\Environment::setup();               # Nette Tester の初期化

$stack = [];
Assert::same(0, count($stack));   # count() がゼロを返すことを期待します

$stack[] = 'foo';
Assert::same(1, count($stack));   # count() が 1 を返すことを期待します
Assert::contains('foo', $stack);  # $stack に 'foo' 項目が含まれていることを確認します

ご覧のとおり、Assert::same() のような、いわゆる アサーションメソッド は、実際の値が期待値に対応することを確認するために使用されます。

テストを作成したので、コマンドラインから実行できます。最初の実行で構文エラーが明らかになり、タイプミスがなければ、次のように表示されます。

$ php ArrayTest.php

OK

テストでアサーションを偽の Assert::contains('XXX', $stack); に変更し、実行時に何が起こるかを見てください。

$ php ArrayTest.php

Failed: ['foo'] should contain 'XXX'

in ArrayTest.php(17) Assert::contains('XXX', $stack);

FAILURE

テストの作成については、テストの作成 の章で続行します。

インストールと要件

Tester が必要とする最小 PHP バージョンは 7.1 です(詳細は podporované verze PHP 表を参照)。推奨されるインストール方法は Composer を使用することです。

composer require --dev nette/tester

コマンドラインから Nette Tester を実行してみてください(パラメータなしではヘルプのみが表示されます)。

vendor/bin/tester

テストの実行

アプリケーションが成長するにつれて、テストの数も増えます。テストを 1 つずつ実行するのは実用的ではありません。そのため、Tester にはコマンドラインから呼び出す一括テストランナーが用意されています。パラメータとして、テストが配置されているディレクトリを指定します。現在のディレクトリの場合はドットを指定します。

vendor/bin/tester .

テストランナーは、指定されたディレクトリとすべてのサブディレクトリを検索し、テスト(*.phpt および *Test.php ファイル)を探します。同時に、それらのアノテーションを読み取り、評価して、どのテストをどのように実行するかを判断します。

次に、テストを開始します。各テストは新しい PHP プロセスとして実行されるため、他のテストから完全に分離されます。複数のスレッドで並行して実行されるため、非常に高速です。そして、前回の実行で失敗したテストを最初に実行するため、エラーを修正できたかどうかをすぐに確認できます。

テストの実行中、Tester は結果を文字として継続的にターミナルに出力します。

  • . – テスト合格
  • s – テストスキップ (skipped)
  • F – テスト失敗 (failed)

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

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

Note: No php.ini is used.
PHP 8.3.2 (cli) | php -n | 8 threads

........s................F.........

-- FAILED: greeting.phpt
   Failed: 'Hello John' should be
       ... 'Hello Peter'

   in greeting.phpt(19) Assert::same('Hello Peter', $o->say('John'));

FAILURES! (35 tests, 1 failures, 1 skipped, 1.7 seconds)

35 個のテストが実行され、1 個が失敗し、1 個がスキップされました。

次に、テストの実行 の章で続行します。

ウォッチモード

コードをリファクタリングしていますか?それとも TDD(テスト駆動開発)手法に従って開発していますか?それなら、ウォッチモードが気に入るでしょう。このモードでは、Tester はソースコードを監視し、変更があると自動的に実行されます。

開発中は、モニターの隅にターミナルがあり、緑色のステータスバーが表示されています。突然赤色に変わると、何かを完全に正しく行わなかったことがわかります。これは実際には素晴らしいゲームで、プログラミングしながら色を維持しようとします。

ウォッチモードは –watch パラメータで開始されます。

コードカバレッジレポート

Tester は、テストがソースコードのどれだけをカバーしているかの概要を示すレポートを生成できます。レポートは、人間が読める HTML 形式、またはさらなる機械処理のための Clover XML 形式のいずれかになります。

コードカバレッジの HTML レポートのサンプル をご覧ください。

サポートされている PHP バージョン

バージョン PHP との互換性
Tester 2.5 PHP 8.0 – 8.3
Tester 2.4 PHP 7.2 – 8.2
Tester 2.3 PHP 7.1 – 8.0
Tester 2.1 – 2.2 PHP 7.1 – 7.3
Tester 2.0 PHP 5.6 – 7.3
Tester 1.7 PHP 5.3 – 7.3 + HHVM 3.3+
Tester 1.6 PHP 5.3 – 7.0 + HHVM
Tester 1.3 – 1.5 PHP 5.3 – 5.6 + HHVM
Tester 0.9 – 1.2 PHP 5.3 – 5.6

最新のパッチバージョンに適用されます。

バージョン 1.7 までの Tester は HHVM 3.3.0 以降もサポートしていました(tester -p hhvm 経由)。サポートは Tester バージョン 2.0 から終了しました。