- ソリューションアーキテクト
- プロジェクトマネージャー
- テクニカルオペレーション
- Other occupations (4)
- Development
- Business
- Other
こんにちは、高知からリモートインターンしている森田ドラゴンです。インターンの期間が空いていたのはRe:Invent2019に参加していたからです。受けていたハンズオンの復習ができていないので、レポート記事を書きながら復習したいなと思っています。
やることは以下です。
・pytestを書き直す (前回: mock等色々調べた)
・エラーのレスポンスを書く
・設計を書き直す
他にもS3の名前をわかりやすくしたり、コードを綺麗にしたりといったことをやる必要がありますが、主要なタスクはこの3つです。
前回、pytestで仮のデータの作成方法を学びました。ただ当然ながら、テストするにもエラー時のレスポンスを定義してあげる必要があります。こういう場合、設計がしっかり書いてあればすぐにかけそうなものですが、設計書を仕様が変わるたびに更新していなかったので、また考える必要があります。
エラー時のレスポンス
{
code : エラーコード
message: エラーの原因
tip : 解決方法
}
このサイトを参考にさせていただきました。APIのレスポンスは公式で規定されている訳ではなくて、サービスによって違うみたいです。エラーコードはエラーの原因と対応づけて、管理しやすくするためにつけています。
例外処理
エラーを想定した try ~ catchを書くのは初めてで、どこに書けばいいのか迷いました。(関数内で受け取るべきか、呼び出し元で受け取るべきか、エラー時の関数の返り値 など)とりあえず動くコードを書いてみないとわからないので、ざっくりと 関数全体を例外処理をして、それを判定してみます。
pytestのエラー
上のコードを試すためにpytestを実行してみると、エラーが発生しました。
self = <json.decoder.JSONDecoder object at 0x104716908>
s = '<?xml version="1.0" encoding="UTF-8" ?>\n<rss version="2.0" xmlns:ldWeather="http://weather.livedoor.com/ns/rss/2.0">...pubDate>\n<guid isPermaLink="true">http://weather.livedoor.com/area/forecast/012010?r=rss</guid>\n</channel>\n</rss>\n'
xmlをparseしていないからエラーが発生しているっぽいんですが、sam local start-api コマンドで実行してみると動作しているので、原因がわからなかったんですが、社員のsakaiさんが原因を見つけてくださいました。
テスト時に関数に与えているデータと、実行時に与えているデータが違ったために発生しているエラーだったみたいです。ケアレスミスだったのでちょっとへこみました。 pytestと samの仕様を理解していないので、そっち方面のエラーだとあたりをつけて進めていたせいです。
ちなみに与えていたデータは
本番 : http://weather.livedoor.com/forecast/webservice/json/v1?city=011000
テスト時 : http://weather.livedoor.com/forecast/rss/area/011000.xml
となっていました。うーん、簡単ですね。よく環境変数に定数など、重要なデータを定義しておけという話を聞きますがその大切さを実感できた気がします。定数の管理も雑なので、次からは定数の扱いはしっかり書きたいと思います。(意識します)
「実行環境 pytest 違い 」「aws sam pytest」等で調べて答えが出てこなかったので、お手上げ状態だったんですが、助けていただいて本当に助かりました。また宜しくお願いします<(_ _)>