Django测试VS pytest

时间:2017-06-15 03:27:29

标签: python django pytest django-unittest pytest-django


我是django unittestpytest的新手。但是,我开始觉得pytest测试用例更紧凑,更清晰。

以下是我的测试用例:

class OrderEndpointTest(TestCase):
    def setUp(self):
        user = User.objects.create_superuser(username='admin', password='password', email='pencil@gmail.com')
        mommy.make(CarData, _quantity=1)
        mommy.make(UserProfile, _quantity=1, user=user)

    def test_get_order(self):
        mommy.make(Shop, _quantity=1)
        mommy.make(Staff, _quantity=1, shop=Shop.objects.first())
        mommy.make(Order, _quantity=1, car_info={"color": "Black"}, customer={"name": "Lord Elcolie"},
                   staff=Staff.objects.first(), shop=Shop.objects.first())

        factory = APIRequestFactory()
        user = User.objects.get(username='admin')
        view = OrderViewSet.as_view({'get': 'list'})

        request = factory.get('/api/orders/')
        force_authenticate(request, user=user)
        response = view(request)
        assert 200 == response.status_code
        assert 1 == len(response.data.get('results'))

这是pytest版本

def test_get_order(car_data, admin_user, orders):
    factory = APIRequestFactory()
    user = User.objects.get(username='admin')
    view = OrderViewSet.as_view({'get': 'list'})

    request = factory.get('/api/orders/')
    force_authenticate(request, user=user)
    response = view(request)
    assert 200 == response.status_code
    assert 1 == len(response.data.get('results'))

pytest的好处是fixture在另一个文件中。它让我的测试用例变得紧凑,让它们成为我的输入参数。

使用Django unittest比使用pytest有什么好处吗?

更新:1July2017
更新:5July2017
更新:1Sep2017
更新:29Sep2017
更新:26Dec2017

  1. 当灯具在测试中发生变异时,Pytest会减少您的问题。 我得到testcases单独运行,但运行时失败 彻底。
  2. 如果发生错误,Pytest将显示断言输出。 Django的 unittest没有。我必须把断点放在我自己身上 调查错误。
  3. Pytest允许您使用简单装饰器的真实数据库。 Django的 测试没有。您必须为其创建自己的自定义命令 你的工作
  4. Pytest是通用的。作为一个通用它意味着你感到舒服 与Django之外的项目合作。例如,当你必须 建立微服务,如烧瓶+第三方,如APScheduler, PyRad,......等我提到这个因为我的后端生活使用Django 50% 其余部分是Python和infra
  5. Pytest没有使用多重继承来创建我的灯具
  6. 当使用gitlab-ci作为跑步者时,Unittest利用Docker优先于Pytest,无需任何额外配置即可顺利执行。 problem

1 个答案:

答案 0 :(得分:1)

我一生都在使用Django测试,现在我正在使用Py.test。我同意pytest比django本身更清洁。

  

pytest的好处是另一个文件夹具。它让我的测试用例变得紧凑,让它们成为我的输入参数。

在Django unittest中,您仍然可以使用属性fixtures = ['appname/fixtures/my_fixture.json']

在其他文件中使用灯具
  

如果发生错误,Pytest将显示断言输出。 Django unittest没有。我必须自己设置断点并调查错误。

您是否尝试更改--verbose上的python manage.py tests参数?

一些提示:

  1. 有一个名为pytest-django的软件包可以帮助您集成和使用django和pytest。

  2. 我认为如果使用类,则不需要使用factory = APIRequestFactory(),测试方法本身就有一个名为client的参数,它是python的接口{{1}模块来访问你的观点。

    requests