何でも屋エンジニアのブログ

Rails中級者向け勉強会Step-to-Rails-Expert.rbや出席した勉強会に関するメモが多い

AWS Summit 2017 serverless時代のテスト戦略(仮)を聴講したので、そのメモと感想

serverless時代のテスト戦略(仮)を聴講したので、そのメモと感想を書きました。 資料が後日公開されるとのことなので、そのスライドと一緒に読んで頂ければ分かりやすいかと思います。メモなので流れが異なりますがご了承ください。
テーマとしては、テストコードのないlambdaにどう向き合っていくかというお話です。 ハッシュタグ#testlambdaでした。

2017.06.21追記: ご本人から資料・動画公開の旨教えて頂きました。ありがとうございます!

下記リンクの「D4T7-4 Dev Day トラック 1」が当該講演です。

aws.amazon.com

メモ

lambdaのテストに関するベストプラクティスはまだない。

お題はlamdbaの公式チュートリアルにテストをつける == testableなコードに書き換える
チュートリアル: Amazon S3 での AWS Lambda の使用 - AWS Lambda

テストの粒度について、テストサイズという概念を用いて解説されていた

  • smallではネットワークアクセスはもちろんデータベースアクセスもしない独立したテスト
  • mediumではネットワークはlocalhostのみ許可、外部サービスは利用をおすすめしない
  • argeでは全部可。外部サービスも含め全部本番と同じものを使うテスト

という感じ。 t_wadaさんが講演で使用していたリンクは以下のものです。詳しくはリンク先をご覧下さい。

testing.googleblog.com

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さん見てオーラを近くで感じるだけでテスト書けそうな気がしてきました笑 大変ためになる講演ありがとうございました。

*1:このようにお話されていたと記憶していますが間違えていたら指摘頂ければ幸いです

*2:以下の2つのリンクが分かりやすいです。

Consumer-Driven Contracts testingを徹底解説! - Qiita
サービス分割時の複雑性に対処する: テスト戦略の話 - クックパッド開発者ブログ