- 株式会社SCOUTER CTO
- @kotamat
- 🚲
- LaravelとVue.jsの勉強会
- 次回は4月くらいに開催予定
🙋
- Laravelでテストを書くときに便利になりそうなTips
- APIspecテスト
- ModelFactory
- Table Driven Test
- Laravelに標準で搭載されているHTTPリクエストを仮想的に使える関数を使ったテスト
- APIのE2Eの振る舞いをテストするのに簡単に使える
- LaravelではHTTPテストになっている
---?code=routes/api.php&lang=php
---?code=tests/Feature/ApiTest.php&lang=php&title=tests/Feature/ApiTest.php
Array
(
[page] => 1
)
---?code=tests/Feature/ApiTest.php&lang=php&title=tests/Feature/ApiTest.php
Array
(
[name] => hoge
)
---?code=tests/Feature/ApiTest.php&lang=php&title=tests/Feature/ApiTest.php
Array
(
[id] => 1
[name] => hoge
)
---?code=tests/Feature/ApiTest.php&lang=php&title=tests/Feature/ApiTest.php
Array
(
[id] => 1
)
- これを用いることで、API定義書を自動生成することが可能となる。
- 色々なプロジェクトで使用できるようにAPI定義書自動生成ツールを作成した。
- kotamat/laravel-apispec-generator
composer require --dev kotamat/laravel-apispec-generator
---?code=composer.json&lang=php&title=composer.json
@[17](composer requireでkotamat/laravel-apispec-generatorをインストール)
---?code=tests/ApiSpecTestCase.php&lang=php&title=ApiSpecTestCase.php
@5-7
---?code=tests/Feature/ApiWithSpecTest.php&lang=php&title=tests/Feature/ApiWithSpecTest.php
@9 @13-23 @28-38 @43-56 @61-71
---?code=storage/app/api/testpage1/GET.http&lang=http&title=get
---?code=storage/app/api/test/POST.http&lang=http&title=post
---?code=storage/app/api/test/1/PUT.http&lang=http&title=put
---?code=storage/app/api/test/1/DELETE.http&lang=http&title=delete
- APIスペック用のテストケースを書くだけで、API仕様書を記述可能
- .http形式を読み込めるエディターで動作確認可能
- 任意のEloquentモデルのテストデータを生成できる
- Eloquentモデル使ってると幸せになれる機能
- フォーム関連の入力値生成とか雑にデータを生成したいときに使う
- デフォで入ってる
---?code=database/factories/UserFactory.php&lang=php&title=database/factories/UserFactory.php
---?code=tests/Feature/ModelFactoryTest.php&lang=php&title=tests/Feature/ModelFactoryTest.php
@15 @16-21
---?code=tests/Feature/ModelFactoryTest.php&lang=php&title=tests/Feature/ModelFactoryTest.php
- 送信用データをいちいち作成する手間が無くなる。
- factoryの値をfakerで定義しておけば色々なダミーデータでチェックできる
- app/User.php // SubClass
- database/factories/UserFactory.php
- tests/Feature/ModelFactoryTest.php
- vendor/abstract/repository/src/User.php // SuperClass
- どこかのリポジトリでModelを抽象化
- その他複数のリポジトリでそのModelを継承して使用
- factoryした結果は継承先のモデルのインスタンスとして使用したい
---?code=app/User.php&lang=php&title=SuperClass ---?code=database/factories/UserFactory.php&lang=php&title=database/factories/UserFactory.php ---?code=app/UserB.php&lang=php&title=SubClass ---?code=tests/Feature/ModelFactoryTest.php&lang=php&title=TestCase
---?code=app/Utility/ModelFactoryParams.php&lang=php
---?code=database/factories/OtherRepoFactory.php&lang=php
- Model定義層で配列生成→使用側で一気にfactory登録で関心の分離
- ApiSpecの自動生成と併用すると👍
- Golang界隈で人気のテスト手法
- 入力パラメータの色々な組み合わせと正しい出力パラメータを繰り返し分でぶん回してチェックする
---?code=tests/tdt.go&lang=go
@3-5
---?code=tests/tdt_test.go&lang=go
テーブル型でチェックするため全ペアテストへの応用が効きやすい
- 全ての入力値パターンを全ての組み合わせでチェックしようとすると膨大な数のテストケースが必要
- 3つの引数がそれぞれ100通りの値を取りうる場合、100×100×100=1000000通り必要
- 無作為に値を抽出すると考慮漏れが発生する可能性があるが、全ペアテストを導入することで全体の1〜20%のチェック項目で70〜85%のチェックができる
- 全ペアの生成は色々なツールが出てる
- pictをインストール
alias genAllPair="pict <(pbpaste) /d:\"|\" /a:~ | tr '\t' ', ' | pbcopy"
みたいなかんじでエイリアス張っておく
- テストケースをPHPDocに書いておく
- テストケースをコピってターミナルで
genAllPair
と打つ - 出力された値をソースコードにコピってテストを書く
- テストはなるべく手を抜いて効果を最大化しよう
- 色々な手法を知ってると便利💪
- 他に便利な手法しってたら教えて下さい!🙏
Golangはいいぞ