PHPカンファレンス2022で使用したスライドです。 https://fortee.jp/phpcon-2022/proposal/386a0edd-c64a-407b-8201-b3e55e73441f
#phpcon2022#track42022/09/25 PHPカンファレンス2022@02テストコードリーディングのみでPHPUnitの仕様を理解してみる
View Slide
#phpcon2022#track4BankEnd Software Enginner02 大津 和槻:@cocoeyes022021/02~ BASE, Inc.自己紹介PHP系カンファレンス登壇 執筆 登壇応援中!
#phpcon2022#track4ソースコードを読んでいるときにこんなお悩みはありませんか?3
#phpcon2022#track4理解するのに時間がかかる具体例が欲しい使っているところを想像できない4ソースコードを読んでいるときにこんなお悩みはありませんか?
#phpcon2022#track4理解するのに時間がかかる具体例が欲しい使っているところを想像できないその問題、テストコードを読むことで解決できます!5ソースコードを読んでいるときにこんなお悩みはありませんか?
#phpcon2022#track4テストコードを読むと何がわかる?66
#phpcon2022#track4テストコードを読むと何がわかる?7プロダクトコードの大まかな仕様71
#phpcon2022#track4テストコードを読むと何がわかる?8プロダクトコードの大まかな仕様プロダクトコードの使用例812
#phpcon2022#track4テストコードを読むと何がわかる?9プロダクトコードの大まかな仕様プロダクトコードの使用例9実装する上で用いた観点123
#phpcon2022#track4そこで今回のテーマは!10
#phpcon2022#track4そこで今回のテーマは!テストコードのリーディングだけでPHPUnitの仕様を理解していきます11
#phpcon2022#track4そこで今回のテーマは!PHPUnitのプロダクトコードや公式ドキュメントサイトは一切見ない縛りで読みます12
#phpcon2022#track4今回のアジェンダ132テストコードを読む上での勘所を解説お題を決めてPHPUnitのテストコードを読む131
テストコードを読む上での勘所を解説
#phpcon2022#track4テストコードを読む上での勘所を解説1512テストコードの構成を把握しよう目的によって読むべきテストコードを変えよう153わからないテストは実際に動かしてみよう
#phpcon2022#track4テストコードを読む上での勘所を解説1612テストコードの構成を把握しよう目的によって読むべきテストコードを変えよう163わからないテストは実際に動かしてみよう
#phpcon2022#track4テストコードの構成を把握しよう17どの粒度のテストが実装されているのか把握しましょう。● ユニットテスト● 統合テスト● E2Eテストまた、同じユニットテストや統合テストでも、何を対象にしたテストなのかも把握しましょう。大体ディレクトリ構成やファイル名から読み取ることができます。
#phpcon2022#track4テストコードの構成を把握しよう18
#phpcon2022#track4テストコードの構成を把握しよう19E2Eテスト(統合テスト)静的解析ユニットテスト
#phpcon2022#track4テストコードの構成を把握しよう20E2Eテストディレクトリの中身
#phpcon2022#track4テストコードの構成を把握しよう21テスト対象の種類
#phpcon2022#track4テストコードの構成を把握しよう22Issueに対するリグレッションテスト
#phpcon2022#track4テストコードの構成を把握しよう23Issue番号に対応したテストIssue番号に対応したテスト
#phpcon2022#track4テストコードを読む上での勘所を解説2412テストコードの構成を把握しよう目的によって読むべきテストコードを変えよう243わからないテストは実際に動かしてみよう
#phpcon2022#track4目的によって読むべきテストコードを変えよう25正常系のE2Eテストと、異常系のユニットテストでは得られる情報が違う!必要なのは範囲の広い仕様理解?クラス・メソッドレベルなど詳細な仕様理解?正常系?異常系?これを見ればOK!ではなく、目的によって読むテストコードを選ぶ
#phpcon2022#track4目的によって読むべきテストコードを変えよう26
#phpcon2022#track4目的によって読むべきテストコードを変えよう27エラーが起きたときのE2Eテストでは、イベントの実行順序を確認している
#phpcon2022#track4目的によって読むべきテストコードを変えよう28エラーが起きたときのユニットテストでは、エラーにまつわる情報が期待通り出力されているか確認している
#phpcon2022#track4テストコードを読む上での勘所を解説29テストコードの構成を把握しよう目的によって読むべきテストコードを変えよう29わからないテストは実際に動かしてみよう123
#phpcon2022#track4わからないテストは実際に動かしてみよう30読んでいてわからないものはテストを実行してみましょう。何なら勝手に値を変えてみたり、assertionを追加してみるのもオススメです。テストコードは動くもので、いろんな具体例を知ることができます。大事なのは「理解した!」と自信がつくまで試すこと!
#phpcon2022#track4わからないテストは実際に動かしてみよう31
#phpcon2022#track4わからないテストは実際に動かしてみよう32「完全に理解した」と自信がつくまで増やそう!
#phpcon2022#track4わからないテストは実際に動かしてみよう33テスト駆動開発 26章「レッドバーのパターン」より学習用テストまずなじみのないクラスの新しいメソッドを相手にしているのだと、しっかり意識する。そして単にそのメソッドを使おうとする代わりに、APIが期待通りに動作するのかテストを書いて確かめるのだ。(中略)もし学習テストが失敗したら、自分たちのコードのテストも動きっこない、ということがわかる。その学習用テストが通るようになったら、自分達のコードのテストももちろん通る。
お題を決めてPHPUnitのテストコードを読む
#phpcon2022#track4ケーススタディ35お題:assertObjectEquals メソッドの仕様を理解する先にドキュメントを読んでみたい方はこちらからどうぞ!https://phpunit.readthedocs.io/ja/latest/assertions.html#assertobjectequals今回はassertOjbectEqualsの内部仕様を知りたい→ユニットテストを中心に読んでいきます
#phpcon2022#track4assertObjectEqualsメソッドの仕様を理解する36
#phpcon2022#track4assertObjectEqualsメソッドの仕様を理解する37assertObjectEqualsメソッドに関する正常系のテストケースがありました
#phpcon2022#track4assertObjectEqualsメソッドの仕様を理解する38constructに数値を渡したValueObjectを比較しています
#phpcon2022#track4assertObjectEqualsメソッドの仕様を理解する39同じ数値だったらassertがtrue異なる数値だったらAssertionFailedErrorの例外を返す
#phpcon2022#track4assertObjectEqualsメソッドの仕様を理解する40assertObjectEqualsメソッドで比較されている、このValueObjectは何者?
#phpcon2022#track4assertObjectEqualsメソッドの仕様を理解する41
#phpcon2022#track4assertObjectEqualsメソッドの仕様を理解する42ValueObject● intの値を取り扱う○ 引数は一つだけ● equalsメソッド○ ValueObject型のオブジェクトと同じ値であるか比較をしている○ 厳密な比較演算子を用いている● asIntメソッドでvalueを出力できる
#phpcon2022#track4assertObjectEqualsメソッドの仕様を理解する43いろんなint値にしても期待通り動きました(実行結果は割愛します)
#phpcon2022#track4assertObjectEqualsメソッドの仕様を理解する44String型のValueObjectを用意してみました
#phpcon2022#track4assertObjectEqualsメソッドの仕様を理解する45String型のValueObjectの新しいテストケースも、期待通り動きます
#phpcon2022#track4assertObjectEqualsメソッドの仕様を理解する46equalsメソッドを消した状態だとどうなるんだろうか?→異常系のテストケースを別ファイルから探す
#phpcon2022#track4assertObjectEqualsメソッドの仕様を理解する47equalsメソッドを消した状態だとどうなるんだろうか?→異常系のテストケースを別ファイルから探す
#phpcon2022#track4assertObjectEqualsメソッドの仕様を理解する48オブジェクトにequalsメソッドがないと、ComparisonMethodDoesNotExistExceptionが返ってくる(例外が返ってくる)
#phpcon2022#track4assertObjectEqualsメソッドの仕様を理解する49オブジェクトにequalsメソッドがないと、ComparisonMethodDoesNotExistExceptionが返ってくる(例外が返ってくる)
#phpcon2022#track4assertObjectEqualsメソッドの仕様を理解する50さらに下のメソッドを見ていくと、equalsメソッドの返り値がBoolでない場合も例外が返ってくる
#phpcon2022#track4assertObjectEqualsメソッドの仕様を理解する51さらに下のメソッドを見ていくと、equalsメソッドの返り値がBoolでない場合も例外が返ってくる
#phpcon2022#track4assertObjectEqualsメソッドの仕様を理解する52equalsという名前のメソッドじゃなければいけないのか?
#phpcon2022#track4assertObjectEqualsメソッドの仕様を理解する53equalsという名前のメソッドじゃなければいけないのか?→残念ながら実装されているテストコードからはわかりませんでしたドキュメントには第3引数の存在の説明があり、method名を指定(デフォルトはequals)できそうでした
#phpcon2022#track4assertObjectEqualsメソッドの仕様を理解する54リポジトリに実装されている各テストコードで、テストケースが網羅されているわけではありません。ときにはプロダクトコードを見て自力でテストコードを実装する必要があります。ちなみに、それが必要なテストケースなのであれば、コントリビュートチャンスなのではないかと思います。ぜひテストコードを書いてPRを出してみましょう!
#phpcon2022#track4assertObjectEqualsメソッドの仕様を理解する55テストコードを読むだけで分かった仕様● オブジェクト内で実装されているequalsメソッドを用いてテストしている● equalsメソッドを実装する際に定義すべきことテストコードだけでは分からなかった仕様● 第3引数でメソッド名を指定すれば、equalsメソッド以外の名前のメソッドを使って比較ができる今回はお試しで「テストコードだけ読む」という縛りで進めましたが、テストコードだけ読めば完璧...ではないです。プロダクトコードと一緒に読んでいきましょう!
#phpcon2022#track4最後に56テストコードを読むことは、プロダクトコードだけ読むよりも確実に仕様を理解できるので、コードリーディングの難易度が下がることが最大のメリットだと考えています。コードリーディングに自信がないと思う人ほど、テストコードを読んだり動かしてみることをお勧めします!
#phpcon2022#track4● phpunithttps://github.com/sebastianbergmann/phpunithttps://phpunit.de/https://phpunit.readthedocs.io/ja/latest/● テスト駆動開発https://www.amazon.co.jp/dp/B077D2L69C参考文献
#phpcon2022#track4最後に58バックエンドエンジニアフロントエンドエンジニアQAエンジニアSREセキュリティエンジニアデータエンジニアWe are hiring!https://binc.jp/jobsetc…