ConMas Gateway スクリプトのテスト、デバッグをどうする、というテーマの続編です。
前編 ConMas Gateway スクリプトのデバッグ (1)
結論は「スクリプト単体でテストをしましょう」です。
端末(i-Reporter)や ConMas Gateway を使うと何かと不便なので、テスト、デバッグの9割をスクリプト単体でテストをし、最後に端末と ConMas Gateway を使ったテストをしましょう、ということです。
準備
テストに必要となるデータの雛形を取得します。
Gateway が稼働するサーバ上のディレクトリ action 下のファイルを以下のようにしておきます。
Gateway は端末からのリクエストを受けると最初にこのファイルを探し出し参照します。次に Gateway は、"script"に記述されたスクリプトを起動します。
ConMas/gateway/action/hogehoge.json
{
"datasource": "script",
"script": "scripts/requestlog.py"
}
"script"に記述するスクリプトは以下のようなスクリプトにしておきます。
ConMas/gateway/scripts/requestlog.py
import sys
import json
import traceback
jsonData = json.loads(sys.stdin.readline())
# querydata = jsonData['query']
# postdata = jsonData['post']['clusters']
f = open('./logs/request.log', 'w')
dp = json.dumps(jsonData)
f.write(dp + '\n')
f.close()
mappings_data = []
mappings = dict(error="", mappings=mappings_data)
print(json.dumps(mappings))
この状態で、端末からGateway連携を起動させます。当然ですが、このスクリプトが実行されます。
このスクリプトは、端末からのリクエストをファイルに書き込む以外に何の仕事もしません。端末は期待するデータを受け取ることができませんが、準備作業としては問題はありません。
テスト
前述のスクリプトが出力したファイルは、サーバ上のディレクトリ ConMas/gateway/logs にあります。
テスト対象となる(前述の、リクエストをファイルに書く以外に何もしないスクリプトを偽物とした場合の)本物のスクリプトの入力には、端末からのリクエストの代わりに、このファイルを使用します。
これでスクリプト単体でのテストが可能となります。ここからのテストには、Gateway も端末も不要です。つまり、スクリプト・エンジンがPythonであれば、Pythonスクリプトの通常のテストとまったく同様のテストが可能です。当然ですが、便利なテスト・ツールを使うことが出来ます。
trace-Python文の実行をトレースまたは追跡する。
Pythonのデバッグを完全理解
Pythonプログラムを追跡する
pythonの例外でstack traceを表示する
忘れないうちにディレクトリ action 下のファイルを書き変えて本物にしておきましょう。
ConMas/gateway/action/hogehoge.json
{
"datasource": "script",
"script": "scripts/hogehoge.py"
}
テスト用に取得した入力ファイルにはJSONが書かれています。ただし、見にくいのでツール等を使ってキレイにしてから使用することをおすすめします。
例えば、こうやってスクリプトを実行させます。
c:\ConMas\gateway\scripts>type ..\logs\request.log | python hogehoge.py
参考までに、本物のスクリプトの姿はこんな感じです。
ConMas/gateway/script/hogehoge.py
import sys
import json
import traceback
try:
#-----------------------------------------------------
# 帳票から送信されたデータ
#-----------------------------------------------------
jsonData = json.loads(sys.stdin.readline())
mappings_data = []
#-----------------------------------------------------
# 帳票にレスポンスするデータを作成する処理がこの辺に書かれているはず
#-----------------------------------------------------
mappings = dict(error="", mappings=mappings_data)
print(json.dumps(mappings))
except Exception as e:
logging.debug(traceback.format_exc())
mappings = {"error": "Error: " + str(e)}
print(json.dumps(mappings))
テストにおいて入力データを変更したければ、入力ファイルの内容を書き換えれば良いのです。
ここで紹介したテストでは、端末(帳票)とのコンビネーションをテストすることは出来ませんが、それは後ですれば良い、という考え方に基づいています。それじゃダメ、という考えの場合は始めからコンビネーションでテストしてください。