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
48
『eg-r2』のご紹介
katzumi
0
8
runn開発者会議福岡2024
katzumi
0
9
リリース戦略を支えるCI/CDパ イプライン
katzumi
0
6
Slidevのテンプレートリポジトリについて
katzumi
0
110
OSSへの感謝を伝える
katzumi
0
590
モブワークを進化させていった話
katzumi
0
450
ActiveRecordパターンの呪縛を学びほぐして挑むクリーンアーキテクチャへの入り口
katzumi
0
42
実装と乖離させないスキーマ駆動開発フロー / OpenAPI Laravel編
katzumi
0
260
Other Decks in Technology
See All in Technology
新規プロダクトでプロトタイプから正式リリースまでNext.jsで開発したリアル
kawanoriku0
1
210
なぜテストマネージャの視点が 必要なのか? 〜 一歩先へ進むために 〜
moritamasami
0
240
EncryptedSharedPreferences が deprecated になっちゃった!どうしよう! / Oh no! EncryptedSharedPreferences has been deprecated! What should I do?
yanzm
0
490
AIエージェント開発用SDKとローカルLLMをLINE Botと組み合わせてみた / LINEを使ったLT大会 #14
you
PRO
0
130
フルカイテン株式会社 エンジニア向け採用資料
fullkaiten
0
8.8k
企業の生成AIガバナンスにおけるエージェントとセキュリティ
lycorptech_jp
PRO
2
200
Rustから学ぶ 非同期処理の仕組み
skanehira
1
150
未経験者・初心者に贈る!40分でわかるAndroidアプリ開発の今と大事なポイント
operando
5
750
[ JAWS-UG 東京 CommunityBuilders Night #2 ]SlackとAmazon Q Developerで 運用効率化を模索する
sh_fk2
3
460
複数サービスを支えるマルチテナント型Batch MLプラットフォーム
lycorptech_jp
PRO
1
950
Codeful Serverless / 一人運用でもやり抜く力
_kensh
7
450
初めてAWSを使うときのセキュリティ覚書〜初心者支部編〜
cmusudakeisuke
1
280
Featured
See All Featured
Thoughts on Productivity
jonyablonski
70
4.8k
jQuery: Nuts, Bolts and Bling
dougneiner
64
7.9k
The Cult of Friendly URLs
andyhume
79
6.6k
Facilitating Awesome Meetings
lara
55
6.5k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
131
19k
Building Applications with DynamoDB
mza
96
6.6k
4 Signs Your Business is Dying
shpigford
184
22k
Gamification - CAS2011
davidbonilla
81
5.4k
Rails Girls Zürich Keynote
gr2m
95
14k
Statistics for Hackers
jakevdp
799
220k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
285
14k
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