GAE/Pyでユニットテスト
GAE/Pythonでユニットテストをするための準備
テスト自動化というより、dev_appserverを立ち上げずにLow Level APIの動作を見るのが目的。
Kay frameworkでのテスト
Kay frameworkを使ってるならアプリケーションフォルダに「tests」フォルダを作ってテストコードを保存して以下のコマンドを実行すればテストできる。かんたん!
python manage.py test
プレーンな環境でのテスト
フレームワークなしの環境だとちょっとめんどい。以下のリンクを見ながらやってみる。
unittest2パッケージをインストール
まずはユニットテスト用のパッケージ「unittest2」をインストールします。
wget http://pypi.python.org/packages/source/u/unittest2/unittest2-0.5.1.tar.gz tar xvzf http://pypi.python.org/packages/source/u/unittest2/unittest2-0.5.1.tar.gz cd unittest2-0.5.1 sudo python setup.py install
テストランナーのスクリプト
次にテストを実行するスクリプトを作成して適当なフォルダに保存。私はホームディレクトリの直下に保存しました。
rungaetest.py
#!/usr/bin/env python import optparse import sys # Install the Python unittest2 package before you run this script. import unittest2 USAGE = """%prog SDK_PATH TEST_PATH Run unit tests for App Engine apps. SDK_PATH Path to the SDK installation TEST_PATH Path to package containing test modules""" def main(sdk_path, test_path): sys.path.insert(0, sdk_path) import dev_appserver dev_appserver.fix_sys_path() suite = unittest2.loader.TestLoader().discover(test_path) unittest2.TextTestRunner(verbosity=2).run(suite) if __name__ == '__main__': parser = optparse.OptionParser(USAGE) options, args = parser.parse_args() if len(args) != 2: print 'Error: Exactly 2 arguments required.' parser.print_help() sys.exit(1) SDK_PATH = args[0] TEST_PATH = args[1] main(SDK_PATH, TEST_PATH)
直接実行できるようにします。
chmod 755 ~/.rungaetest.py
テストコードの例
テストコードを作成。setupとteardownで何か色々やっていますが、まだ詳しいことはわかっていません。
# testLLApi.py import unittest from google.appengine.ext import testbed from google.appengine.api.datastore import Get, Put, Entity class LLApiTestCase(unittest.TestCase): def setUp(self): self.testbed = testbed.Testbed() self.testbed.setup_env(app_id='ishida-appengine-py') self.testbed.activate() self.testbed.init_datastore_v3_stub() def tearDown(self): self.testbed.deactivate() def testPutAndGet(self): entity = Entity(kind='person') entity['name'] = 'ishida' entity['age'] = 31 key = Put(entity) stored = Get(key) self.assertEqual('ishida', stored['name']) self.assertEqual(31, stored['age'])
テストを実行
~/testgaepython.py /usr/local/google_appengine ./tests
1つめのパラメータはGoogle App Engineをインストールしたディレクトリのパス。2つめはテストコードが保存されたディレクトリのパス。
こんな感じで出力されます。↓
makoto@Mac-mini% ~/rungaetest.py /usr/local/google_appengine ./tests [/Users/makoto/work/projects/gae/ishida-makot-py] testPutAndGet (testLLApi.LLApiTestCase) ... ok ---------------------------------------------------------------------- Ran 1 test in 0.005s OK