gpt4 book ai didi

python - Django 测试 VS pytest

转载 作者:太空狗 更新时间:2023-10-29 18:12:41 30 4
gpt4 key购买 nike


我是 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 将向您显示断言输出。 Django 单元测试没有。我必须自己设置断点调查错误。
  3. Pytest 允许您使用带有简单装饰器的真实数据库。 Django 测试没有。您必须创建自己的自定义命令你的工作
  4. Pytest 是通用的。作为一个通用的,它意味着你觉得舒服使用 Django 之外的项目。例如,当你必须构建微服务,例如 Flask + 第三方,例如 APScheduler,PyRad,...等。我提到这个是因为我的后端生活使用 Django 50%其余的是 Python 和 infra
  5. Pytest 没有使用多重继承来创建我的装置
  6. 当与 Docker 一起作为运行器使用时,Unittest 在 gitlab-ci 上的优势优于 Pytest,无需任何额外配置即可顺利执行。 problem

最佳答案

我一生都在使用 Django 测试,现在我正在使用 Py.test。我同意 pytest 比 django 本身干净得多。

The benefit from pytest is fixture in another file. It makes my test case compact by let them be my input parameters.

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

在其他文件中使用 fixture

Pytest will show you the assertion output if the error occur. Django unittest does not. I have to put the breakpoint on my own and investigate the error.

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

一些提示:

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

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

    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
    }]
    }

关于python - Django 测试 VS pytest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44558018/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com