7.6K Views
March 09, 24
スライド概要
APIテストにおいてのカバレッジは2つの意味を持ちます。2つのカバレッジについて、それぞれ意味とその取得方法について紹介
プロポーザル
https://fortee.jp/phperkaigi-2024/proposal/5703b970-bded-480e-8728-003165d65117
テストでもカバレッジ測定 したい! API API テストのカバレッジは2つの意味を持つ PHPerKaigi 2024 March 9, 2024. v0.0.5 @katzumi ( ) かつみ Press Space for next page
自己紹介 (かつみ)と申します。 katzumi 「障害のない社会をつくる」をビジョンに掲げている「りたりこ」という会社に所属しています 以下のアカウントで活動しています。 katzchum k2tzumi katzumi 2 / 30
お願い 写真撮影、 での実況について SNS 登壇者の励みになるので是非ともご意見やご感想など、フィードバック頂けると助かります mm あとでスライドを公開します 🙆♀📷 🙅♂📹💸 🙅📸👨👦👦 #phperkaigi #a 3 / 30
テスト 書いていますか? ✋ API 4 / 30
テストは いいぞ 👍 API 5 / 30
突然の宣伝! 6 / 30
シナリオテストを書くべき10の理由 API 昨年トークしてきました API シナリオテスト is 何?という方は是非! 7 / 30
シナリオテストを書くべき 10の理由 でみれます API YouTube v04 API シナリオテストを書くべき10の理由 katz… katz… 共有 見る 8 / 30
伝えたかったこと 他に色々あるけれども … 9 / 30
テストにとって カバレッジとは? 🤔 API 10 / 30
カバレッジとは? 網羅率。どれだけテストしたかの指標 “ ソフトウェアテストで用いられる「カバレッジ(網羅率)」とは対象のプログラム全体のうち、どこまでテストが実施(網羅)され たかを示す割合のことです。 テストを実施する際にカバレッジを測定/分析することでソフトウェアの品質を定量的に評価することができます。 ソフトウェアテストのカバレッジ(網羅率)とは|設定するメリット2つと注意点【ソフトウェア開発・テスト 用語 】| Qbook より 11 / 30
テストでのテスト観点とは? API 単体テストの観点とは違う エンドポイントの仕様の正確性を確認 エンドポイントは API の仕様通りに実装されているかを確認 リクエストが正しく受け付けられているかどうかを検証 レスポンスが仕様通りに返されているかを確認 2. API チェーンの検証 API を連鎖させて呼び出すことで、期待通りに動作するかを確認 例えば、登録 API を呼び出し、そのレスポンスに含まれる コードを使用して更新 API が呼ばれることを確認 ユースケース観点での動作検証 1. 12 / 30
テストの カバレッジは 2つの意味を持つ! API サブタイトル回収 13 / 30
2つの網羅性 テスト観点での優先度順 インターフェース上での網羅性 2. ロジック(ユースケース)上での網羅性 1. 14 / 30
インターフェース上での網羅性 に対するカバレッジ OpenAPI Spec エンドポイントに対しての網羅率を見る! 15 / 30
インターフェース上での網羅性 エンドポイントに対してのカバレッジの見える化 API シナリオテストツール runn でできる! 16 / 30
リクエストパラメータの組み合わせは?🤔 Q. エンドポイントだけカバーできればいいの? 条件網羅 (condition coverage) C1 複合条件網羅 (multiple condition coverage) C2 17 / 30
組み合わせは検証したほうがいい A. がっつりやるなら Controller テストの方がいい 最低限 Example(すべてのパラメータあり)と必須項目のみ これだけでもやっておくと安心感が違う プロパティベースドテストも良さそう https://github.com/schemathesis/schemathesis 18 / 30
ってどうなの?🤔 Q.runn 新しいツールなので学習コストが気になるハズ 他のツールとの違いは? テストの書き味は? 19 / 30
書き味が良くテストを量産させやすい A. テスト内容をコード・レビューができる テキストベースなのでパラメータ違いの 別シナリオをコピペ量産できる! 20 / 30
こんな感じのyaml の のカバレッジを広げる desc: OpenAPI Spec runners: req: endpoint: https://petstore3.swagger.io/api/v3 vars: status: "sold" steps: findPetsByStatus: desc: "Finds Pets by status" req: /pet/findByStatus?status={{ vars.status }}: get: header: accept: application/json test: | # 200 current.res.status == 200 ステータスコードが であること # ペットのステータスが正しいこと (続き) findPetById: desc: "Find pet by ID" req: /pet/{{ steps.findPetsByStatus.res.body[0].id }}: get: header: accept: application/json test: | # ステータスコードが200であること current.res.status == 200 # 指定されたIDで取得できること && current.res.body.id == steps.findPetsByStatus.res.body[0].id # ペットのステータスが正しいこと && current.res.body.status == vars.status && current.res.body[0].status == vars.status 21 / 30
その他runnのメリット のコマンドから、runn new でシナリオとテストを自動生成できる データ駆動テストもできる curl CI Friendly 22 / 30
チュートリアル本作り ました 🎉🎉 k1LoW @k1LoW · Follow 2023年 @katzchum による狂気の1人 アドベントカレンダーの結果生まれた runnチュートリアルがZenn bookに生 まれ変わった!(チャプターが増えた とか) 今なら無料! 23 / 30
ロジック上での網羅性 ユースケースをどこまでカバー出来ているか? ユースケース毎にエンドポイント別れていることが大半 CRUD で HTTP メソッドが変わる 24 / 30
ロジック上での網羅性 ユースケースをどこまでカバー出来ているか? ユースケース毎にエンドポイント別れていることが大半 CRUD で HTTP メソッドが変わる → エンドポイントのカバレッジで事足りるが… 24 / 30
コードカバレッジまで見たいか? ユースケース内の条件分岐とか … の HTML レポートを出力したい! コードの行単位にカバレッジを見たい! phpunit/php-code-coverage 25 / 30
コードカバレッジまで見たいか? ユースケース内の条件分岐とか … の HTML レポートを出力したい! コードの行単位にカバレッジを見たい! 別プロセスで動いている PHP のカバレッジをとるには?🤔 phpunit/php-code-coverage 25 / 30
コードカバレッジまで見たいか? ユースケース内の条件分岐とか … の HTML レポートを出力したい! コードの行単位にカバレッジを見たい! 別プロセスで動いている PHP のカバレッジをとるには?🤔 テストに対してカバレッジの紐づけるには?🤔 phpunit/php-code-coverage 25 / 30
こんな感じで見える化 👀 での出力結果 phpunit/php-code-coverage runn のシナリオの id が表示される 26 / 30
にはトレーサビリティがある! runn runn はリクエストにカスタムヘッダーを付与できる id からシナリオとステップが特定し、再実行できる % runn list --long --id 87996e05872c153740b740b85ceff5b84bcebecd path/to/**/*.yml id: desc: if: steps: path ----------------------------------------------------------------------------------------------------------------------87996e05872c153740b740b85ceff5b84bcebecd OpenAPI Spec 1 day19/exec-coverage.yml の のカバレッジを計測する % runn run --scopes run:exec --verbose --id 51672f3b69495f76959c4dc3a295f3a6a958ca2f **/*.yml === OpenAPI Spec (day19/open-api-coverage.yml) ... ok --- Finds Pets by status (findPetsByStatus) ... ok --- Find pet by ID (findPetById) ... ok の のカバレッジを広げる 1 scenario, 0 skipped, 0 failures 27 / 30
リモートホストで動くPHPアプリケーションの カバレッジ取得方法 テスト以外でも適用できます API を有効にする 通常の PHPUnit でコードカバレッジ取得するのと同じ スクリプト実行時にカバレッジ計測の関数を呼び出す Xdebug [1] 1. xdebug_start_code_coverage 計測対象の処理を実行する直前に呼び出す 2. xdebug_stop_code_coverage スクリプトが終了する前呼び出す 3. xdebug_get_code_coverage カバレッジをファイル出力する 計測完了後にカバレッジファイルからレポートファイル(HTML)出力 1. auto_prepend_file を利用して処理をフックしても良い ↩︎ 28 / 30
作った middleware Laravel の HTTPmiddleware を composer 化 PHPUnit のカバレッジ設定を参照し、カバレッジ計測の関数を呼び出す。 特定のリクエストヘッダーがある場合にのみリクエスト単位にカバレッジ取得する https://github.com/k2tzumi/laravel-coverage-middleware インストール方法 $ composer require --dev k2tzumi/laravel-coverage-middleware $ php artisan vendor:publish --provider="K2tzumi\LaravelCoverageMiddleware\Providers\CoverageServiceProvider" $ php artisan coverage:install {group} 使い方 でシナリオ作成する httpRunner の trace を true にする 1. runn runners: req: endpoint: https://petstore3.swagger.io/api/v3 trace: true 2. シナリオ実行する $ runn run --verbose path/to/**/*.yml 3. カバレッジファイルを集計してレポート作成する $ php -d memory_limit=-1 vendor/bin/phpcov merge --html coverage/html storage/coverage 29 / 30
参考資料&リンク リモートホストで動く PHP アプリケーションに対する E2E テストでカバレッジを測定する方法 https://blog.freedom-man.com/e2e_coverage runn クックブック https://zenn.dev/k1low/books/runn-cookbook runn チュートリアル https://zenn.dev/katzumi/books/runn-tutorial laravel-coverage-middleware https://github.com/k2tzumi/laravel-coverage-middleware 30 / 30