Upgrade to Pro — share decks privately, control downloads, hide ads and more …

PHPUnitのマニュアルを徹底解剖してみる_パート1

 PHPUnitのマニュアルを徹底解剖してみる_パート1

PHPUnitのマニュアルを詳細に見てみました。
新たな発見があるか確認してみます。
PHPUnit 11.1のマニュアル1章~2章の内容です。

kouki.miura

May 18, 2024
Tweet

More Decks by kouki.miura

Other Decks in Programming

Transcript

  1. 1. Install(インストール) h2 h3 サマリ PHP on the Command-Line Installing

    the PHP Command-Line Interpreter PHPUnitを使うためのPHP拡張機能。 Ubuntu: php-cli、php-json、php-mbstring、php-xml、   php-pov、php-xdebug Windows: mbstring Using the PHP Command-Line Interpreter php --versionコマンドで、phpコマンドにパスが通っていること、 php コマンドが動作すること、バージョンが正しいことを確認。 Configuring PHP for Development PHPUnitを使うためのphp.iniの設定。  error_reporting=-1(エラーを確認するため)  xdebug.show_exception_trace=0(xdebugのエラー抑制)  xdebug.mode=coverage(xdebugのカバレッジモード)  zend.assertions=1, assert.exception=1(assert()関数の利用)  memory_limit=-1(カバレッジのためのメモリ制限解除) LineCoverageだけの場合は、XdebugではなくPCOV拡張機能が パフォーマンスの点でおすすめ。 ※Xdebugをカバレッジツールだけでなく、デバッグツールとしても使 用する場合は xdebug.mode=debug,coverage
  2. 1. Install(インストール) h2 h3 サマリ Installing PHPUnit PHP Archive (PHAR)

    PHPUnitのインストールと使用でおすすめの方法。 https://phar.phpunit.de/phpunit-11.phar でPHPUnit 11の最新バージョンをダウンロードできる。 ※マニュアルではまだ~ phpunit-10.pharと記載 一般的なディレクトリ構成  public(app static assets(CSS, JavaScript, images))  src(app PHP source code)  tests(app test suite)  tools(PHAR形式のPHPUnit等) Phiveを使用する方法もあり。(割愛) Composer composer require --dev phpunit/phpunit composer.jsonはプロジェクト依存関係を含むためバージョン管理すること。 composer.lockは必須ではないが、バージョン管理を推奨。 composer updateはメジャーバージョンを更新しないため、更新する必要がある場合は composer.jsonを修正する。 PHAR or Composer Composerの場合、ツールが必要なライブラリと開発ソフトウェアが必要なライブラリがとも にvendorディレクトリにインストールされ、依存関係の競合が発生する。 自己完結するPHARは開発ソフトウェアと依存関係の競合が発生しないため、 PHARを使 用したほうが良い。
  3. 1. Install(インストール) h2 h3 サマリ Installing PHPUnit Global Installation PHPUnitを$PATH上に配置して、すべてのプロジェクトで共有することもできる。

    ただし、プロジェクトごとに異なる PHPUnitのバージョンが必要になる可能性があるため、 共有インストールは良い考えではない。共有インストールとなる OSのパッケージマネー ジャを使用したPHPUnitのインストールはしないほうが良い。 Web Server テストの作成と実行は開発時の作業のため、 PHPUnitをWebサーバーに配置してはいけ ない。 デプロイ手順でPHPUnitやその他の開発ツールが Webサーバーに公開されないように注 意すること。
  4. 2. Writing Tests for PHPUnit(PHPUnitのテストの書き方) ・文字数 24,083 ・構成  ・Asserting Return Values

     ・Expecting Exceptions  ・Data Providers  ・Testing Output  ・Incomplete Tests  ・Skipping Tests  ・Test Dependencies  ・Failure Output
  5. 2. Writing Tests for PHPUnit(PHPUnitのテストの書き方) h2 h3 サマリ Asserting Return

    Values 基本的な規則と手順:  1. GreeterクラスのテストはGreeterTestクラスとする  2. GreeterTestはPHPUnit\Framework\TestCaseを継承する  3. テストはtest*というメソッドでpublicとする  またはPHPUnit\Framework\Attributes\Test属性を使用できる  4. テストメソッドでassertSame()のような評価メソッドで実際の値と期待値を比較する マーチン・ファウラーの言葉: printやdebugger式を書きたくなったら代わりにテストを書いてください。 Expecting Exceptions expectException()メソッドは期待する例外がスローされる前に使用する。 例外をスローするコードの直前に expectException()メソッドを呼ぶべき。 expectExceptionCode()、expectExceptionMessage()、expectExceptionMessageMatches()も存在する テストの3つの操作は、「戻り値の評価」「例外の期待」「副作用の検証」。 Data Providers テストメソッドは任意の引数を受け取る。その引数はデータ供給者により供給することができる。 PHPUnit\Framework\Attributes\DataProviderまたはDataProviderExternal属性を使用する。 データ供給者メソッドは publicかつstaticである必要がある。 Testing Output メソッド実行時の出力を評価したい場合がある。 PHPUnit\Framwork\TestCaseクラスの出力バッファリングでこれを実現している。 expectOutputRegex()は正規表現で出力を評価する。 expectOutputString()は文字列一致で出力を評価する。
  6. 2. Writing Tests for PHPUnit(PHPUnitのテストの書き方) h2 h3 サマリ Incomplete Tests

    テストメソッドが無い空のテストクラスを作る場合がある。 空のテストメソッドは失敗しないため、成功したと誤解されることが問題。 テスト成功が青、テスト失敗が赤と考えると、テスト不完全の黄色信号が必要。 markTestIncomplete()メソッドは不完全なテストとしてマークできる。 不完全なテストは、PHPUnitコマンドラインのテストランナー出力で Iが表示される。 Skipping Tests すべてのテストが、すべての環境で実行できるわけではない。 例えばMySQLドライバーのテストは MySQLサーバーが使用可能な環境でのみ実行できる。 setUp()メソッドで、環境を確認してテストを実行できないときは markTestSkipped()。 テストのスキップは、 PHPUnitコマンドラインのテストランナー出力で Sが表示される。 RequiresFunction()は指定された名前の関数が定義されていない場合はスキップする。 RequiresMethod()は指定された名前のメソッドが定義されていない場合はスキップする。 RequiresOperatingSystem()は正規表現と一致しない OSの場合はスキップする。 RequiresOperatingSystemFamily()はOSのファミリーと一致しない場合はスキップする。 RequiresPhp()はPHPバージョンが一致しない場合はスキップする。 RequiresPhpExtension()は指定したPHP拡張機能が利用できない場合はスキップする。 RequiresPhpunit()はPHPUnitのバージョンが一致しない場合はスキップする。 RequiresSetting()はPHP構成設定の値が一致しない場合はスキップする。
  7. 2. Writing Tests for PHPUnit(PHPUnitのテストの書き方) h2 h3 サマリ Test Dependencies

    PHPUnitはテストメソッド間の明示的な実行順序をサポートする。 プロデューサーはテスト対象のインスタンスを戻り値とするテストメソッド。 コンシューマは1つ以上のプロデューサとその戻り値をパラメータとするテストメソッド。 依存関係が設定されている場合、依存するテストが失敗した場合はスキップされる。 複数のテスト依存関係を設定することもできる。 Failure Output テストが失敗したとき、 PHPUnitは問題の特定に役立つ内容をできるだけ提供する。 例えば巨大な配列の一致が失敗した場合、失敗したインデックス周辺の数行を出力する。 エッジケース:  比較が失敗すると、 PHPUnitは入力値のテキスト表現でも比較する。
  8. SUMMARY ・1章 PHP拡張機能は cli, json, mbstring, xml, pov, xdebug ・1章 PHPUnitのためのphp.iniの設定 ・1章 インストールはPHARがおすすめ

    ・1章 Global Installationはおすすめしない ・2章 expectException()で例外の発生をテスト ・2章 属性でDataProviderを指定できる ・2章 expectOutputRegex|String()で出力をテスト ・2章 不完全なテストの定義、スキップ、テスト間の依存関係(順序) ご清聴ありがとうございました。