こんにちは。よっしーです(^^)
今日は、PHPUnitにおけるリスキーなテストについてご紹介します。
背景
PHPUnitは、例えば安全性に偽の信頼を与える不正確なテストを特定するのに役立ちます。
リスクのあるとみなされるテストは、コードカバレッジに寄与しません。
リスクのあるテストとは、例えば誤った結果を返し、信頼性に欠けるテストのことを指します。これらのテストは、テスト対象のコードを適切にカバーしていない可能性があるため、コードカバレッジの測定に含まれないという意味です。コードカバレッジは、テストスイートが実行された際にプログラムのソースコードのどの部分がテストされたかを示す指標であり、リスクのあるテストはこの指標に含まれません。
無意味なテスト
デフォルトでは、PHPUnitは何もテストしないテストに厳格です。つまり、アサーションを実行せず、モックオブジェクトに対して期待を設定しないテストです。
このチェックは、–dont-report-useless-testsオプションをコマンドラインで使用するか、PHPUnitのXML設定ファイルでbeStrictAboutTestsThatDoNotTestAnything=”false”を設定することで無効にできます。
意図しないカバーされたコード
PHPUnitは、意図しないカバーされたコードに対して厳格になることができます。このチェックは、–strict-coverageオプションをコマンドラインで使用するか、PHPUnitのXML設定ファイルでbeStrictAboutCoverageMetadata=”true”を設定することで有効にできます。
このチェックが有効な場合、PHPUnit\Framework\Attributes\CoversClassやPHPUnit\Framework\Attributes\CoversFunction(または@coversでアノテーションされた)に帰属され、PHPUnit\Framework\Attributes\CoversClass、PHPUnit\Framework\Attributes\CoversFunction、PHPUnit\Framework\Attributes\UsesClass、PHPUnit\Framework\Attributes\UsesFunction(または@coversや@usesのアノテーション)を使用して指定されていないコードを実行するテストは、リスキーとみなされます。
さらに、PHPUnitのXML設定ファイルでrequireCoverageMetadata=”true”を設定すると、コードカバレッジのメタデータを持たないテストもリスキーとみなされるようになります。
テスト実行中の出力
PHPUnitは、テスト中の出力に対して厳格になることができます。このチェックは、–disallow-test-outputオプションをコマンドラインで使用するか、PHPUnitのXML設定ファイルでbeStrictAboutOutputDuringTests=”true”を設定することで有効にできます。
テストが出力を生成する場合(例えばテストコードまたはテスト対象のコードでprintを呼び出すなど)、このチェックが有効になっているとテストはリスキーとみなされます。
テスト実行のタイムアウト
PHPUnitは、pcntl拡張が利用可能な場合、テストの実行に対して時間制限を設けることができます。この時間制限を有効にするには、–enforce-time-limitオプションをコマンドラインで使用するか、PHPUnitのXML設定ファイルでenforceTimeLimit=”true”を設定します。
PHPUnit\Framework\Attributes\Large(または@largeでアノテーションされた)に帰属されるテストは、60秒以上かかる場合にリスキーとみなされます。このタイムアウトは、XML設定ファイルのtimeoutForLargeTests属性を使って設定できます。
PHPUnit\Framework\Attributes\Medium(または@mediumでアノテーションされた)に帰属されるテストは、10秒以上かかる場合にリスキーとみなされます。このタイムアウトは、XML設定ファイルのtimeoutForMediumTests属性を使って設定できます。
PHPUnit\Framework\Attributes\Small(または@smallでアノテーションされた)に帰属されるテストは、1秒以上かかる場合にリスキーとみなされます。このタイムアウトは、XML設定ファイルのtimeoutForSmallTests属性を使って設定できます。
グローバルステートの変更
PHPUnitは、グローバルステートを変更するテストに対して厳格になることができます。このチェックは、–strict-global-stateオプションをコマンドラインで使用するか、PHPUnitのXML設定ファイルでbeStrictAboutChangesToGlobalState=”true”を設定することで有効にできます。
おわりに
PHPUnitにおけるリスキーなテストについてご紹介しました。
何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント