使用pytest参数化和DRF测试

问题描述 投票:2回答:2

现在我有这样的代码:

from rest_framework.test import APITestCase

class MyTestClass(ApiTestCase):
    fixtures = ['some_fixtures.json', ]

    @pytest.mark.parametrize('field, reverse_ordering', [
        ('id', False),
        ('id', True)])
    def test_ordering(self, field, reverse_ordering):
        # some test function

每次失败时都会出现错误:

======================================================================
ERROR: test_ordering (my_module.tests.MyTestClass)
----------------------------------------------------------------------
TypeError: test_ordering() missing 2 required positional arguments: 'field' and 'reverse_ordering'

如何使用@pytest.mark.parametrize装饰器和DRF测试类的APITestCase内的测试? 也许有另一种方法来参数化测试(但不是循环)?

django django-rest-framework pytest django-testing pytest-django
2个回答
3
投票

也许有另一种方法来参数化测试(但不是循环)?

从Python 3.4开始,使用subTest在标准库中提供参数化:

class MyTest(APITestCase):

    test_ordering_params = [('id', False), ('id', True)]

    def test_ordering(self):
        for field, reverse_ordering in self.test_ordering_params:
            with self.subTest(field=field, reverse=reverse_ordering):
                query = ('-' if reverse_ordering else '') + field
                resp = self.client.get(reverse('url-name'), {'ordering': query}, format='json')
                assert resp.data

但是,如果您想通过使用pytest获得真正的好处,请考虑从unittest样式的类测试转向测试函数。使用pytest结合pytest-django插件的相同测试:

import pytest
from rest_framework.test import APIClient

@pytest.fixture
def apiclient():
    return APIClient()

@pytest.mark.parametrize('field, reverse_ordering', [('id', False), ('id', True)])
def test_ordering(apiclient, db, field, reverse_ordering):
    query = ('-' if reverse_ordering else '') + field
    resp = apiclient.get(reverse('url-name'), {'ordering': query}, format='json')
    assert resp.data

Edit

您还可以查看parameterized库,它为测试类方法提供类似pytest的参数化。例:

from parameterized import parameterized


class MyTest(APITestCase):

    @parameterized.expand([('id', False), ('id', True)])
    def test_ordering(self, field, reverse_ordering):
        query = ('-' if reverse_ordering else '') + field
        resp = self.client.get(reverse('url-name'), {'ordering': query}, format='json')
        assert resp.data

3
投票

ApiTestCaseunittest.TestCase的子类,它不支持pytest docs中提到的参数化:

以下pytest功能在unittest.TestCase子类中有效:

  • 标记:skip,skipif,xfail;
  • 自动使用夹具;

以下pytest功能不起作用,可能永远不会由于不同的设计理念:

  • 固定装置(autouse固定装置除外,见下文);
  • 参数化;
  • 定制挂钩;

第三方插件可能运行也可能不运行,具体取决于插件和测试套件。

© www.soinside.com 2019 - 2024. All rights reserved.