【登壇資料】ServerlessDays Fukuoka 2019 で TypeScriprt と Jest を使ったサーバーレステストの話をしました #serverlessdays #serverlessfukuoka

2019.12.14

登壇資料

私を含む、サーバーレスデベロッパーの皆様にテストコードをどんどん書いていってほしくて登壇しました。

ServerlessDays Fukuoka 2019 とは

2019年12月14日(土)LINE 福岡にて、ServerlessDays Fukuoka が開催されました。

ServerlessDays Fukuoka 2019

office

発表のポイント

サーバーレステストのバイブル、t_wada さんの Testable Lambda

https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2019/12/t_wada.png

サーバーレスのテストで迷ったら、この資料を参考にすると良いです。

Node.js のテストにJestを使う

https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2019/12/jest.png

AWS CDK でも採用されている Facebook 製テストツールの Jest。今回はコレを使ってテストを書いていきます。

https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2019/12/ajenda.png

皆さんにテストコードを書いてもらうために、「こういうテストからやるとコスパいいよね」ということを考えることにしました。

一般的なテスト戦術が使える部分もある

https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2019/12/proof.png

構文ハイライト、リント、静的型検査は共通でサーバーレスにも使えそうです。あとは、ユニットテストとE2Eテストについてサーバーレスの文脈で考えます。

ユニットテスト:コードを分類するところから

https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2019/12/design.png

このまとめ方は、クリーンアーキテクチャ本で紹介されている手法のひとつで、機能別、レイヤ別にコードを分類しました。

充実したピュアロジックに対してテストする

https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2019/12/pyure_logic.png

Lambda Function に対するアプリケーション設計を行ったあと、Hubmle Object パターンを適用しました。これはまさしくユニットテストのための考え方で、テストしにくい振る舞いとテストしやすい振る舞いを分類するために生まれたそうです。これに倣って、サーバーレスにおけるテストしにくい振る舞い、つまり外界とやりとりするレイヤのコードを可能な限り薄くするよう仕向けます。

テストしにくい箇所を薄くしたことで、ピュアロジックが充実しました。Humble Object にしたところは一旦モックでOKです。サーバーレスのユニットテストでよく登場する LocalStack や SAM Local なんですが、ちょっと導入はまってください。というのは、これらで確認できるところってハンドラ層とインフラ層で、それは今薄くしているためです。ユニットテストは充実したピュアロジックに対してテストします。

E2E テスト:仕事内容でパターン別に分類

https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2019/12/web_api_job.png

仕事をパターン別に分類した後は、 デプロイされたAPIに対してテスト すると効果が高いです。例えばリクエストを送ってレスポンスを確認する。ピタゴラスイッチが全部つながっていることを確認できることは、サーバーレスにおいて大きな価値があります。

リクエスト・レスポンスを確認するE2Eテスト

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" }');
    });
});

まとめ

https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2019/12/conclusion.png

結論として、ピュアロジックに対するユニットテストと、正常系のE2Eテスト一本、まずはこのふたつが手軽に、かつ効果的にはじめられそうです。どこから手をつけていいか困っている人の参考になれば幸いです。

さいごに

とても熱気があって、サーバーレスの導入がどんどん進んでいることを肌身で感じ取れました。コミュニティに属する一員として、私もさらに開発スピードを上げていきたいと思います!