2016-06-17 60 views
0

我有一個非常簡單的網絡應用程序。所有重要的事情發生在index.py:Google App Engine + Python的本地單元測試WebApp2

from google.appengine.api import users 
import webapp2 
import os 
import jinja2 

JINJA_ENVIRONMENT = jinja2.Environment(
    loader=jinja2.FileSystemLoader(os.path.dirname(__file__)), 
    extensions=['jinja2.ext.autoescape'], 
    autoescape=True) 

def get_user(): 
    user = {} 
    user['email'] = str(users.get_current_user()) 
    user['name'], user['domain'] = user['email'].split('@') 
    user['logout_link'] = users.create_logout_url('/') 
    return user 

class BaseHandler(webapp2.RequestHandler): 

    def dispatch(self): 
    user = get_user() 
    template_values = {'user': user} 
    if user['domain'] != 'foo.com': 
     template_values['page_title'] = 'Access Denied' 
     template = '403' 
    else: 
     template_values['page_title'] = 'Home' 
     template = 'index' 
    template_engine = JINJA_ENVIRONMENT.get_template('%s.html' % template) 
    self.response.write(template_engine.render(template_values)) 

app = webapp2.WSGIApplication([ 
    ('/', BaseHandler), 
], debug=True) 

我想做個好人,寫一些地方的單元測試,但 - 看documentation後 - 我完全出我的深度。我想要的是一個基本的框架,我可以這樣做:

python test_security.py 

和模擬兩個用戶擊中域 - 一個@ foo.com誰應該得到的指數模板,一個@ bar.com誰應該得到403模板。

這裏就是我這麼遠:

import sys 

# I don't want to talk about it, let's just ignore this block 
sys.path.append('C:\Program Files (x86)\Google\google_appengine\lib\webapp2-2.5.2') 
sys.path.append('C:\Program Files (x86)\Google\google_appengine\lib\webob-1.2.3') 
sys.path.append('C:\Program Files (x86)\Google\google_appengine\lib\jinja2-2.6') 
sys.path.append('C:\Program Files (x86)\Google\google_appengine\lib\yaml-3.10') 
sys.path.append('C:\Program Files (x86)\Google\google_appengine\lib\jinja2-2.6') 
sys.path.append('C:\Program Files (x86)\Google\google_appengine') 
sys.path.append('C:\pytest') 


# A few proper imports 
import unittest 
import webapp2 
from google.appengine.ext import testbed 

# Import the module I'd like to test 
import index 

class TestHandlers(unittest.TestCase): 
    def test_hello(self): 

     self.testbed = testbed.Testbed() 
     self.testbed.init_user_stub() 
     self.testbed.setup_env(USER_EMAIL='[email protected]',USER_ID='1', USER_IS_ADMIN='0') 

     request = webapp2.Request.blank('/') 
     response = request.get_response(main.app) 

     print "running test" 

     self.assertEqual(response.status_int, 200) 
     self.assertEqual(response.body, 'Hello, world!') 

可以預見的是,這並不在所有的工作。我錯過了什麼?我只是高估了這應該是多麼簡單?

+0

什麼「根本不起作用」的意思是? –

+0

「運行測試」從來沒有輸出 - 所以雖然我認爲我已經定義了測試,但我不知道我需要做什麼來運行它。我敢肯定,當我嘗試去實現它時,我會遇到錯誤,但只是讓它走起來將是一個不錯的第一步:) – mcl

回答

2

如果你在用「蟒蛇test_security.py」調用此計劃,您正在尋找魔法的話是:

if __name__ == '__main__': 
    unittest.main() 

這會讓你的單元測試運行 - 目前你所做的只是定義它。

還要注意,您需要將request.get_response從「main.app」更改爲「index.app」。

1

我懷疑(主要是基於函數名稱),您應該調用self.testbed.init_user_stub()之前調用self.testbed.setup_env(),而不是之後。

此外,你似乎錯過了一個初始的self.testbed = testbed.Testbed()和可能的testbed.activate()調用。

可能想看看這個答案:https://stackoverflow.com/a/21139805/4495081

+0

編輯代碼示例符合此 - 謝謝。不幸的是,這個問題(嗯,許多問題中的第一個)是我的測試模塊實際上沒有運行(測試打印在那裏從未發生)。 我很驚訝(也許愚蠢)測試的世界對新手來說有多不透明。該應用程序工作正常,但迄今爲止測試比實際功能更難! – mcl

+1

起初很困難。不要絕望,不要咀嚼超過你可以咀嚼的東西。在您熟悉新技術之前,需要一些小小的步驟,那將是一件輕而易舉的事情。你的代碼不會顯示你調用'test_hello()'方法的方式/位置。 –

+0

謝謝!我會繼續嘗試:) – mcl

相關問題