Я бы написал так:
import pytest
import itertools
OPTIONS = ['a', 'b', 'c']
@pytest.mark.parametrize(
'param',
itertools.permutations(OPTIONS, 2),
ids=lambda pair: "first={}, second={}".format(*pair)
)
def test_fn(param):
first, second = param
assert first != second
Результат:
> pytest --verbose
================================ test session starts =================================
platform linux2 -- Python 2.7.12, pytest-3.6.1, py-1.5.3, pluggy-0.6.0 -- /usr/bin/python
cachedir: .pytest_cache
rootdir: /home/paulos/work/lixo/tests, inifile:
collected 6 items
test_foo.py::test_fn[first=a, second=b] PASSED [ 16%]
test_foo.py::test_fn[first=a, second=c] PASSED [ 33%]
test_foo.py::test_fn[first=b, second=a] PASSED [ 50%]
test_foo.py::test_fn[first=b, second=c] PASSED [ 66%]
test_foo.py::test_fn[first=c, second=a] PASSED [ 83%]
test_foo.py::test_fn[first=c, second=b] PASSED [100%]
================================ 6 passed in 0.03 seconds ================================
[обновление]
Я думаю, что этот ответ - решение, которое ябуду использовать.Каждый день - школьный день!(Из любопытства есть способ, которым я мог бы быть «param» в нечто вроде «first, second», чтобы test_foo (param) был test_foo (first, second). Я не уверен, что на самом деле что-то помогает ...но мне любопытно - Ф. Эллиот
Если вы не против test_fn[a-b]
вместо test_fn[a, b]
:
@pytest.mark.parametrize(
'first,second',
itertools.permutations(OPTIONS, 2),
)
def test_fn(first, second):
assert first != second
На практике мы на самом деле не бежимтесты с --verbose
в любом случае, поэтому большую часть времени результат будет просто точкой для каждого теста.