将Ian Bicking的WebTest(http://docs.pylonsproject.org/projects/webtest/)与Django测试框架即时集成。
项目描述
django-webtest是一个用于将Ian Bicking的WebTest(http://docs.pylonsproject.org/projects/webtest/)与Django测试框架即时集成的应用程序。
安装
$ pip install django-webtest
用法
from django_webtest import WebTest
class MyTestCase(WebTest):
# optional: we want some initial data to be able to login
fixtures = ['users', 'blog_posts']
# optional: default extra_environ for this TestCase
extra_environ = {'HTTP_ACCEPT_LANGUAGE': 'ru'}
def testBlog(self):
# pretend to be logged in as user `kmike` and go to the index page
index = self.app.get('/', user='kmike')
# All the webtest API is available. For example, we click
# on a <a href='/tech-blog/'>Blog</a> link, check that it
# works (result page doesn't raise exceptions and returns 200 http
# code) and test if result page have 'My Article' text in
# its body.
assert 'My Article' in index.click('Blog')
django-webtest提供了一个django.test.TestCase子类(django_webtest.WebTest),它创建了一个围绕django wsgi接口的webtest.TestApp,并在测试中以self.app的形式提供。
它还提供了一个可选的user参数,用于self.app.get、self.app.post等,以帮助进行授权请求。此参数应为一个django.contrib.auth.models.User实例或一个包含用户username的字符串,用于应该登录的用户。要再次登出,请调用self.app.reset,清除所有cookie。要使用相同用户进行一系列调用,请在请求之前调用app.set_user(user);如果想要禁用该用户,请对单个请求调用app.get(..., user=None)或对后续所有调用调用app.set_user(None)。
对于500错误,将显示原始跟踪信息,而不是handler500的常规html结果。
您还可以获得通常仅在您使用Django的本地测试客户端时才可用的response.templates和response.context功能。这些属性包含用于渲染响应的模板列表以及用于渲染这些模板的上下文。Django的所有本地断言(assertFormError、assertTemplateUsed、assertTemplateNotUsed、assertContains、assertNotContains、assertRedirects)也支持WebTest响应。
会话字典可通过self.app.session访问,其内容与Django的本地测试客户端相同。
与Django的本地测试客户端不同,默认情况下不抑制CSRF检查,因此缺少CSRF令牌将导致测试失败(这是好事)。
如果通过WebTest表单API提交表单,则所有表单字段(包括CSRF令牌)将自动提交。
class AuthTest(WebTest):
fixtures = ['users.json']
def test_login(self):
form = self.app.get(reverse('auth_login')).form
form['username'] = 'foo'
form['password'] = 'bar'
response = form.submit().follow()
self.assertEqual(response.context['user'].username, 'foo')
然而,如果通过使用app.post的原始POST请求提交表单,则CSRF令牌很难构造。在这种情况下,可以通过将csrf_checks属性设置为False来禁用CSRF检查。
class MyTestCase(WebTest):
csrf_checks = False
def test_post(self):
self.app.post('/')
当需要Django的TransactionTestCase子类时,请使用django_webtest.TransactionWebTest。
有关在pytest-django固定装置中禁用CSRF检查的信息,请参阅使用PyTest。
所有这些功能都可以轻松手动设置(多亏了WebTest架构),即使不需要使用WebTest与Django集成,也很有用。
有关API帮助,请参阅http://docs.pylonsproject.org/projects/webtest/。Webtest可以跟随链接,提交表单,使用不同的解析库解析html、xml和json响应,上传文件等等。
与django-rest-framework集成
如果您的项目使用django-rest-framework,则设置REST_FRAMEWORK['AUTHENTICATION_CLASSES']将自动修补以包含一个将rest框架认证系统与app.get(user=user)链接的类。
使用PyTest
您需要安装pytest-django
$ pip install pytest-django
然后您可以使用django-webtest的固定装置
def test_1(django_app):
resp = django_app.get('/')
assert resp.status_code == 200, 'Should return a 200 status code'
我们有一个可以用来创建自定义固定装置的django_app_factory固定装置。例如,一个不执行CSRF检查的固定装置。
# conftest.py
@pytest.fixture
def csrf_exempt_django_app(django_app_factory):
return django_app_factory(csrf_checks=False)
csrf_checks 和 extra_environ 是 django_app_factory 的唯一参数。
为什么?
虽然 django.test.client.Client 对于其用途来说很好,但它并不适合功能测试或集成测试。根据 Django 测试客户端的文档字符串
这并不是作为 Twill/Selenium 等工具的替代品——它在这里是为了允许测试视图产生的上下文和模板,而不是最终用户看到的渲染的 HTML。
WebTest 与 twill 处于同一领域。WebTest 拥有一个良好的 API,运行速度快,体积小,通过 WSGI 而不是 HTTP 与 django 应用程序通信,是编写功能/集成/验收测试的简单方法。django-webtest 能够提供与原生 Django TestClient 相同的渲染模板和模板上下文名称访问。
贡献
开发发生在 github:https://github.com/django-webtest/django-webtest 问题跟踪器:https://github.com/django-webtest/django-webtest/issues
请随时提交想法、错误或拉取请求。
运行测试
确保已安装 tox 并运行
$ tox
从源代码签出。
变更记录
1.9.12 (2024-08-30)
添加对 Django 5 的支持
不再与 assertFormError 兼容
pytest 固定程序现在在固定程序运行后取消修补 Django 设置
1.9.11 (2023-09-18)
添加对官方 Python & Django 版本的支持
不要将 WebtestAuthentication 插入 DEFAULT_AUTHENTICATION_CLASSES 的头部。
1.9.10 (2022-03-02)
添加一个可选的 WebTest 后端,它不会干扰自定义后端处理权限。通过 WEBTEST_AUTHENTICATION_BACKEND 设置访问。修复 #123
1.9.9 (2021-12-27)
添加 Django 4 支持
移除 Django 2 支持
1.9.8 (2021-10-06)
- 根据 Django 文档更新 Django 和 Python 的测试配置
为项目的 PyPI 列表添加一些有用的元数据
对文档进行了一些小的修改
更新 DjangoTestApp 中的会话获取。修复 #113
移除 py27/py35 支持
1.9.7 (2019-07-05)
允许使用 DjangoTestApp.__init__ 覆盖 HTTP_HOST。修复 #102
1.9.6 (2019-06-07)
rest_framework 身份验证类。修复 #98 #100
1.9.5 (2019-05-31)
修复与 django 3 的兼容性。见 #96
添加与 django-rest-framework 身份验证的集成
添加 DjangoTestApp 中缺少的参数。修复 #86
1.9.4 (2018-10-27)
py34 和 Django 1.8 不再进行测试(但可能仍然可以工作)
允许使用位置参数;修复 #89
移除已弃用的 pytest.yield_fixture 函数。使用 pytest.fixture;修复 #88
不要在 WebTestMixin 中将重复的 WebtestUserMiddleware 添加到中间件列表中。修复 #87
恢复 MIDDLEWARE_CLASSES 支持;修复 #84
1.9.3 (2018-05-03)
将 user=None 传递给 get/post/等方法将清除使用 set_user 设置的先前用户,而不是什么都不做。
在 pytest 插件中避免在测试之间共享设置
修复中间件设置名称
1.9.2 (2017-05-17)
在 1.11 上静默有关 is_authenticated 的警告
使用 set_cookie 时包括正确的主机名(testserver)
1.9.1 (2017-03-09)
修复包描述(不再允许 pypi 使用多行)
1.9.0 (2017-03-09)
向后不兼容:不再支持位置参数。您需要用关键字参数替换它们。
添加对 Django 1.11 的支持
放弃对 Django <= 1.7 的支持
放弃对 Python 2.6 的支持
将 HTTP_HOST 标头的值从 localhost 更改为 testserver,以匹配 Django 测试客户端的行为。
修复 DjangoTestApp.options
添加 DjangoTestApp.head
添加 pytest 固定程序
1.8.0 (2016-09-14)
修复问题 #40 - 将 app.get auto_follow=True 与其他关键字参数结合使用。
添加对 django 1.10 中引入的 MIDDLEWARE 设置的兼容性
停止支持 django 1.2
1.7.9 (2016-04-19)
添加 set_user() 方法,允许全局设置应用的用户
允许 'click' 接收用户参数
在README中提及 testapp.reset()
允许使用 json_ 方法
1.7.8 (2015-04-21)
将 setup.py 切换为 setuptools;WebTest 现在会自动安装(感谢 Eric Araujo);
当可用时,使用 stdlib 中的 importlib,以实现与 django 1.9 的兼容性(感谢 Helen Sherwood-Taylor);
django-webtest 的自测已修复,以便在 django 1.6+ 中运行;
1.7.7 (2014-03-25)
修复了在具有 C locales 的系统上对 Python 3.x 的安装。
1.7.6 (2014-01-20)
DjangoTestApp 方法将所有自定义关键字参数传递给 webtest.TestApp;这允许使用 xhr=True 功能(感谢 Max Kharandziuk)。
修复了 Travis CI 测试(感谢 Darian Moody)。
1.7.5 (2013-07-17)
修复了 OPTIONS 方法;
添加了 DELETE 方法警告的解决方案(见 https://github.com/Pylons/webtest/issues/50)。
1.7.4 (2013-07-14)
确实添加了 TransactionWebTest 基类(感谢 Julien Aubert)。
1.7.3 (2013-07-07)
添加了对 PATCH 和 OPTIONS HTTP 方法的支持(感谢 Will Bradley)。
1.7.2 (2013-06-27)
添加了 TransactionWebTest 基类(感谢 Iurii Kriachko)。
1.7.1 (2013-06-11)
添加了对非 ASCII 用户名的支持。
1.7 (2013-05-23)
添加了对 django 1.6 的支持(感谢 Carl Meyer)。
1.6.1 (2013-03-31)
添加了对 django 1.5+ 自定义用户模型的 support(感谢 Gautier Hayoun)。
1.6 (2013-03-07)
添加了将自定义 response_class 和 app_class 传递给 WebTest 的功能(感谢 Bruno Renié)。
在 DjangoWebtestResponse 中添加了不区分大小写的头访问(感谢 Bruno Renié)。
1.5.7 (2013-02-27)
支持 WebTest 2.0。
1.5.6 (2013-01-21)
支持 django 1.5:已修复事务处理(感谢 Marco Braak)。
1.5.5 (2013-01-14)
修复了 django 1.5 支持:DjangoWebtestResponse 中添加了 streaming 属性(感谢 David Winterbottom)。
1.5.4 (2012-09-13)
修复了与 AdminMediaHandler 相关的 django 1.5 问题(感谢 Tai Lee)。
更新了 tox.ini,以使用最新的 django 版本和带 python3 支持的官方 trunk;
修复了 django 1.5 中 SimpleCookie 的问题。
1.5.3 (2012-04-25)
修复了对于认证请求的 self.assertRedirects。
1.5.2 (2012-04-01)
如果 AuthenticationMiddleware 不在中间件列表中,WebtestUserMiddleware 将被放置在中间件列表的末尾,以提供更好的向后兼容性(对于自定义认证中间件)。
1.5.1 (2012-03-22)
修复了 method="get" 的表单处理。感谢 Jeroen Vloothuis。
1.5 (2012-02-24)
WebtestUserMiddleware 被插入在 AuthenticationMiddleware 之后,而不是中间件列表的末尾(感谢 bigkevmcd)。
不要列出 python 2.5 作为受支持的版本,因为 WebOb 已停止支持 2.5。
支持 python 3。
使用 tox 运行测试。
1.4.4 (2012-02-08)
self.app.put 和 self.app.delete 方法的 'user' 参数(感谢 Ruslan Popov)。
1.4.3 (2011-09-27)
通过 self.app.session 可以访问 django 会话字典。
1.4.2 (2011-08-26)
默认情况下,REMOTE_ADDR 为 '127.0.0.1'。这是标准 django 测试客户端的行为。
请注意,如果安装并配置了 django-debug-toolbar 0.9.x 且 INTERNAL_IPS 包含 '127.0.0.1',则这可能会减慢测试速度并引起其他副作用,因为调试工具栏将在测试期间开启。解决方案是在测试设置中移除 django-debug-toolbar 中间件。
DEBUG_MIDDLEWARE = 'debug_toolbar.middleware.DebugToolbarMiddleware' if DEBUG_MIDDLEWARE in MIDDLEWARE_CLASSES: MIDDLEWARE_CLASSES.remove(DEBUG_MIDDLEWARE)
1.4.1 (2011-06-29)
添加了 self.renew_app() 方法以重置测试中的 'browser'。
1.4 (2011-06-23)
更好的认证实现;
支持 assertRedirects、assertContains 和 assertNotContains。
1.3 (2010-12-31)
Django 1.3 兼容性:测试响应现在具有 'templates' 属性;
Django 1.3 兼容性:异常处理方式已更改;
app.get 方法的 auto_follow 参数(如果 auto_follow=True,则自动跟随重定向链)。
1.2.1 (2010-08-24)
可以禁用 REMOTE_USER 认证。
1.2 (2010-08-21)
response.template 和 response.context 的良好性(感谢 Gregor Müllegger);
测试(感谢 Gregor Müllegger);
CSRF 检查现在是可选的(感谢 Gregor Müllegger)。
1.1.1 (2010-07-16)
用户实例可以传递给 get 和 post 方法,而不是用户的用户名。
1.1 (2010-06-15)
原始跟踪信息,而不是 HTML 500 错误页面;
针对每个测试用例的额外环境变量(感谢 Gael Pasgrimaud);
修复了 app.post 参数的 bug(感谢匿名者)。
1.0 (2010-04-20)
初始版本(感谢 Ian Bicking 的 WebTest)。
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。