Как я могу l oop над данными @ pytest.mark.parametrize или распечатать их на тестах? - PullRequest
0 голосов
/ 21 февраля 2020

У меня есть эти данные, которые в основном являются параметрами, которые я хочу передать в функцию:

data2 = { "user": "bender", "resource": "machine/2", "action": "delete"}
data3 = { "user": "bender", "resource": "machine/2", "action": "delete"}
data4 = { "user": "bender", "resource": "machines/*", "action": "*"}
data5 = { "user": "leela", "resource": "machine/1", "action": "delete"}
data6 = { "user": "leela", "resource": "machine/*", "action": "*"}

У меня есть этот тест с использованием @pytest.mark.parametrize:

@pytest.mark.parametrize("test_input",  [
    data2,
    data3,
    data4,
    data5,
    data6,
])
@patch("dev_maintenance.roles.db")
def test_check_if_user_has_permissions(db,test_input):
    tmp = {}
    tmp["user"] = "bender"
    tmp["resource"] = "machine/1"
    tmp["action"] = "delete"

    db.session.query.return_value.filter_by.return_value.join.return_value.all.return_value = [(tmp["user"], tmp["resource"], tmp["action"])]

    assert check_if_user_has_permissions(user = "bender",resource= "machine/1", access_token= "delete") == True

Что я хочу чтобы достичь, передайте каждый набор данных на check_if_user_has_permissions(user, resource, action), чтобы я мог утверждать, что это значение, и если утверждение не удалось, потому что утверждение было True == False, я хочу, чтобы этот тестовый пример прошел, потому что в моем сценарии, если это происходит, это означает, что У пользователя нет прав доступа, и тест должен пройти.

Я пытался напечатать на тестах, таких как print(test_input), чтобы посмотреть, будут ли распечатаны все наборы данных, но только в одной.

Ответы [ 2 ]

2 голосов
/ 21 февраля 2020

Кажется, вы задаете два отдельных вопроса. Если вы хотите заявить об отрицании, просто используйте assert not. Если вы запустите pytest с флагом -v, он выведет все тесты, которые он выполняет, а для параметризованных тестов он также покажет каждое значение параметра, с которым он выполняет тест.

Вы можете написать свой тест вроде это:

$ cat test.py
import pytest

data = [
    { "user": "bender", "resource": "machine/2", "action": "delete"},
    { "user": "bender", "resource": "machine/2", "action": "delete"},
    { "user": "bender", "resource": "machines/*", "action": "*"},
    { "user": "leela", "resource": "machine/1", "action": "delete"},
    { "user": "leela", "resource": "machine/*", "action": "*"}
]


def check_if_user_has_permissions(*args, **kwargs):
    # Dummy implementation for demonstration
    import random
    print(kwargs)
    return random.choice([True, False])


@pytest.mark.parametrize('test_input', data)
def test_check_if_user_has_permissions(test_input):
    # ... additional test setup ...
    assert not check_if_user_has_permissions(**test_input)

Затем запустите:

$ pytest -v test.py
============================= test session starts ==============================
platform cygwin -- Python 3.6.8, pytest-5.3.1, py-1.8.0, pluggy-0.13.1 -- /usr/bin/python3
cachedir: .pytest_cache
rootdir: .
collected 5 items

test.py::test_check_if_user_has_permissions[test_input0] PASSED          [ 20%]
test.py::test_check_if_user_has_permissions[test_input1] PASSED          [ 40%]
test.py::test_check_if_user_has_permissions[test_input2] PASSED          [ 60%]
test.py::test_check_if_user_has_permissions[test_input3] FAILED          [ 80%]
test.py::test_check_if_user_has_permissions[test_input4] FAILED          [100%]

=================================== FAILURES ===================================
_______________ test_check_if_user_has_permissions[test_input3] ________________

test_input = {'action': 'delete', 'resource': 'machine/1', 'user': 'leela'}

    @pytest.mark.parametrize('test_input', data)
    def test_check_if_user_has_permissions(test_input):
>       assert not check_if_user_has_permissions(**test_input)
E       AssertionError: assert not True
E        +  where True = check_if_user_has_permissions(**{'action': 'delete', 'resource': 'machine/1', 'user': 'leela'})

test.py:21: AssertionError
----------------------------- Captured stdout call -----------------------------
{'user': 'leela', 'resource': 'machine/1', 'action': 'delete'}
_______________ test_check_if_user_has_permissions[test_input4] ________________

test_input = {'action': '*', 'resource': 'machine/*', 'user': 'leela'}

    @pytest.mark.parametrize('test_input', data)
    def test_check_if_user_has_permissions(test_input):
>       assert not check_if_user_has_permissions(**test_input)
E       AssertionError: assert not True
E        +  where True = check_if_user_has_permissions(**{'action': '*', 'resource': 'machine/*', 'user': 'leela'})

test.py:21: AssertionError
----------------------------- Captured stdout call -----------------------------
{'user': 'leela', 'resource': 'machine/*', 'action': '*'}
========================= 2 failed, 3 passed in 0.19s ==========================
0 голосов
/ 27 февраля 2020

Я нашел более простое решение этой проблемы через некоторое время.

Я сделал mark.parametrize так:

data = 
[
["bender", "machine_4", "action1", False],
["leela", "machine_2", "action1", False],
["leela", "file/2", "action4", True],
["leela", "file/2", "action2", False],
["leela", "application/1", "action1", True],
["leela", "application/2", "action1", False],
["fry", "application/1", "action1", True],
["zoidberg", "application/1", "action1", False],
]


@pytest.mark.parametrize("user,resource,action, expected", data)
@patch("dev_maintenance.roles.db")
def test_check_if_user_has_permissions(db,user,resource,action,expected):

    db.session.query.return_value.filter_by.return_value.join.return_value.all.return_value = \
        [
            ("bender", "machine_1", "action1"),
            ("bender", "machine_2", "action1"),
            ("bender", "machine_3", "action1"),
            ("bender", "machine_3", "action2"),
            ("leela", "file/*", "action4"),
            ("leela", "application/1", "*"),
            ("fry", "*", "*"),
        ]

    assert check_if_user_has_permissions(user, resource, action) == expected

То, что я здесь делал, проходило user, resource и action параметров функции и утверждают, что отклик функции с этими параметрами равен параметру expected. Так что он будет работать как True == True, в зависимости от параметров.

...