serverless時代のテスト戦略(仮)を聴講したので、そのメモと感想を書きました。
資料が後日公開されるとのことなので、そのスライドと一緒に読んで頂ければ分かりやすいかと思います。メモなので流れが異なりますがご了承ください。
テーマとしては、テストコードのないlambdaにどう向き合っていくかというお話です。
ハッシュタグは#testlambda
でした。
2017.06.21追記: ご本人から資料・動画公開の旨教えて頂きました。ありがとうございます!
すばらしいエントリをありがとうございます! この講演ですが、先日講演資料とセッション録画が公開されました。
— Takuto Wada (@t_wada) June 20, 2017
下記リンクの「D4T7-4 Dev Day トラック 1」が当該講演です。
メモ
lambdaのテストに関するベストプラクティスはまだない。
お題はlamdbaの公式チュートリアルにテストをつける == testableなコードに書き換える
チュートリアル: Amazon S3 での AWS Lambda の使用 - AWS Lambda
テストの粒度について、テストサイズという概念を用いて解説されていた
- smallではネットワークアクセスはもちろんデータベースアクセスもしない独立したテスト
- mediumではネットワークはlocalhostのみ許可、外部サービスは利用をおすすめしない
- argeでは全部可。外部サービスも含め全部本番と同じものを使うテスト
という感じ。 t_wadaさんが講演で使用していたリンクは以下のものです。詳しくはリンク先をご覧下さい。
smallのテスト
例外系に対するテスト
mediumのテスト
デプロイなしでローカルでテストするには? - fake objectを使う。 fake objectとはtest doubleの一種。test doubleには
- Test Stub
- Test Spy
- Mock Object
- Fake Object
- Dummy Object
がある(stub/mockくらいしか知らなかった・・・)。 stub/mockと違い、fakeはテスト用の別実装を誰かが作っている。本番ではoracle databaseを利用するが、ローカルではsqliteやインメモリDBを使うなどもfakeの一種。*1
lambdaに話を戻すと、awsのfake実装であるlocalstackを利用する(atlassianすごい)。 本物とendpointが違うだけ。ライブラリではないので言語依存もない。 github.com
largeのテスト
本番のlambdaのテスト。Lambdaだけでなく、S3も全部本物。 ブランチごとにSAMの定義を行い、複数人でも自動テストを運用可能にする
その他
lambdaの固有のコードは呼び出し部分、S3、エラーリトライだけなので、そこを外に出してあげることで移植性の高いコードができる
運用監視
監視もテストのうち
不具合が出たら、それを再現させるテストコードを書いて、それが落ちることが確認できてから、書く
microservice間連携のテスト(E2Eテスト)
テストサイズの概念で言えば、largeの更に上。
マイクロサービス間のテストの課題として、モックしたリクエストやレスポンスが実際のものと異なるとき、テストは通るが本番で落ちてしまうという問題がある。
これを解決するため、Consumer-Driven Contracts testing*2に則りテストする。
CDC testingを実行するためのpactというGemがある。 github.com
consumer側の想定をファイルを用意し、それをprovider側からその想定があっているかテストをする。このテストをCIで定期的に回すようにする。
感想
とても興味深い内容で非常に面白かったです。知らない概念を知ることができたという点だけでなく、知っているが理解が曖昧だった概念や方法論が自分の中でかなりクリアになりました。 t_wadaさんの講演を聞いたのは初めてでしたが、その分かりやすさにとても驚きました。概念の説明も実例の説明もすごく分かりやすく、一度聞いただけなのにすんなりと頭に入ってきました。 TLにオーラでテストを書かせてこそ本物と流れていましたが、たしかにt_wadaさん見てオーラを近くで感じるだけでテスト書けそうな気がしてきました笑 大変ためになる講演ありがとうございました。
そういえば、今日初めて生twadaさんを見たけど、歩いている時のテスト書けオーラが半端なかった。
— tdual (@tdualdir) 2017年6月2日
オーラだけでテストを書かせてこそ本物(?)
— Takuto Wada (@t_wada) 2017年6月2日
オーラにコードを投げてテスト生成
— azu (@azu_re) June 2, 2017
オーラか…… pic.twitter.com/U2nzS4yMIE
— null (@yuroyoro) June 2, 2017
*1:このようにお話されていたと記憶していますが間違えていたら指摘頂ければ幸いです
*2:以下の2つのリンクが分かりやすいです。
Consumer-Driven Contracts testingを徹底解説! - Qiita
サービス分割時の複雑性に対処する: テスト戦略の話 - クックパッド開発者ブログ