Ajax開発のテストツールとしてのPython
KLab Advent Calendar 2011 「DSAS for Social を支える技術」 の15日目です。
最近はソーシャルゲームの開発案件も増えてきました。Android/iOSアプリの開発をはじめとしたAjax通信の事例が数多くなり、開発スタイルも様変わりしつつあります。以前はWebサイト・Webアプリ構築の場合はPCや携帯のブラウザをリロードしながらだったのが、スマートフォンが加わりつつあります。
スマートフォンにおいてはさらにアプリ開発が大きな意味を持ちつつあります。携帯時代にもJavaアプリやBREWアプリなど多様なアプリがありましたが、スマートフォンアプリでの違いは、サーバとの通信を非常に多く行うようになったことです。クライアントアプリは多くの場合自前かもしくはWebViewを用い、通信はAjaxが使われます。リクエストもGETだけでなくPOSTを使う事も多くあり、ブラウザだけでサーバ開発・デバッグを進めるのは厳しい事が多くあります。
そんなわけで今回、Ajax通信を行う簡単なテストツールがほしいと思って少々探してみたのですが、「Selenium」というブラウザベースのツール以外見当たらないようでした。私が欲しかったのは単に一回のAjaxリクエストとレスポンスのそれぞれ引数と返値を検査して、想定通りの処理がされてるかどうかを見たかったのですが、今回の用途にはオーバースペックでした。
最初はサーバの動作確認にはwgetやcurlといったコマンドラインツールを使用していました。しかし基本的な疎通確認やプログラムがエラーなく動作するかどうかくらいには使えても、Ajaxレスポンスが複雑になってくるにつれてレスポンスのJSONの値が本当に正しいかどうかの判定はできません。目視での確認も限界があります。クライアントアプリが送った認証要求を正しく判別してOK/NGを返すかどうかとか、ゲームロジックとして正しい値を返すかどうか、などなど。開発が進むにつれてAjaxサーバの行う処理も複雑化しますので、早めにダミークライアント、サーバテスト用のスクリプトが是非欲しいところです。
Pythonにはユニットテストモジュールunittestが標準ライブラリとして組み込まれています。さらにHTTP通信を行うurllib2やjsonモジュールも標準ですので、これらを組み合わせればAjaxサーバの開発を強力に援護することができます。
import urllib2 import json import unittest session = 'xxxxxxxx' url = 'http://foo.bar/apps/?p={"session_id":"%s","action":"%s","params":"%s"}' class TestAjaxProcess(unittest.TestCase): def test01(self): f = urllib2.urlopen(url % (session, 'hoge_action', 1)) result = json.loads(f.read()) print result # Ajaxレスポンスには { "result":"ok", "data":{"response_code":1, ... }} のような内容を想定 self.assertEqual(result['result'], 'ok') self.assertEqual(result['data']['response_code'], 1) def test02(self): f = urllib2.urlopen(url % (session, 'hoge_action', 2)) result = json.loads(f.read()) print result # Ajaxレスポンスには { "result":"ng", "data":{"message": }} のような内容を想定 self.assertEqual(result['result'], 'ng') self.assertEqual(result['data']['message'], '"params" invalid') if __name__ == '__main__': unittest.main()
下は動作例です。
$ python tester.py { u'result':u'ok', u'data': {u'response_code": 1, u'value':100, u'extra_comment': u'hogehoge' }} { u'result':u'ng', u'data': {u'message': u'"params" invalid' }} .. ---------------------------------------------------------------------- Ran 2 tests in 0.160s OK
標準ライブラリが充実したスクリプト言語であれば、このようにAjaxテストスクリプトは容易に組めます。素早い実装柔軟な変更を求められる開発現場において、こうしたAjaxテスト環境を揃えておくことは、今後さらに重要度が増す事でしょう。