1
/
5

森田ドラゴンのインターンシップ ~ 36日目~ テストとapi gwをやってます

こんにちは、高知からリモートインターンしている森田ドラゴンです。前回、pytestが動くようにしたので、テストコードを書くところから今日は始まりました。

例外処理の書き方が微妙

開発しているときは、頭の中でなんとなくコードが思い浮かぶんですが、テストコードは思い浮かびません。場当たり的に例外処理を作ってテストして行くと、またケアレスミスしそうなので、コードを俯瞰してテストする箇所を考えていましたが、いいアイディアが思い浮かびません。結局、思いついた箇所から例外処理を追加して行くことにしました。

出来上がったコードの一部が下になるんですが、作った自分からしても見辛いコードだと思います。ここら辺は勉強不足なので、指導してもらいたいです。

while True:
        if event["resource"] == "/list":
            # 関数呼び出し
            cities,prefs = get_city_list()
            body = {
                "code" : "200",
                "cities":cities,
                "prefs":prefs
            }   
            statusCode = 200
            break
            

        elif event["resource"] == "/get_weather":
            query = event["queryStringParameters"]
            try :
                date = query["date"]
                uri = query["uri"]
            except Exception as e:
                body = {
                    "code" : "E003",
                    "message": "パラメータに必要なデータが含まれていません",
                    "tip":"パラメータは dateとuriです",
                }
                break

コードのよくないと思ってる部分を話すと、

・エラー時にif文でbreakできなかったので、while文で大枠をくくっている
・if 文と try文が混在している
・breakが多い
・リクエストごとに処理を分けているが、関数で切り分けてもっと見やすくできそう

です。・・・精進します。

テストはデータが不味かった

テストは例外処理に合わせて、エラー時と正常時に分けて書いていたんですが、途中でテストに使うデータの形式がよくないことに気づきました。

def apigw_event(resource,query): 
    """ Generates API GW Event""" 
 
    return { 
        "body": '{ "test": "body"}', 
        "resource": resource, 
        "requestContext": { ・・・・

一応こういう形で、API GWから渡されるeventを定義していたんですが、これはtest_handlerにデフォルトで置いてあったもので、本当に渡されるデータがこの形式になっているか確認していませんでした。そのせいで、ローカルではデータが通っているのに、本番環境ではパスパラメータが受け取れないというエラーで詰まっています。

CloudWatchのログを見た感じ、lambdaではエラーが発生していないので、おそらくパスパラメータの形式か、API GWの設定が原因だと思います。来週は、API GWから受け取るeventが本当にその形式か、確認したいと思います。

Invitation from 株式会社サーバーワークス
If this story triggered your interest, have a chat with the team?
株式会社サーバーワークス's job postings

Weekly ranking

Show other rankings
Like 森田大智's Story
Let 森田大智's company know you're interested in their content