我正在使用Python 3.4和Django 1.7.我有一个观点回归JsonResponse.
def add_item_to_collection(request):
#(...)
return JsonResponse({'status':'success'})
Run Code Online (Sandbox Code Playgroud)
我想验证该视图是否使用单元测试返回正确的响应:
class AddItemToCollectionTest(TestCase):
def test_success_when_not_added_before(self):
response = self.client.post('/add-item-to-collection')
self.assertEqual(response.status_code, 200)
self.assertJSONEqual(response.content, {'status': 'success'})
Run Code Online (Sandbox Code Playgroud)
但该assertJSONEqual()行提出了一个例外:
Error
Traceback (most recent call last):
File "E:\Projects\collecthub\app\collecthub\collecting\tests.py", line 148, in test_success_when_added_before
self.assertJSONEqual(response.content, {'status': 'OK'})
File "E:\Projects\collecthub\venv\lib\site-packages\django\test\testcases.py", line 675, in assertJSONEqual
data = json.loads(raw)
File "C:\Python34\Lib\json\__init__.py", line 312, in loads
s.__class__.__name__))
TypeError: the JSON object must be str, not 'bytes'
Run Code Online (Sandbox Code Playgroud)
当响应包含JSON时,检查响应内容的正确方法是什么?当我尝试比较原始值时,为什么我会出现类型错误assertJSONEqual()?
是否可以将命令行参数传递给Django的manage.py脚本,特别是单元测试?即如果我做了类似的事情
manage.py test myapp -a do_this
Run Code Online (Sandbox Code Playgroud)
我可以接收值do_this的setUp单元测试的功能?
PS @Martin询问在测试中使用命令行参数的理由:
一些广泛的测试需要花费大量时间,并且不需要在每次提交之前运行.我想让它们成为可选的.
我的测试用例打印的偶尔调试消息应该是可选的
有时我只是希望测试变得疯狂并尝试更多的数据排列.
使用命令行选项,以上所有内容都非常方便.偶尔测试可能会更广泛或更冗长,否则它会很快.
我想跑
./manage.py test
Run Code Online (Sandbox Code Playgroud)
但它告诉我
创建测试数据库时出错:拒绝创建数据库的权限
显然它没有创建数据库的权限,但我在共享服务器上,所以我无能为力.我可以通过控制面板创建一个新的数据库,但我认为没有办法让Django自动完成.
那么,我不能手动创建测试数据库,而是告诉Django每次都刷新它,而不是重新创建整个东西?
我为我的django应用启用了登录验证.视图的单元测试无效,因为它们卡在登录页面上.在返回视图的响应并使用后立即设置断点
print response.content
输出包含"请登录"的短语
如何设置用户以便测试用例可以登录?我尝试使用我的用户名和密码,但它在单元测试环境中不起作用.
我仍在使用Django 1.2.1,我认为对于较新的Django,我们不import unittest会这样做unittest.TestCase.
插图
import unittest
class TestThis(unittest.TestCase):
from django.utils.unittest import TestCase
class TestThis(TestCase):
from django.test import TestCase
class TestThis(TestCase):
Run Code Online (Sandbox Code Playgroud)
据PyCon2011谈话,第二个是稍微更高效.
这是显示关系的图表:

所以django.utils.unittest,django.test继承unittest或者unittest2.
我不确定以下是否正确.请帮忙编辑.
________________________________________________________________
| Name | Django Version | Python Version |
-----------------------------------------------------------------
| unittest | >= 1.0 | >= 2.6 |
-----------------------------------------------------------------
| django.utils.unittest | >= 1.3 | ?? |
-----------------------------------------------------------------
| django.test | >= 1.0 | >= 2.6 …Run Code Online (Sandbox Code Playgroud) 我有一个视图应该是基于GET值为表单字段设置初始值.我想测试一下.我目前正在使用Django的测试客户端,但我愿意看其他工具.
对不起,我没有提到我很清楚assertContains方法,但我希望除了在HTML中搜索input标签和value属性之外还有更好的方法.
根据这个问题的精神,我想知道是否有任何关于为Django webapp创建一个有用的"完整"测试套件(测试套件能否"完整"?)的技巧.
我的情况:我已经淘汰了一个原型,现在我正在努力增加一些回归测试.我个人使用django-webtest进行大多数测试,并使用Django测试客户端进行一些URL测试.
我对我的测试套件感到不舒服.我远非测试专家,所以试图改善这一目标.任何提示 - 无论是否适用于我的情况 - 都将不胜感激.
我很难定制测试数据库设置行为.我想实现以下目标:
我很难让testsuiterunner绕过创作.
在我的Django项目上运行Selenium测试时,我开始收到错误:
selenium.common.exceptions.WebDriverException: Message: Element is not clickable at point (61, 24.300003051757812). Other element would receive the click: <a class="navbar-brand" href="#"></a>
Run Code Online (Sandbox Code Playgroud)
奇怪的是有两个原因:第一,先前通过的测试,我没有编辑代码库的那部分.其次,当弹出Selenium驱动的Firefox窗口并且我最大化页面时,测试通过.但是当我让Selenium测试在Firefox浏览器没有最大化的情况下运行时,它们会失败.
我没有使用任何花哨的javascript(只是基本的Bootstrap 3模板),只是普通的旧HTML和CSS.我在Python 3.4上使用Django 1.9.我已经运行了pip来检查Selenium的升级,而且我是最新的.
这是我的视图和模板输出的html的pastebin链接.
其中一项失败的测试是:
def test_create_task_and_check_that_it_shows_up_in_the_task_manager_index_and_filter(self):
# Create user
self.user = User.objects.get(username=test_superuser_username)
# Log the user in
self.log_user_in(user_object=self.user, password=test_superuser_password)
self.browser.implicitly_wait(10)
# Pull up the main task manager page
self.browser.get(str(self.live_server_url) + reverse('task_manager:index'))
# Make sure we go to the task manager index
task_index_url = str(self.live_server_url) + reverse('task_manager:index')
self.browser.get(task_index_url)
self.browser.implicitly_wait(4)
self.assertTrue(str(task_index_url) == self.browser.current_url,
msg=('Assertion that current_url …Run Code Online (Sandbox Code Playgroud) Factory_boy用于fake-factory (Faker)生成随机值,我想直接使用Faker在我的Django测试中生成一些随机值.
Factory_boy文档建议使用factory.Faker及其提供者:
class RandomUserFactory(factory.Factory):
class Meta:
model = models.User
first_name = factory.Faker('first_name')
Run Code Online (Sandbox Code Playgroud)
但这不会产生任何名称:
>>> import factory
>>> factory.Faker('name')
<factory.faker.Faker object at 0x7f1807bf5278>
>>> type(factory.Faker('name'))
<class 'factory.faker.Faker'>
Run Code Online (Sandbox Code Playgroud)
从factory_boy faker.py类factory.Faker('ean', length=10)调用,faker.Faker.ean(length=10)但Faker文档说它应该显示一个名称:
from faker import Faker
fake = Faker()
fake.name()
# 'Lucy Cechtelar'
Run Code Online (Sandbox Code Playgroud)
有没有其他方法可以使用Faker而不是直接设置实例Faker?
from faker import Factory
fake = Factory.create()
fake.name()
Run Code Online (Sandbox Code Playgroud) django-testing ×10
django ×9
python ×5
unit-testing ×2
factory ×1
factory-boy ×1
faker ×1
jsonresponse ×1
postgresql ×1
python-3.x ×1
selenium ×1
testing ×1
webfaction ×1