【问题标题】:Local unit testing for Google App Engine + Python WebApp2Google App Engine + Python WebApp2 的本地单元测试
【发布时间】:2016-06-17 04:38:52
【问题描述】:

我有一个非常简单的网络应用程序。所有重要的事情都发生在 index.py 中:

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 和一个应该获得 403 模板的 @bar.com。

到目前为止,这是我所做的:

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='test@foo.com',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!')

可以预见的是,这根本行不通。我错过了什么?我是不是太高估了这应该有多简单?

【问题讨论】:

  • “根本不起作用”究竟是什么意思?
  • "running test" 从不输出 - 所以虽然我认为我已经定义了测试,但我不确定我需要做什么才能运行它。我敢肯定,当我尝试让它去时,我会遇到错误,但让它去是一个很好的第一步:)

标签: google-app-engine webapp2 python-unittest webtest


【解决方案1】:

如果您打算使用“python test_security.py”来调用它,您正在寻找的神奇词汇是:

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

这将使您的单元测试运行 - 目前您所做的只是定义它。

另请注意,您需要将 request.get_response 从“main.app”更改为“index.app”。

【讨论】:

    【解决方案2】:

    我怀疑(主要基于函数名称)您应该调用self.testbed.init_user_stub()之前调用self.testbed.setup_env(),而不是之后。

    此外,您似乎缺少一个初始的 self.testbed = testbed.Testbed() 和一个 testbed.activate() 呼叫。

    你可能想看看这个答案:https://stackoverflow.com/a/21139805/4495081

    【讨论】:

    • 根据此编辑的代码示例 - 谢谢。不幸的是,问题(嗯,许多问题中的第一个)是我的测试模块实际上并没有运行(那里的测试打印永远不会触发)。我很惊讶(也许愚蠢地)测试世界对新手来说是多么不透明。该应用程序运行良好,但到目前为止,测试比实际功能更难!
    • 一开始通常很难。不要绝望,不要咬得比你能咀嚼的多。小步骤,直到您熟悉新技术,然后它会变得轻而易举。您的代码未显示您如何/在何处调用 test_hello() 方法。
    • 谢谢!我会继续努力的:)
    猜你喜欢
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    • 1970-01-01
    • 2011-10-10
    • 1970-01-01
    • 2013-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多