Может быть, есть какой-то другой способ параметризации тестов (но не циклов)?
Начиная с 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