Keep on moving

あんまりまとまってないことを書きますよ

GAEのテスト方法まとめ中(未完)

探してみたら意外と見つからなかったので軽くまとめてみます。
激しく自分の備忘用まとめです。
Google App Engineでテスト駆動開発を行うための3つのTips — TRIVIAL TECHNOLOGIES 2.0を参考に今回は「その2 : テスト用のstub*1を使う」をやってみました。*2

試した題材はGoogle App EngineでのMemchaceの排他処理を書いてみるテストです。

ソース

ソースは以下にあります。

http://bitbucket.org/ehren/gae_memcachespinlock/

フォルダ構成

root
    |--------main.py
    |
    |--------memcachespinlock.py
    |
    |--------\test
    |            |--------各テストファイルを格納

サンプル

import os
import sys
import unittest

BASE_DIR=os.path.abspath(os.path.dirname(__file__))
GAE_HOME = r'/usr/local/google_appengine' # GAEのモジュールが格納されているフォルダ

sys.path.append(os.path.dirname(BASE_DIR))
sys.path.append(GAE_HOME)

import memcachespinlock
# API Proxyを呼び出し
from google.appengine.api import apiproxy_stub_map
# テストするサービスのstubを呼び出し(例はmemacache)
from google.appengine.api.memcache import memcache_stub
from google.appengine.api import memcache


# GAE用のテストクラスを作成
class GAETestBase(unittest.TestCase):

    def setUp(self):
        # API Proxyを登録する(これは必須。ないとテスト実行時にエラーになる場合あり)
        apiproxy_stub_map.apiproxy =\
                apiproxy_stub_map.APIProxyStubMap()
        # ダミーのmemcacheサービスを登録する
        apiproxy_stub_map.apiproxy.RegisterStub( \
            'memcache', memcache_stub.MemcacheServiceStub())

    def tearDown(self):
        memcache.flush_all()


class TestMemCache(GAETestBase):

  # こんな感じでテストを記述
    def testSpinLockAcquire(self):
        memcache.add('test_lock', 0)
        isLocked = memcachespinlock._acquireLock('test_lock')
        self.assertEqual(isLocked, True)

if __name__ == '__main__':
    #unittest.main()
    suite1 = unittest.TestLoader().loadTestsFromTestCase(TestMemCache)
    unittest.TextTestRunner(verbosity=2).run(suite1)

*1:サービスには必ずあるみたい。TaskQueueももちろんあり

*2:そのうちnosegaeについても調べたいです