- ソリューションアーキテクト
- プロジェクトマネージャー
- テクニカルオペレーション
- Other occupations (4)
- Development
- Business
- Other
こんにちは、高知からリモートインターンしている森田ドラゴンです。前回、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が本当にその形式か、確認したいと思います。