繁体   English   中英

Django测试VS pytest

[英]Django test VS pytest


我是 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有什么好处吗?

更新:2017 年 7 月 1 日
更新:2017 年 7 月 5 日
更新:2017 年 9 月 1 日
更新:2017 年 9 月 29 日
更新:2017 年 12 月 26 日

  1. Pytest 减少了灯具在测试中发生变异时的问题。 我得到了单独运行的testcases ,但在彻底运行时失败了。
  2. 如果发生错误,Pytest 将向您显示断言 output。 Django unittest 没有。 我必须自己设置断点并调查错误。
  3. Pytest 允许您使用带有简单装饰器的真实数据库。 Django 测试没有。 您必须为您的工作创建自己的自定义命令
  4. Pytest 是通用的。 作为一个通用的,它意味着你可以轻松地使用 Django 之外的项目。例如,当你必须构建诸如 Flask 之类的微服务时 + APScheduler、PyRad 等第 3 方等。我提到这一点是因为我的后端生活使用Django 50% 的 rest 为Python及以下
  5. Pytest 没有使用多个 inheritance 来创建我的灯具
  6. 当 Docker 与Docker作为跑步者使用时,Unittest 在gitlab-ci上的优势超过 Pytest,无需任何额外配置即可顺利执行。 问题

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

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

在Django unittest中你仍然可以使用属性fixtures = ['appname/fixtures/my_fixture.json']在其他文件中使用fixtures = ['appname/fixtures/my_fixture.json']

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

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

一些提示:

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

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

     import pytest from model_mommy import mommy @pytest.fixture() def user(db): return mommy.make(User) class SiteAPIViewTestSuite: def test_create_view(self, client, user): assert Site.objects.count() == 0 post_data = { 'name': 'Stackoverflow' 'url': 'http://stackoverflow.com', 'user_id': user.id, } response = client.post( reverse('sites:create'), json.dumps(post_data), content_type='application/json', ) data = response.json() assert response.status_code == 201 assert Site.objects.count() == 1 assert data == { 'count': 1, 'next': None, 'previous': None 'results': [{ 'pk': 1, 'name': 'Stackoverflow', 'url': 'http://stackoverflow.com', 'user_id': user.id }] } 

我的经历与你在互联网上看到的相矛盾。

我在 Pytest 和 Unittest 方面都有很多经验,我已经在文章中阐述了我对这个问题的看法。

我希望这对某人有所帮助,并希望得到任何反馈!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM