现在我有这样的代码:
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
内的测试?
也许有另一种方法来参数化测试(但不是循环)?
也许有另一种方法来参数化测试(但不是循环)?
从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
您还可以查看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
ApiTestCase
是unittest.TestCase
的子类,它不支持pytest docs中提到的参数化:
以下pytest功能在unittest.TestCase子类中有效:
- 标记:skip,skipif,xfail;
- 自动使用夹具;
以下pytest功能不起作用,可能永远不会由于不同的设计理念:
- 固定装置(autouse固定装置除外,见下文);
- 参数化;
- 定制挂钩;
第三方插件可能运行也可能不运行,具体取决于插件和测试套件。