【问题标题】:Django test VS pytestDjango 测试 VS pytest
【发布时间】:2017-06-15 03:27:28
【问题描述】:


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

【问题讨论】:

  • Django 测试确实支持固定装置。只是说...
  • @spectras 你好。如果我的信息已过时,请更正。我真的很想知道并为正确的情况选择正确的工具。现在我都根据项目负责人来做这两个。如果我领导我使用pytest。其他人使用Django test 我确实遵循它。因此,我在这里开始问题并讨论。
  • 我在setUp() 方法中创建了fixture,并通过继承重用。你们说的是同一个灯具吗?
  • 不,我说的是Django fixtures
  • 感谢您的回复。我没有使用它,因为我无法与mommy一起使用它

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


【解决方案1】:

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

我在 Pytest 和 Unittest 方面拥有丰富的经验,我已在 article 中阐述了我对这个问题的看法。

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

    一些提示:

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

    【讨论】:

    • +1 感谢您与我分享您的经验。我试过fixture.json。它不灵活。 model_mommy 适合我的需要。对于--verbose,这是我的错。我不知道这件事。您在client 上给出的示例很干净!让我试试传入的项目。
    • 我也使用model_mommy,它很棒而且工作正常。
    • 我更喜欢带有factory_boy 的工厂,而不是固定装置。我还使用它们在开发过程中生成一些测试数据(内置伪造)。
    • Model Mommy 不再维护,取而代之的是Model Bakery
    猜你喜欢
    • 2019-06-20
    • 1970-01-01
    • 1970-01-01
    • 2020-12-16
    • 1970-01-01
    • 1970-01-01
    • 2017-12-23
    • 2020-03-12
    相关资源
    最近更新 更多