【登壇資料】ServerlessDays Fukuoka 2019 で TypeScriprt と Jest を使ったサーバーレステストの話をしました #serverlessdays #serverlessfukuoka
登壇資料
私を含む、サーバーレスデベロッパーの皆様にテストコードをどんどん書いていってほしくて登壇しました。
ServerlessDays Fukuoka 2019 とは
2019年12月14日(土)LINE 福岡にて、ServerlessDays Fukuoka が開催されました。
発表のポイント
サーバーレステストのバイブル、t_wada さんの Testable Lambda
サーバーレスのテストで迷ったら、この資料を参考にすると良いです。
Node.js のテストにJestを使う
AWS CDK でも採用されている Facebook 製テストツールの Jest。今回はコレを使ってテストを書いていきます。
皆さんにテストコードを書いてもらうために、「こういうテストからやるとコスパいいよね」ということを考えることにしました。
一般的なテスト戦術が使える部分もある
構文ハイライト、リント、静的型検査は共通でサーバーレスにも使えそうです。あとは、ユニットテストとE2Eテストについてサーバーレスの文脈で考えます。
ユニットテスト:コードを分類するところから
このまとめ方は、クリーンアーキテクチャ本で紹介されている手法のひとつで、機能別、レイヤ別にコードを分類しました。
充実したピュアロジックに対してテストする
Lambda Function に対するアプリケーション設計を行ったあと、Hubmle Object パターンを適用しました。これはまさしくユニットテストのための考え方で、テストしにくい振る舞いとテストしやすい振る舞いを分類するために生まれたそうです。これに倣って、サーバーレスにおけるテストしにくい振る舞い、つまり外界とやりとりするレイヤのコードを可能な限り薄くするよう仕向けます。
テストしにくい箇所を薄くしたことで、ピュアロジックが充実しました。Humble Object にしたところは一旦モックでOKです。サーバーレスのユニットテストでよく登場する LocalStack や SAM Local なんですが、ちょっと導入はまってください。というのは、これらで確認できるところってハンドラ層とインフラ層で、それは今薄くしているためです。ユニットテストは充実したピュアロジックに対してテストします。
E2E テスト:仕事内容でパターン別に分類
仕事をパターン別に分類した後は、 デプロイされたAPIに対してテスト すると効果が高いです。例えばリクエストを送ってレスポンスを確認する。ピタゴラスイッチが全部つながっていることを確認できることは、サーバーレスにおいて大きな価値があります。
describe('exchange API', (): void => { test('clear ticket', async (): void => { const exchangeNotificationUrl = 'http://ticket-system.jp/ticket/clear'; const request = { shori_id: '01234567890', }; const response = await Axios.post( exchangeNotificationUrl, qs.stringify(request), ); expect(response.data).toEqual('{ "response": "ok" }'); }); });
まとめ
結論として、ピュアロジックに対するユニットテストと、正常系のE2Eテスト一本、まずはこのふたつが手軽に、かつ効果的にはじめられそうです。どこから手をつけていいか困っている人の参考になれば幸いです。
さいごに
とても熱気があって、サーバーレスの導入がどんどん進んでいることを肌身で感じ取れました。コミュニティに属する一員として、私もさらに開発スピードを上げていきたいと思います!