Django 使用pytest参数化和DRF测试
现在我有这样的代码:Django 使用pytest参数化和DRF测试,django,django-rest-framework,pytest,django-testing,pytest-django,Django,Django Rest Framework,Pytest,Django Testing,Pytest Django,现在我有这样的代码: 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_orde
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'
如何使用DRF tests类中的@pytest.mark.parametize
装饰器和APITestCase
中的测试?也许有其他方法可以参数化测试(但不是循环)
ApiTestCase
是unittest.TestCase
的一个子类,它不支持如下所述的参数化:
以下pytest功能适用于unittest.TestCase子类:
- 标记:skip、skipif、xfail李>
- 汽车夹具李>
- 固定装置(自动使用固定装置除外,见下文)李>
- 参数化李>
- 定制挂钩李>
但是,如果希望从使用<代码> PyTest获得真正的好处,请考虑从<代码> UNITTest< /C> >样式类测试转移到测试函数。使用
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
编辑
您还可以查看这个库,它为测试类方法提供了类似于
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
我在这里更新了问题(最后一行)。没关系,我不能用。但是我能用什么来参数化呢?我现在用的是
子测试
,但我不喜欢它看起来的样子。我的所有测试类都是从我自己特定的BaseTestClass(ApiTestCase)
继承的。(我的意思是,我不能为单独的测试函数重写它)根据我的经验,驻留在基本测试类中的任何功能都可以被重构为一个fixture,最终导致更少的样板代码。但是当然,如果您已经有数百个unittest
样式的测试,那么重构所有这些测试是一项需要立即完成的艰巨任务。您还可以看看参数化的库,它为测试类方法提供了类似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