こんにちは、ナイトレイ採用担当の堀田です。
Wantedlyをご覧の方に、ナイトレイのエンジニアがどのようなことをしているか知っていただきたく、Qiitaに公開している記事をストーリーに載せています。
少しでも私たちに興味を持ってくれた方は下に表示される募集記事もご覧ください↓↓
はじめに
はじめまして株式会社ナイトレイの渡辺です。
現在私が関わっているプロダクトでPHPのユニットテストを導入した際、PHPUnitを利用するにあたって公式ドキュメントを一通り読んだので、この記事では個人的に重要な箇所を備忘録としてまとめます。
💡 本記事で記載されている内容はこちらのドキュメントから引用させていただいております
PHPUnit マニュアル — PHPUnit latest Manual
https://phpunit.readthedocs.io
対象読者
少しPHPUnitを使ったことがある
PHPUnitをもっと上手く使いたい
環境
PHPUnit 9.5.20
PHPUnit 用のテストの書き方
この章では、PHPUnit を使ったテストを書く際の基本的な決まり事や手順を紹介しています。
最低限、PHPUnitでテストを書く上で必要な情報なので一通り目を通すことを推奨します。
https://phpunit.readthedocs.io/ja/latest/writing-tests-for-phpunit.html
フィクスチャ
テンプレートメソッド
テンプレートメソッド setUp() および tearDown() は、テストケースクラスのテストメソッドごとに (そして最初にインスタンスを作成したときに) 一度ずつ実行されます。
また、テンプレートメソッド setUpBeforeClass()および tearDownAfterClass()が存在します。 これらはそれぞれ、テストケースクラスの最初のテストメソッドの実行前と テストケースクラスの最後のテストの実行後にコールされます。
アンチパターン
Example 4.3 テストスイートの複数テスト間でのフィクスチャの共有
🚫 複数テスト間でのフィクスチャの共有してしまっており、各オブジェクトが疎結合になっていない。
tearDown()の使い所
tearDown()を実装する必要があるのはsetUp()で外部リソース (ファイルやソケットなど) を割り当てた場合のみです。もし setUp()で単に PHP オブジェクトを作成しただけの場合は、 一般には tearDown()は必要ありません。
phpunit.xmlについて
beStrictAboutTestsThatDoNotTestAnything="false”
PHPUnit はデフォルトで、何も確かめていないテストを検出します。
このチェックを無効にするには、コマンドラインオプション --dont-report-useless-tests を使うか、あるいは PHPUnit の XML 設定ファイルで beStrictAboutTestsThatDoNotTestAnything="false" を設定します。
何もアサーションを実行していないテストは、このチェックを有効にしておくと、 危険であるとマークされます。モックオブジェクトでの例外や、 @expectedException などのアノテーションは、アサーションとみなします。
beStrictAboutOutputDuringTests="true”
PHPUnit は、テストの最中の出力を検出することができます。
このチェックを有効にするには、コマンドラインオプション --disallow-test-output を使うか、あるいは PHPUnit の XML 設定ファイルで beStrictAboutOutputDuringTests="true" を設定します。
テストコードあるいは被テストコードの中で、print などで何かを出力している場合に、 このチェックを有効にしておくと、危険であるとマークされます。
**XML 設定ファイルを用いたテストスイートの構成
PHPUnit の XML 設定ファイルを使ってテストスイートを構成することができます。
Example 5.1 で一番シンプルなphpunit.xmlファイルを示します。これは、tests ディレクトリを再帰的に探索して *Test.php というファイルにある *Test クラスをすべて追加する設定です。
Example 5.1 XML 設定ファイルを用いたテストスイートの構成
特定のテストスイートを実行したい場合は、--testsuite オプションを利用します。
-configuration が設定されていない場合は、現在の作業ディレクトリから phpunit.xml あるいは phpunit.xml.dist を (この順に) 探し、 見つかった場合はそれを自動的に読み込みます。
また以下のように、テストの実行順序を XML 設定ファイルで明示的に指定することもできます。
Example 5.2 XML 設定ファイルを用いたテストスイートの構成
不完全なテスト・テストの省略
テストに未完成の印をつける
Example 7.1 では SampleTest というテストケースクラスを定義しています。
markTestIncomplete() をテストメソッド内でコールすることで、 このメソッドがまだ完成していないことをはっきりさせます。
Example 7.1 テストに未完成の印をつける
未完成のテストは、PHPUnit のコマンドライン版テストランナーでは以下のように I で表されます。
アサーション
利用可能なアサーションメソッドの一覧
この章では、利用可能なアサーションメソッドの一覧が記載されています。
実際にテストを書く中で、どのような時にどのアサーションを使えばいいのかを考えるタイミングがあります。その度にこの章を見返すことで最適なアサーションを選択できるようになります。
https://phpunit.readthedocs.io/ja/latest/assertions.html
アノテーション
@testdox
アジャイルドキュメントを生成する際に使う別の説明を指定します。
@testdox アノテーションは、クラスにもテストメソッドにも指定できます。
@dataProvider
テストメソッドには任意の引数を渡すことができます。
引数は、データプロバイダメソッド (配列の配列を返すデータプロバイダの使用 の provider()) から渡されます。 使用するデータプロバイダメソッドを指定するには @dataProvider アノテーションを使います。
詳細は データプロバイダ を参照ください。
@before
@before アノテーションを使うと、 テストケースクラス内の各テストメソッドを実行する前に呼ぶメソッドを指定できます。
@after
@after アノテーションを使うと、 テストケースクラス内の各テストメソッドを実行した後に呼ぶメソッドを指定できます。
参考文献
https://phpunit.readthedocs.io/ja/latest/
いかがでしたか?ナイトレイでは、フロントエンド・バックエンド・アプリ開発など様々なメンバーが活躍しています。私たちは一緒に事業を盛り上げてくれるエンジニアメンバーを募集していますので、是非募集記事もご覧ください。
このような方におすすめ
✔︎ 自社Webサービスの開発で事業の発展に携わってみたい
✔︎ 自分が開発したものが顧客にどのように使われているのか知りたい(顧客の声を聞いてみたい)
✔︎ セールスチームなど、他部署のメンバーとコミュニケーションが取れる環境に興味がある
✔︎ 地理や地図が好きで仕事中も眺めていたい