2008-09-30

Google App Engineのアプリのテストを書く

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
今まで、特定の関数のテストだけはやっていたのですが、
今更ながら、ちゃんとアプリ全体のテストを書こうと思いGoogle App Engineのテストを調べました。
参考にさせていただいたのは、前もお世話になった
http://coreblog.org/ats/3-tips-to-perform-test-driven-development-with-google-app-engine
です。

WebTestというのを利用するのですが、インストールはeasy_installでちょろっと入ります。
ただ実際に使うにはWebObというのも必要みたいなのでeasy_installでちょろっと入れます。
WebTestを使うとどっかのページにブラウザでアクセスしたのと同じようなレスポンスが帰ってきます。
その結果をいい感じに利用するためにBeautifulSoupも入れておくと便利な感じなのでeasy_installでちょろっと入れます。

WebTestに関する詳細は、公式の
http://pythonpaste.org/webtest/index.html
が参考になります。

これで準備ができてテストコードを書きます。
テストには下ではnoseを利用してみました。

# -*- coding: utf_8 -*-

import os
import sys
import re
import nose
from nose.tools import *
from webtest import TestApp
import logging

#webappでアプリを書いているならばimport
from google.appengine.ext import webapp

#アプリで利用しているAPIのスタブをimport
from google.appengine.api import apiproxy_stub_map
from google.appengine.api import datastore_file_stub
from google.appengine.api import user_service_stub
from google.appengine.ext import db, search
from google.appengine.api import urlfetch_stub
from google.appengine.api.memcache import memcache_stub

#実際のアプリで利用しているハンドラーを定義してテスト環境を準備する
application = webapp.WSGIApplication([
('/', TopPage),
('/login', LoginPage),
('/about', AboutPage),
('/faq', FaqPage),
],debug=True)

app = TestApp(application)

#テストを書く
def test_about():
#必要になる環境変数やヘッダーの値をセット
os.environ['USER_EMAIL'] = ""
os.environ['HTTP_USER_AGENT'] = "aaaa"
os.environ['REMOTE_ADDR'] = "127.0.0.1"
#GET要求の実施。ここで本当は環境変数とかをセットして渡せるみたいなのですが、うまくいかなかったので、直接環境変数をいじりました
res = app.get("/about")
#結果の確認
assert_equal(res.status,"200 OK")
#本文の取得。このやり方ではBeautifulSoupのオブジェクトが帰ってきます。
#res.bodyで普通に文字列が帰ってくる用のです。
soup = res.html
#classがcurrentのdivタグで囲まれた部分の取得
for cnt in soup('div',{'class':'current'}) :
text = cnt.renderContents().strip()
assert text == "About"

if __name__ == '__main__':
#利用するスタブをセットする
stub = datastore_file_stub.DatastoreFileStub(u'xxx','/dev/null',
'/dev/null')
apiproxy_stub_map.apiproxy.RegisterStub('datastore_v3', stub)
#なぜかdatastoreのスタブが_appがないとエラーが出るので環境変数を入れてごまかす
os.environ['APPLICATION_ID'] = "xxx"
apiproxy_stub_map.apiproxy.RegisterStub(
'user',user_service_stub.UserServiceStub())
os.environ['AUTH_DOMAIN'] = "gmail.com"
apiproxy_stub_map.apiproxy.RegisterStub(
'memcache',memcache_stub.MemcacheServiceStub())
apiproxy_stub_map.apiproxy.RegisterStub(
'urlfetch',urlfetch_stub.URLFetchServiceStub())


arg = ["dummy","-v"]
nose.main(argv=arg)
コメントを投稿