Pytest, как сделать тест против значения прибора или None? - PullRequest
2 голосов
/ 16 октября 2019

У меня есть один тест-кейс с одним прибором :

@pytest.fixture
def user(test_client):
    return User.objects.first()


@pytest.mark.parametrize('content', ['nice post',])
def test_post(test_client, user, content):
    reponse = test_client.post(
        '/api/v1.0/posts', 
        json={
            'content': content,
            'author': user,
        },
        follow_redirects=True
    )

    assert reponse.status_code == 200

Но я хочу в дополнение к тестированию с некоторым объектом User проверитьпротив None (я ожидаю, что тест не пройден для None). Я думал, что смогу сделать что-то вроде:

@pytest.fixture(params=[True, False])
def User_or_null(test_client, request):
    if request.param:
        return User.objects.first()
    else:
        return None

Но я не думаю, что это позволит мне пометить контрольный пример pytest.mark.xfail для значения None? Есть идеи?

1 Ответ

2 голосов
/ 17 октября 2019

Я не вижу проблем с параметризацией прибора user. Вы можете пометить отдельные параметры с помощью pytest.param, например:

@pytest.fixture(params=[
    'testuser',
    # wrap None into pytest.param to treat it specially
    pytest.param(None, marks=pytest.mark.xfail)
])
def user(request):
    if request.param is None:
        return None
    return User.objects.filter(name=request.param).first()  # or whatever

Однако это будет означать, что все тесты, использующие прибор user, будут xfail / xpass на None- это может быть не то, что вы хотите для всех тестов. Используйте косвенную параметризацию, если вы хотите отключить только выбранный тест:

# user fixture is not parametrized now

@pytest.fixture
def user(request):
    if request.param is None:
        return None
    return User.objects.filter(name=request.param).first()

# instead, parametrizing is done from the test:

@pytest.mark.parametrize('content', ['nice post',])
@pytest.mark.parametrize('user', [
    'testuser',
    pytest.param(None, marks=pytest.mark.xfail
)], indirect=True)
def test_post(test_client, user, content):
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...