私の戦闘力は53万です

awsとgcpについて書きます

serverlessテスト手法(エミュレータなし)について書いてみる

このブログはAWS LambdaとServerless Advent Calendar 2021の16日目です。

qiita.com

サーバレスのテスト手法は様々なパターンがあり、
私も勉強会で情報収集するようにしていました。
ただ、結局のところ何が良いのかよく悩んでいたところではありました。

そんな折、AWSAtsushi Fukui (@afukui) | Twitterさんが
以前勉強会で、ローカルでの検証方法を語られていたり、
(該当部分に時間合わせてますが、この勉強会面白かったので、ぜひ全体見てください)

youtu.be

また、本アドベントカレンダーの5日目の
kensh (@_kensh) | Twitterさんのyoutube動画での
エミュレーションなしのテスト方法が
割と普段自分が実施している方法に近いのではと思ったことから
私の理解まとめと、具体的なコードを公開してみようと思いました。

youtu.be

本カレンダーではサーバレスやlambdaに詳しい方が
たくさんおられると思うので私の理解が間違っていたり、
もっとこうした方が良いといった
フィードバックやツッコミが頂けるかもという期待もあります。
ぜひお待ちしています!

サンプル

本記事での説明をより分かりやすくするため
サンプルでSAMのpython3.7のソースを公開しました。 github.com

dockerfile等はvscoderemote container
動作確認した時のものですので、
remote containerをお使いの方は是非ご利用ください。

コードを説明

lambdaのコードから見ます。
lambda起動時に実行されるlambda_handlerとは別の関数を書きます。
サンプルコードではfunction_sampleが該当します。
ここでは単純に2つの引数を足し算するだけです。

lambdaのコード

app.py

import os
.......(略)

def function_sample(num1: int, num2: int) -> int:
    res = num1 + num2
    return res


def lambda_handler(event, context):

    print(function_sample(3,4))

    return {
        "statusCode": 200
    }

テストコード

テストコードでは、上記関数(function_sample)を呼び出します。

tests/unit/test_hello.py

from functions.hello_world import app as app_hello

.......(略)

def test_function_sample():
    assert app_hello.function_sample(2, 3) == 5

テスト実行

deployはせず、ローカルでpytestを実行する形になります。

pytest  -k test_function_sample

こちらが、kensh (@_kensh) | Twitterさんの下記スライドの
エミュレータなしの方法に近いのかと思います。 f:id:remmemento:20211216214853p:plain

samやcdkの場合、buildやdeployをすると時間がかかってしまいますが
ローカルでソース変更してpytest実行するだけであれば
すぐに実行できます。

こうしてfunction_sampleが完成したら、
lambda_handlerからfunction_sampleを呼び出します。
サンプルのこの部分です

メインのロジック部分はこの方法で書いて
おおよそのバグを潰しておいて、
単純なコードだけではテストが難しい部分
(他サービスとの連携テストや権限周りのテストなど)は
deployして実際の環境で実施する形となります。

補足と考え方

ソース修正からテスト実行までの時間が短いことの価値は
Takuto Wada (@t_wada) | Twitterさんの
講演が分かりやすいと思います。
youtu.be

また、テスタビリティ向上のため、
外部との接続部分と、処理のロジックを切り分けるような話は
下記が分かりやすいと思いました。
こちらもサンプルコードを公開されています。 qiita.com

実は、この記事を見て、その分かりやすさに感動し、
自分も何か同じカレンダーで記事書いてみたい思い、
本記事を書いてみようと思いました。

あと理想と現実のバランスの取り方という点で、
以前クラメソさんで開催されていた勉強会がありがたかったです。 記事こちらです。 logmi.jp

また、本カレンダー6日目でhotswap的な手法も紹介されており、
最近使えるようになった手法で、こちらも開発段階では重宝しそうと思いました。
qiita.com

さいごに

もっと良い方法があれば是非知りたいのでコメント頂けると嬉しいです。
またカレンダー後半も楽しみにしています!
ありがとうございました。