TypeError: TestViews.test_fails() отсутствует 1 обязательный позиционный аргумент: 'param'

Я пытаюсь запустить тесты на приложении Django с помощью selenium + pytest, которые, согласно docs, должны работать.

import pytest
from django.contrib.staticfiles.testing import StaticLiveServerTestCase
from selenium.webdriver import Chrome


class TestViews(StaticLiveServerTestCase):
    @classmethod
    def setUpClass(cls):
        super().setUpClass()
        cls.driver = Chrome()

    @classmethod
    def tearDownClass(cls):
        if hasattr(cls, 'driver'):
            cls.driver.quit()
            super().tearDownClass()

    @pytest.mark.parametrize('param', ['param1', 'param2'])
    def test_fails(self, param):
        pass

Однако, я получаю:

Creating test database for alias 'default'...
Found 1 test(s).
System check identified no issues (0 silenced).

Error
TypeError: TestViews.test_fails() missing 1 required positional argument: 'param'
  
Destroying test database for alias 'default'...

StaticLiveServerTestCase наследует unittest.TestCase, что означает, что вы не можете использовать @pytest.mark.parametrize для расширения вашего теста. К счастью, вы можете использовать parameterized вместо этого.

См. Работает ли параметризованный тест pytest с тестами unittest на основе классов? для связанного вопроса.

И смотрите https://stackoverflow.com/a/52062473/7058266 для обходного пути.

Вот как будет выглядеть ваш код после замены @pytest.mark.parametrize на parameterized:

from parameterized import parameterized
from django.contrib.staticfiles.testing import StaticLiveServerTestCase
from selenium.webdriver import Chrome

class TestViews(StaticLiveServerTestCase):
    @classmethod
    def setUpClass(cls):
        super().setUpClass()
        cls.driver = Chrome()

    @classmethod
    def tearDownClass(cls):
        if hasattr(cls, 'driver'):
            cls.driver.quit()
            super().tearDownClass()

    @parameterized.expand([
        ['param1'],
        ['param2'],
    ])
    def test_fails(self, param):
        pass
Вернуться на верх