25


我是 djangounittestpytest. 但是,我开始觉得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'))

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

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

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

  1. 当夹具在测试中发生突变时,Pytest 可以减少您的问题。我testcases单独通过了该运行,但是在彻底运行时失败了。
  2. 如果发生错误,Pytest 将向您显示断言输出。Django unittest 没有。我必须自己设置断点并调查错误。
  3. Pytest 允许您使用带有简单装饰器的真实数据库。Django 测试没有。您必须为您的工作创建自己的自定义命令
  4. Pytest 是通用的。作为一个通用的,这意味着你在 Django 之外的项目中工作感觉很舒服。例如,当您必须构建诸如 Flask 之类的微服务 + 诸如 APScheduler、PyRad 等 3rd 方时。我提到这一点是因为我的后端生活使用 Django 50% 其余的 isPython和 infra
  5. Pytest 没有使用多重继承来创建我的固定装置
  6. 当与运行程序一起使用时, Unittestgitlab-ci优于 Pytest,Docker无需任何额外配置即可顺利执行。问题
4

2 回答 2

4

我的经验与您在互联网上看到的相矛盾。

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

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

于 2021-11-09T20:25:35.363 回答
2

我一生都在使用 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是 pythonrequests模块的接口,用于访问您的视图。

    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
                }]
            }
    
于 2018-04-19T16:38:23.473 回答