2015-05-10 3 views
2

Я новичок в pytest, и я ищу, чтобы прояснить некоторую путаницу, которую я имею в отношении параметризированных тестов.pytest: параметризированные тесты против явных тестов

Лучше (т. Е. Более четкое, более DRY, более ремонтопригодное) использовать единую параметризованную тестовую функцию или несколько явных тестов, которые отличаются только их «входом»?

Позвольте мне привести пример, чтобы лучше объяснить мою точку зрения:

сказать, что мы написали простую функцию, merge_sort, и мы хотим, чтобы проверить его с помощью различных входных данных, например, в том числе отрицательных чисел, повторяющихся чисел, поплавки и т.д.

Пишущие несколько явных тестов:

def test_merge_sort(): 
    unsorted = [2, 1, 3] 
    expected = [1, 2, 3] 

    assert merge_sort(unsorted) == expected 

def test_merge_sort_negative(): 
    unsorted = [-2, -1, -3] 
    expected = [-3, -2, -1] 

    assert merge_sort(unsorted) == expected 

def test_merge_sort_including_zero(): 
    unsorted = [2, 0, 1] 
    expected = [0, 1, 2] 

    assert merge_sort(unsorted) == expected 

def test_merge_sort_repeated_number(): 
    unsorted = [0, 1, 0] 
    expected = [0, 0, 1] 

    assert merge_sort(unsorted) == expected 

def test_merge_sort_float(): 
    unsorted = [0.1, 0.3, 0.2] 
    expected = [0.1, 0.2, 0.3] 

    assert merge_sort(unsorted) == expected 

ИЛИ, писать один, paramaterized тест:

@pytest.mark.parametrize("unsorted,expected", [ 
    ([2,1,3], [1,2,3]), 
    ([-2,-1,-3], [-3,-2,-1]), 
    ([2,0,1], [0,1,2]), 
    ([0,1,0], [0,0,1]), 
    ([0.1,0.3,0.2], [0.1,0.2,0.3]), 
]) 
def test_merge_sort(unsorted, expected): 
    assert merge_sort(unsorted) == expected 

Моя первоначальная мысль заключается в том, что несколько явных тестов более ясны и удобны в обслуживании, как если бы у вас были сбои, вы получили бы описательное имя функции, указывающее конкретный проверенный случай. Тем не менее, параметризованный тест более DRY, и было бы легче извлечь тестовые данные в качестве приспособления для других тестов (например, используя те же данные для проверки функции quick_sort).

Возможно, есть что-то, что я пропустил в документах pytest, которые на это отвечают?

Заранее благодарим за любую помощь!

+1

Если есть сбой, ожидаемые/фактические списки будут включены в вывод. Единственное, чего вы не получаете, это описание на естественном языке, и даже это можно сделать, включив его в данные параметров. – delnan

+0

@delnan Можете ли вы привести пример с передачей описания как части параметризованного теста? Это похоже на то, что я ищу. Благодаря! – luggzy

ответ

4

Сообщение отказ будет включать в себя все параметризованные значения, так что вы можете добавить текст описания к параметрам:

@pytest.mark.parametrize("description,unsorted,expected", [ 
    ("positive", [2,1,3], [1,2,3]), 
    ("negative", [-2,-1,-3], [-3,-2,-1]), 
    ("including zero", [2,0,1], [0,1,2]), 
    ("duplicate values", [0,1,0], [0,0,1]), 
    ("floats", [0.1,0.3,0.2], [0.1,0.2,0.3]), 
]) 
def test_merge_sort(description, unsorted, expected): 
    assert merge_sort(unsorted) == expected 
Смежные вопросы