标签: django-testing

如何使用Django的assertJSONEqual来验证返回JsonResponse的视图的响应

我正在使用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()

python django django-testing python-3.x jsonresponse

20
推荐指数
2
解决办法
1万
查看次数

Django manage.py:是否可以传递命令行参数(用于单元测试)

是否可以将命令行参数传递给Django的manage.py脚本,特别是单元测试?即如果我做了类似的事情

manage.py test myapp -a do_this
Run Code Online (Sandbox Code Playgroud)

我可以接收值do_thissetUp单元测试的功能?

PS @Martin询问在测试中使用命令行参数的理由:

  • 一些广泛的测试需要花费大量时间,并且不需要在每次提交之前运行.我想让它们成为可选的.

  • 我的测试用例打印的偶尔调试消息应该是可选的

  • 有时我只是希望测试变得疯狂并尝试更多的数据排列.

使用命令行选项,以上所有内容都非常方便.偶尔测试可能会更广泛或更冗长,否则它会很快.

django django-testing django-manage.py

20
推荐指数
4
解决办法
6390
查看次数

选择测试数据库?

我想跑

./manage.py test
Run Code Online (Sandbox Code Playgroud)

但它告诉我

创建测试数据库时出错:拒绝创建数据库的权限

显然它没有创建数据库的权限,但我在共享服务器上,所以我无能为力.我可以通过控制面板创建一个新的数据库,但我认为没有办法让Django自动完成.

那么,我不能手动创建测试数据库,而是告诉Django每次都刷新它,而不是重新创建整个东西?

django postgresql webfaction django-testing

19
推荐指数
2
解决办法
1万
查看次数

如何为django app设置单元测试用户?单元测试无法登录

我为我的django应用启用了登录验证.视图的单元测试无效,因为它们卡在登录页面上.在返回视图的响应并使用后立即设置断点

print response.content

输出包含"请登录"的短语

如何设置用户以便测试用例可以登录?我尝试使用我的用户名和密码,但它在单元测试环境中不起作用.

django unit-testing django-authentication django-testing

19
推荐指数
1
解决办法
7286
查看次数

django.test.TestCase与unittest vs django.utils.unittest.TestCase之间的区别

我仍在使用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)

django django-testing

18
推荐指数
1
解决办法
5028
查看次数

Django测试:测试表单字段的初始值

我有一个视图应该是基于GET值为表单字段设置初始值.我想测试一下.我目前正在使用Django的测试客户端,但我愿意看其他工具.

编辑

对不起,我没有提到我很清楚assertContains方法,但我希望除了在HTML中搜索input标签和value属性之外还有更好的方法.

python django django-testing

17
推荐指数
2
解决办法
5625
查看次数

Django测试技巧

根据这个问题的精神,我想知道是否有任何关于为Django webapp创建一个有用的"完整"测试套件(测试套件能否"完整"?)的技巧.

我的情况:我已经淘汰了一个原型,现在我正在努力增加一些回归测试.我个人使用django-webtest进行大多数测试,并使用Django测试客户端进行一些URL测试.

我对我的测试套件感到不舒服.我远非测试专家,所以试图改善这一目标.任何提示 - 无论是否适用于我的情况 - 都将不胜感激.

python testing django unit-testing django-testing

17
推荐指数
1
解决办法
2546
查看次数

Django测试使用现有数据库

我很难定制测试数据库设置行为.我想实现以下目标:

  • 测试套件需要使用现有数据库
  • 测试套件不应擦除或重新创建数据库,而是从mysql转储加载数据
  • 由于db是从转储填充的,因此不应加载任何fixture
  • 完成测试后,不应销毁数据库

我很难让testsuiterunner绕过创作.

django django-testing

17
推荐指数
1
解决办法
6259
查看次数

Selenium:元素无法点击...其他元素将接收点击

在我的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)

python django selenium django-testing selenium-webdriver

17
推荐指数
2
解决办法
2万
查看次数

如何使用Factory_boy中的Faker

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.pyfactory.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)

python factory django-testing faker factory-boy

17
推荐指数
3
解决办法
5567
查看次数