Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
APIテストでもカバレッジ測定 したい!
Search
katzumi
March 09, 2024
Technology
0
7
APIテストでもカバレッジ測定 したい!
PHPerKaigi 2024
https://phperkaigi.jp/2024/
katzumi
March 09, 2024
Tweet
Share
More Decks by katzumi
See All by katzumi
設計原則、アーキテクチャパターン、アーキテクチャスタイルの違いって何?いつどう向き合ったらいいの?を考えてみる
katzumi
0
40
『eg-r2』のご紹介
katzumi
0
8
runn開発者会議福岡2024
katzumi
0
9
リリース戦略を支えるCI/CDパ イプライン
katzumi
0
6
Slidevのテンプレートリポジトリについて
katzumi
0
100
OSSへの感謝を伝える
katzumi
0
590
モブワークを進化させていった話
katzumi
0
440
ActiveRecordパターンの呪縛を学びほぐして挑むクリーンアーキテクチャへの入り口
katzumi
0
42
実装と乖離させないスキーマ駆動開発フロー / OpenAPI Laravel編
katzumi
0
260
Other Decks in Technology
See All in Technology
本当にわかりやすいAIエージェント入門
segavvy
10
6k
Snowflake のアーキテクチャは本当に筋がよかったのか / Data Engineering Study #30
indigo13love
0
260
公開初日に個人環境で試した Gemini CLI 体験記など / Gemini CLI実験レポート
you
PRO
3
350
2025-07-25 NOT A HOTEL TECH TALK ━ スマートホーム開発の最前線 ━ SOFTWARE
wakinchan
0
140
PdM業務における使い分け
shinshiro
0
590
MCP とマネージド PaaS で実現する大規模 AI アプリケーションの高速開発
nahokoxxx
1
1.5k
P2P ではじめる WebRTC のつまづきどころ
tnoho
1
220
AI Ready API ─ AI時代に求められるAPI設計とは?/ AI-Ready API - Designing MCP and APIs in the AI Era
yokawasa
21
5.8k
PHPからはじめるコンピュータアーキテクチャ / From Scripts to Silicon: A Journey Through the Layers of Computing
tomzoh
2
390
ecspressoの設計思想に至る道 / sekkeinight2025
fujiwara3
11
1.6k
経験がないことを言い訳にしない、 AI時代の他領域への染み出し方
parayama0625
0
170
低レイヤソフトウェア技術者が YouTuberとして食っていこうとした話
sat
PRO
7
5.8k
Featured
See All Featured
4 Signs Your Business is Dying
shpigford
184
22k
Gamification - CAS2011
davidbonilla
81
5.4k
Making Projects Easy
brettharned
116
6.3k
Building a Scalable Design System with Sketch
lauravandoore
462
33k
Measuring & Analyzing Core Web Vitals
bluesmoon
7
530
Done Done
chrislema
184
16k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
130
19k
VelocityConf: Rendering Performance Case Studies
addyosmani
332
24k
How to train your dragon (web standard)
notwaldorf
96
6.1k
The Pragmatic Product Professional
lauravandoore
35
6.8k
Writing Fast Ruby
sferik
628
62k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
47
9.6k
Transcript
API テストでもカバレッジ測定 したい! PHPerKaigi 2024 March 9, 2024. v0.0.5 @katzumi
( かつみ) Press Space for next page API テストのカバレッジは2つの意味を持つ
自己紹介 「障害のない社会をつくる」をビジョンに掲げている「りたりこ」という会社に所属しています 以下のアカウントで活動しています。 2 / 30 katzumi (かつみ)と申します。 katzchum k2tzumi
katzumi
お願い 登壇者の励みになるので是非ともご意見やご感想など、フィードバック頂けると助かります mm あとでスライドを公開します 3 / 30 写真撮影、SNS での実況について 🙆♀📷
🙅♂📹💸 🙅📸👨👦👦 #phperkaigi #a
4 / 30 API テスト 書いていますか? ✋
5 / 30 API テストは いいぞ 👍
6 / 30 突然の宣伝!
7 / 30 API シナリオテストを書くべき10 の理由 API シナリオテスト is 何?という方は是非!
昨年トークしてきました
8 / 30 API シナリオテストを書くべき10 の理由 見る v04 API シナリオテストを書くべき10
の理由 katz v04 API シナリオテストを書くべき10 の理由 katz… … 共有 共有 YouTube でみれます
9 / 30 伝えたかったこと 他に色々あるけれども…
10 / 30 API テストにとって カバレッジとは? 🤔
11 / 30 カバレッジとは? ソフトウェアテストのカバレッジ( 網羅率) とは|設定するメリット2つと注意点【ソフトウェア開発・テスト 用語 】| Qbook
より 網羅率。どれだけテストしたかの指標 ソフトウェアテストで用いられる「カバレッジ( 網羅率) 」とは対象のプログラム全体のうち、どこまでテストが実施( 網羅) され たかを示す割合のことです。 テストを実施する際にカバレッジを測定/ 分析することでソフトウェアの品質を定量的に評価することができます。 “
12 / 30 API テストでのテスト観点とは? 単体テストの観点とは違う 1. エンドポイントの仕様の正確性を確認 エンドポイントは API
の仕様通りに実装されているかを確認 リクエストが正しく受け付けられているかどうかを検証 レスポンスが仕様通りに返されているかを確認 2. API チェーンの検証 API を連鎖させて呼び出すことで、期待通りに動作するかを確認 例えば、登録 API を呼び出し、そのレスポンスに含まれる コードを使用して更新 API が呼ばれることを確認 ユースケース観点での動作検証
13 / 30 API テストの カバレッジは 2つの意味を持つ! サブタイトル回収
14 / 30 2つの網羅性 テスト観点での優先度順 1. インターフェース上での網羅性 2. ロジック(ユースケース)上での網羅性
15 / 30 インターフェース上での網羅性 エンドポイントに対しての網羅率を見る! OpenAPI Spec に対するカバレッジ
16 / 30 インターフェース上での網羅性 API シナリオテストツール runn でできる! エンドポイントに対してのカバレッジの見える化
17 / 30 Q. リクエストパラメータの組み合わせは?🤔 エンドポイントだけカバーできればいいの? 条件網羅 (condition coverage) C1
複合条件網羅 (multiple condition coverage) C2
18 / 30 A. 組み合わせは検証したほうがいい がっつりやるなら Controller テストの方がいい 最低限 Example
(すべてのパラメータあり)と必須項目のみ これだけでもやっておくと安心感が違う プロパティベースドテストも良さそう https://github.com/schemathesis/schemathesis
19 / 30 Q.runn ってどうなの?🤔 新しいツールなので学習コストが気になるハズ 他のツールとの違いは? テストの書き味は?
20 / 30 A. 書き味が良くテストを量産させやすい テスト内容をコード・レビューができる テキストベースなのでパラメータ違いの 別シナリオをコピペ量産できる!
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
22 / 30 その他runn のメリット curl のコマンドから、runn new でシナリオとテストを自動生成できる データ駆動テストもできる
CI Friendly
23 / 30 チュートリアル本作り ました 🎉🎉 k1LoW @k1LoW·Follow 2023年 @katzchum による狂気の1人
アドベントカレンダーの結果生まれた runnチュートリアルがZenn bookに生 まれ変わった!(チャプターが増えた とか) 今なら無料!
24 / 30 ロジック上での網羅性 ユースケースをどこまでカバー出来ているか? ユースケース毎にエンドポイント別れていることが大半 CRUD で HTTP メソッドが変わる
24 / 30 ロジック上での網羅性 ユースケースをどこまでカバー出来ているか? ユースケース毎にエンドポイント別れていることが大半 CRUD で HTTP メソッドが変わる
→ エンドポイントのカバレッジで事足りるが…
25 / 30 コードカバレッジまで見たいか? ユースケース内の条件分岐とか… phpunit/php-code-coverage の HTML レポートを出力したい! コードの行単位にカバレッジを見たい!
25 / 30 コードカバレッジまで見たいか? ユースケース内の条件分岐とか… phpunit/php-code-coverage の HTML レポートを出力したい! コードの行単位にカバレッジを見たい!
別プロセスで動いている PHP のカバレッジをとるには?🤔
25 / 30 コードカバレッジまで見たいか? ユースケース内の条件分岐とか… phpunit/php-code-coverage の HTML レポートを出力したい! コードの行単位にカバレッジを見たい!
別プロセスで動いている PHP のカバレッジをとるには?🤔 テストに対してカバレッジの紐づけるには?🤔
26 / 30 こんな感じで見える化👀 runn のシナリオの id が表示される phpunit/php-code-coverage での出力結果
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
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]
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
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