Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
APIテストでもカバレッジ測定 したい!
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
katzumi
March 09, 2024
Technology
38
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
290
『eg-r2』のご紹介
katzumi
0
42
runn開発者会議福岡2024
katzumi
0
41
リリース戦略を支えるCI/CDパ イプライン
katzumi
0
39
Slidevのテンプレートリポジトリについて
katzumi
0
160
OSSへの感謝を伝える
katzumi
0
700
モブワークを進化させていった話
katzumi
0
530
ActiveRecordパターンの呪縛を学びほぐして挑むクリーンアーキテクチャへの入り口
katzumi
0
68
実装と乖離させないスキーマ駆動開発フロー / OpenAPI Laravel編
katzumi
0
300
Other Decks in Technology
See All in Technology
DGX Spark でどこまでハッキングができるのか?
kash1064
2
1.3k
WasmをRustにする
sansantech
PRO
0
240
"優秀な誰か"の下位互換にならないために
yut0naga1_fa
1
1.8k
PagerDuty Tech Hub-鳴らすけれど、人は動かない
ezaki
0
150
NDIでApple Vision Proにリアルタイム映像送信
jyouryuusui
0
110
スキマバイトという雇用形態は存在しないので、雇用期間1日のアルバイト契約を事業者とワーカーが結ぶ手続きを支えるのがタイミーなんです
akitoshiga
0
180
SAENM ~Jupyterで残すPoCの試行錯誤、未来の自分と仲間を助ける記録!~
terapyon
0
100
Persisting Massive Data with Rails ~Designing for 60 billion rows, and fighting the bottlenecks~ Railsで挑む大量データ永続化 〜600億件を永続化するための設計とボトルネックとの戦い〜
occhi
0
670
Active Record Connection Adaptersにおける長年の課題に再び取り組む
yahonda
0
120
「事実」を「計測」して、「解釈」する 〜AWS Lambdaのメモリ最適解の見つけ方〜
maimyyym
0
150
AI × アーキテクト 第1・2章|生成AIの課題とアーキテクトの素養
daidaidai
0
130
味覇で作るパスタが美味い - 20261001_yabaubuki.dev
livesense
PRO
0
130
Featured
See All Featured
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
630
Faster Mobile Websites
deanohume
310
32k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.6k
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
520
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
530
From π to Pie charts
rasagy
1
400
The Mindset for Success: Future Career Progression
greggifford
PRO
0
540
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
1
450
Design in an AI World
tapps
1
350
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
580
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
2
470
Producing Creativity
orderedlist
PRO
348
41k
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