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