用google的appengine编写应用程序的pytest插件
pytest_gae的Python项目详细描述
选项
- –使用GAE:打开此插件
- –gae路径:appengine的根目录(默认值google\u appengine)
- –GAE项目路径:项目的根目录(默认值./)
限制
插件不会阻止您使用 环境拒绝执行。因此,您可以轻松地执行以下操作:
import socket import numpy
测试刚刚通过。但不能在appengine环境中运行此代码, 因为沙拳。见:AppEngine Docs
这个插件使用内部appengine的代码,不能保证 谷歌不会改变它。
用法示例
假设我们有一个类似的目录
./ |-- gae # AppEngine's root | |-- ... |-- src # Your project's root | |-- app.yaml | |-- index.yaml | |-- main.py |-- tests # Tests' dir |-- test_handlers.py |-- test_models.py
main.py:
#!/usr/bin/env python from google.appengine.ext import webapp from google.appengine.ext.webapp import util from google.appengine.ext.webapp.util import login_required from google.appengine.api import users from google.appengine.ext import db class MyModel(db.Model): my_field = db.StringProperty(required=False) class IndexHandler(webapp.RequestHandler): def get(self): self.response.out.write('Index') class UsersHandler(webapp.RequestHandler): @login_required def get(self): if users.is_current_user_admin(): self.response.out.write('Admin') else: self.response.out.write('User') def make_application(): return webapp.WSGIApplication([('/index', IndexHandler), ('/users', UsersHandler)], debug=True) def main(): application = make_application() util.run_wsgi_app(application) if __name__ == '__main__': main()
测试模型
测试模型.py:
from google.appengine.ext import db import pytest from main import MyModel def test_basic(): m = MyModel(my_field='Foo') assert 'Foo' == m.my_field def test_new_model(): m = MyModel(my_field='Foo') pytest.raises(db.NotSavedError, lambda: m.key()) def test_saved_model(): m = MyModel(my_field='Foo') m.put() assert m.key()
与webtest一起使用
我们可以在WebTest库的帮助下测试处理程序。
我们将创建三个funcargs函数,允许我们测试应用程序:
- 从匿名用户的角度来看
- 从授权用户的角度来看
- 从管理角度看
我们可以通过改变os.environment
测试处理器.py:
import os from webtest import TestApp from main import make_application def pytest_funcarg__anon_app(request): os.environ.update({'USER_EMAIL': '', 'USER_ID': '', 'AUTH_DOMAIN': 'google', 'USER_IS_ADMIN': '0'}) return TestApp(make_application()) def pytest_funcarg__user_app(request): os.environ.update({'USER_EMAIL': 'simple@google.com', 'USER_ID': '1', 'AUTH_DOMAIN': 'google', 'USER_IS_ADMIN': '0'}) return TestApp(make_application()) def pytest_funcarg__admin_app(request): os.environ.update({'USER_EMAIL': 'admin@google.com', 'USER_ID': '2', 'AUTH_DOMAIN': 'google', 'USER_IS_ADMIN': '1'}) return TestApp(make_application()) def test_index(anon_app): assert "Index" in anon_app.get('/index') def test_user_with_user(user_app): assert "User" in user_app.get('/users') def test_user_with_anon(anon_app): assert '302 Moved Temporarily' == anon_app.get('/users').status def test_user_with_admin(admin_app): assert "Admin" in admin_app.get('/users')
运行
py.test tests --with-gae --gae-path=gae --gae-project-path=./src/ : platform linux2 -- Python 2.7.12, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 collected 7 items tests/test_handlers.py .... tests/test_models.py ... ============ 7 passed in 0.64 seconds ============