Як підставляти в результат тестів pytest дані з джейсону в параметризованих тестах


(Grosha) #1

Привіт. Маю параметризовані тести, де приходить масив джейсонів. При закінченні тестів pytest видає список з результатами, але в ньому не виводиться value дежйсону. Це дуже не зручно при перегляді тестів, оскільки треба витрачати час на пошук даних, які були підставленні.

Для прикладу візьмемо даний тест (назви змін, класу, методів взяті навмання):

class TestAB:                               
    list_lines = [                          
        {'p': 'test1'},                     
        {'p': 'test2'}                      
    ]                                       
                                                            
    @pytest.mark.parametrize("line", list_lines)
    def test_sum(self, line):               
        sum = f'test {line["p"]}'           
        assert type(sum) is str, 'A-ta-ta'  

Результат буде таким:
27%20PM

Хочеться результат бачити таким:

python 3.6, pytest 3.10.1


(Maxim Andryushchenkov) #2

Призываю переводчика! :mage:


(Ugin Berets) #3
import pytest


class TestAB:
    list_lines = [
        {'p': 'test1'},
        {'p': 'test2'}
    ]

    ids_list = []
    for item in list_lines:
        ids_list.append(item['p'])

    @pytest.mark.parametrize("line", list_lines, ids=ids_list)
    def test_sum(self, line):
        sum = f'test {line["p"]}'
        assert type(sum) is str, 'A-ta-ta'

(Grosha) #5

Дякую


(Igor Balagurov) #6

Just don’t use dictionaries especially if you have only one value to extract. It will appears in test results.
If you need several values tuples will help you:

@pytest.mark.parametrize('a,b', [
    ('a', 'b'),
    ('c', 'd')
])
@pytest.mark.test
def test_test(a, b):
    pass

41


(Igor Balagurov) #7

Да тут можно по картинке догадаться - оформлено нормально =)
(Может я, конечно, уже просто слишком долго сижу на этом форуме и по-тихоньку осваиваю українську мову =))


(Igor Balagurov) #8
ids_list = []
    for item in list_lines:
        ids_list.append(item['p'])

чтобы выглядело более идеоматично лучше:
ids_list = [item['p'] for item in list_lines]