Использование параметризации pytest с тестом DRF - PullRequest
0 голосов
/ 14 сентября 2018

Теперь у меня есть такой код:

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

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Может быть, есть какой-то другой способ параметризации тестов (но не циклов)?

Начиная с 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
0 голосов
/ 14 сентября 2018

ApiTestCase - это подкласс unittest.TestCase, который не поддерживает параметризацию, как указано в документах Pytest :

Следующие функции Pytest работают в подклассах unittest.TestCase:

  • Метки: пропустить, пропустить, xfail;
  • Автоматическое использование светильников;

следующий пирест функции не работают, и, вероятно, никогда не будет из-за другого дизайна философий:

  • Светильники (кроме автоприборов, см. Ниже);
  • параметризация; * * тысяча двадцать одна
  • Крючки на заказ;

Сторонние плагины могут или не могут работать хорошо, в зависимости от на плагин и набор тестов.

...