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

APIテストでもカバレッジ測定 したい!

APIテストでもカバレッジ測定 したい!

PHPerKaigi 2024
https://phperkaigi.jp/2024/

katzumi

March 09, 2024
Tweet

More Decks by katzumi

Other Decks in Technology

Transcript

  1. API テストでもカバレッジ測定 したい! PHPerKaigi 2024  March 9, 2024. v0.0.5 @katzumi

    ( かつみ) Press Space for next page API テストのカバレッジは2つの意味を持つ
  2. 8 / 30 API シナリオテストを書くべき10 の理由 見る v04 API シナリオテストを書くべき10

    の理由   katz v04 API シナリオテストを書くべき10 の理由   katz… … 共有 共有 YouTube でみれます
  3. 11 / 30 カバレッジとは? ソフトウェアテストのカバレッジ( 網羅率) とは|設定するメリット2つと注意点【ソフトウェア開発・テスト 用語 】| Qbook

    より 網羅率。どれだけテストしたかの指標 ソフトウェアテストで用いられる「カバレッジ( 網羅率) 」とは対象のプログラム全体のうち、どこまでテストが実施( 網羅) され たかを示す割合のことです。 テストを実施する際にカバレッジを測定/ 分析することでソフトウェアの品質を定量的に評価することができます。 “
  4. 12 / 30 API テストでのテスト観点とは? 単体テストの観点とは違う 1. エンドポイントの仕様の正確性を確認 エンドポイントは API

    の仕様通りに実装されているかを確認 リクエストが正しく受け付けられているかどうかを検証 レスポンスが仕様通りに返されているかを確認 2. API チェーンの検証 API を連鎖させて呼び出すことで、期待通りに動作するかを確認 例えば、登録 API を呼び出し、そのレスポンスに含まれる コードを使用して更新 API が呼ばれることを確認 ユースケース観点での動作検証
  5. 18 / 30 A.  組み合わせは検証したほうがいい がっつりやるなら Controller テストの方がいい 最低限 Example

    (すべてのパラメータあり)と必須項目のみ これだけでもやっておくと安心感が違う プロパティベースドテストも良さそう https://github.com/schemathesis/schemathesis
  6. 21 / 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 # ペットのステータスが正しいこと && current.res.body[0].status == vars.status (続き) 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
  7. 23 / 30 チュートリアル本作り ました 🎉🎉 k1LoW @k1LoW·Follow 2023年 @katzchum による狂気の1人

    アドベントカレンダーの結果生まれた runnチュートリアルがZenn bookに生 まれ変わった!(チャプターが増えた とか) 今なら無料!
  8. 27 / 30 runn にはトレーサビリティがある! id からシナリオとステップが特定し、再実行できる runn はリクエストにカスタムヘッダーを付与できる %

    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
  9. 28 / 30 リモートホストで動くPHP アプリケーションの カバレッジ取得方法 Xdebug を有効にする 通常の PHPUnit

    でコードカバレッジ取得するのと同じ スクリプト実行時にカバレッジ計測の関数を呼び出す 1. xdebug_start_code_coverage 計測対象の処理を実行する直前に呼び出す 2. xdebug_stop_code_coverage スクリプトが終了する前呼び出す 3. xdebug_get_code_coverage カバレッジをファイル出力する 計測完了後にカバレッジファイルからレポートファイル(HTML) 出力 1. auto_prepend_file を利用して処理をフックしても良い ↩︎ API テスト以外でも適用できます [1]
  10. 29 / 30 middleware 作った PHPUnit のカバレッジ設定を参照し、カバレッジ計測の関数を呼び出す。 特定のリクエストヘッダーがある場合にのみリクエスト単位にカバレッジ取得する https://github.com/k2tzumi/laravel-coverage-middleware Laravel

    の HTTPmiddleware を composer 化 インストール方法 $ composer require --dev k2tzumi/laravel-coverage-middleware $ php artisan vendor:publish --provider="K2tzumi\LaravelCoverageMiddleware\Providers\CoverageServiceProvider" $ php artisan coverage:install {group} 使い方 1. runn でシナリオ作成する httpRunner の trace を true にする 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
  11. 30 / 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