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
0
APIテストでもカバレッジ測定 したい!
PHPerKaigi 2024
https://phperkaigi.jp/2024/
katzumi
March 09, 2024
Tweet
Share
More Decks by katzumi
See All by katzumi
設計原則、アーキテクチャパターン、アーキテクチャスタイルの違いって何?いつどう向き合ったらいいの?を考えてみる
katzumi
0
10
『eg-r2』のご紹介
katzumi
0
0
runn開発者会議福岡2024
katzumi
0
1
リリース戦略を支えるCI/CDパ イプライン
katzumi
0
0
Slidevのテンプレートリポジトリについて
katzumi
0
68
OSSへの感謝を伝える
katzumi
0
550
モブワークを進化させていった話
katzumi
0
410
ActiveRecordパターンの呪縛を学びほぐして挑むクリーンアーキテクチャへの入り口
katzumi
0
39
実装と乖離させないスキーマ駆動開発フロー / OpenAPI Laravel編
katzumi
0
250
Other Decks in Technology
See All in Technology
JEDAI Meetup! Databricks AI/BI概要
databricksjapan
0
230
エンジニアが加速させるプロダクトディスカバリー 〜最速で価値ある機能を見つける方法〜 / product discovery accelerated by engineers
rince
4
440
「海外登壇」という 選択肢を与えるために 〜Gophers EX
logica0419
0
840
速くて安いWebサイトを作る
nishiharatsubasa
13
15k
OpenID Connect for Identity Assurance の概要と翻訳版のご紹介 / 20250219-BizDay17-OIDC4IDA-Intro
oidfj
0
290
2025-02-21 ゆるSRE勉強会 Enhancing SRE Using AI
yoshiiryo1
1
400
利用終了したドメイン名の最強終活〜観測環境を育てて、分析・供養している件〜 / The Ultimate End-of-Life Preparation for Discontinued Domain Names
nttcom
2
260
2024.02.19 W&B AIエージェントLT会 / AIエージェントが業務を代行するための計画と実行 / Algomatic 宮脇
smiyawaki0820
14
3.8k
目の前の仕事と向き合うことで成長できる - 仕事とスキルを広げる / Every little bit counts
soudai
26
7.5k
室長と気ままに学ぶマイクロソフトのビジネスアプリケーションとビジネスプロセス
ryoheig0405
0
370
PHPカンファレンス名古屋-テックリードの経験から学んだ設計の教訓
hayatokudou
2
460
ローカルLLMを活用したコード生成と、ローコード開発ツールへの応用
kazuhitoyokoi
0
100
Featured
See All Featured
Documentation Writing (for coders)
carmenintech
67
4.6k
The Power of CSS Pseudo Elements
geoffreycrofte
75
5.5k
A Tale of Four Properties
chriscoyier
158
23k
Fantastic passwords and where to find them - at NoRuKo
philnash
51
3k
Why You Should Never Use an ORM
jnunemaker
PRO
55
9.2k
The Pragmatic Product Professional
lauravandoore
32
6.4k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
28
9.3k
A designer walks into a library…
pauljervisheath
205
24k
Reflections from 52 weeks, 52 projects
jeffersonlam
348
20k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
175
51k
Building Adaptive Systems
keathley
40
2.4k
The Cult of Friendly URLs
andyhume
78
6.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