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
22
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
APIテストでもカバレッジ測定 したい!
PHPerKaigi 2024
https://phperkaigi.jp/2024/
katzumi
March 09, 2024
More Decks by katzumi
See All by katzumi
設計原則、アーキテクチャパターン、アーキテクチャスタイルの違いって何?いつどう向き合ったらいいの?を考えてみる
katzumi
0
220
『eg-r2』のご紹介
katzumi
0
29
runn開発者会議福岡2024
katzumi
0
31
リリース戦略を支えるCI/CDパ イプライン
katzumi
0
27
Slidevのテンプレートリポジトリについて
katzumi
0
150
OSSへの感謝を伝える
katzumi
0
650
モブワークを進化させていった話
katzumi
0
490
ActiveRecordパターンの呪縛を学びほぐして挑むクリーンアーキテクチャへの入り口
katzumi
0
61
実装と乖離させないスキーマ駆動開発フロー / OpenAPI Laravel編
katzumi
0
290
Other Decks in Technology
See All in Technology
アンオフィシャルな、オフィシャルからのお願い
wyamazak_devrel
0
110
On-behalf-of Token exchange with AgentCore Identity
hironobuiga
2
200
2026 TECHFRESH 畢業分享會 - AI-Native 重塑軟體工程與虛擬講師
line_developers_tw
PRO
0
1k
2026TECHFRESH畢業分享會 - Lightning Talk - E起 See See : 電商推薦讀心術? 數據說了算
line_developers_tw
PRO
0
1k
Agent Skills設計で柔軟性と硬さのバランスが難しい話
nassy20
0
130
FinOps × AIエージェントで実現する コストインシデントの自動調査
oasis1994liveforever
0
140
GitHub Copilot 最新アップデート – 「一歩先」の実践活用術
moulongzhang
2
340
ACE-Step-1.5で見る 音楽生成AIのしくみと“破綻だけ直す”Retake機能の開発【zennfes spring 2026 登壇資料】
personabb
1
450
エンジニアリング戦略の作り方 / Crafting Engineering Strategy
iwashi86
21
6.9k
脆弱性対応、どこで線を引くか
rymiyamoto
1
390
AGENTS.mdとSkillsで始めるAIエージェント活用
sonoda_mj
3
210
Claude Codeをどのように キャッチアップしているか
oikon48
12
8k
Featured
See All Featured
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
330
Designing for Performance
lara
611
70k
Google's AI Overviews - The New Search
badams
0
1k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.3k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
330
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
460
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
160
Mobile First: as difficult as doing things right
swwweet
225
10k
First, design no harm
axbom
PRO
2
1.2k
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