Django测试VS pytest

Sar*_*rit 12 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'))
Run Code Online (Sandbox Code Playgroud)

这是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'))
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Lua*_*eca 10

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

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

在 Django unittest 中,您仍然可以通过使用属性来使用其他文件中的装置fixtures = ['appname/fixtures/my_fixture.json']

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

您是否尝试更改--verboseparam python manage.py tests

一些提示:

  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
                }]
            }
    
    Run Code Online (Sandbox Code Playgroud)

  • +1 感谢您与我分享您的经验。我尝试过“fixture.json”。它不灵活。`model_mommy` 适合我的需要。对于“--verbose”来说,这是我的错。我不知道这件事。您给出的“客户端”示例很干净!让我尝试一下传入的项目。 (2认同)
  • 我还使用“model_mommy”,它很棒并且工作正常。 (2认同)
  • 与固定装置相比,我更喜欢带有 [factory_boy](https://factoryboy.readthedocs.io/en/latest/) 的工厂。我还在开发过程中使用它们生成一些测试数据(内置了 faker)。 (2认同)
  • 模型妈妈不再维护,被[模型面包店](https://pypi.org/project/model-bakery/)取代。 (2认同)