用google的appengine编写应用程序的pytest插件

pytest_gae的Python项目详细描述


比重瓶

pytest插件帮助您测试 用google的AppEngine编写的应用程序。

选项

  • –使用GAE:打开此插件
  • –gae路径:appengine的根目录(默认值google\u appengine
  • –GAE项目路径:项目的根目录(默认值./

限制

插件不会阻止您使用 环境拒绝执行。因此,您可以轻松地执行以下操作:

import socket
import numpy

测试刚刚通过。但不能在appengine环境中运行此代码, 因为沙拳。见:AppEngine Docs

这个插件使用内部appengine的代码,不能保证 谷歌不会改变它。

其他

这个项目的灵感来自nose gae插件nose

http://code.google.com/p/nose-gae/

用法示例

假设我们有一个类似的目录

./
|-- 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 ============

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java在依赖项上没有这样的方法异常   java如何将@Value注入setter?   验证输入java的最佳实践   java在使用kotlin的安卓项目中没有此类字段错误   我们可以强制java接口实现超时吗?   java将BasicAuth()与FormLogin()组合用于不同的路径   java无法在更新SDK后更新应用程序(未安装应用程序)   macos Java 8、Swing和OSX:对话框使UI对鼠标无响应   java自定义单元格格式以US格式显示,尽管使用了带UK语言环境的DataFormatter   java按升序排列列表字符串数据   java Hibernate OGM[PersistenceUnit:person]无法构建Hibernate SessionFactory   生命周期配置未涵盖java插件执行:com。乱穿马路。专家插件。安卓generation2:安卓mavenplugin:3.5.0:generatesources   java RecyclerView显示为空   当服务器不返回任何输入时,java InputStream read()会阻塞