Удаленка для jenkins+selenide+selenoid+allure+docker спецов на 2-3 часа в день. 100% remote! Присоединиться к проекту

PyTest криво отображает кейсы параметризации на русском

pytest
python
Теги: #<Tag:0x00007fedc3e21798> #<Tag:0x00007fedc3e21630>

(Maxim Andryushchenkov) #1

Товарищи, подскажите, как решается вывод параметров на русском языке? Тут легче показать:
Из кода:

@pytest.mark.parametrize('username, height, weight, pressure_h, pressure_l, glucose, cholesterol, toggle', [
    ('test_user_1', 170, 55, 120, 80, '5.5', '4.5', 'Да'),
    ('test_user_2', 180, 75, 130, 80, 5, 5, 'Нет'),

Из консоли:

tests_ui/test_screening_e2e.py::test_e2e[test_user_1-170-55-120-80-5.5-4.5-\u0414\u0430]
tests_ui/test_screening_e2e.py::test_e2e[test_user_2-180-75-130-80-5-5-\u041d\u0435\u0442]

Хотелось бы увидеть нормальное отображение “Да” и “Нет”


(Sergei Chipiga) #2

Проблема не столько в русском языке, сколько в юникоде вцелом. Насколько понимаю используется python2.7 ? Т.к. у python3 таких проблем не должно быть. Возможно кстати поможет # -*- coding: utf-8 -*-: https://stackoverflow.com/questions/6289474/working-with-utf-8-encoding-in-python-source, хотя не уверен. А в целом хорошая практика - не использовать русский язык и юникод в репортах :slight_smile:


(Maxim Andryushchenkov) #3

Ну нет…тут python 3.6.3.

# -*- coding: utf-8 -*-

Не помог

А они нормально работают в тесте. На странице ищется переключатель Да/Нет к какому-либо вопросу и нажимается в зависимости от кейса вот так:

radio_buttons: //div[contains(text(), '#q_text')]/..//span[contains(text(), '#a_text')]/..

где в методе #q_text и #a_text отлично заменяются на русские слова. А вот PyTest подкачал


(Sergei Chipiga) #4

Есть вариант завести дикт, в котором мапить значения для различных языков, а из параметров пробрасывать Yes/No:

langs = { 
    "yes": {
        "ru": u"Да",
    },
    "no": {
        "ru": u"Нет",
    },
}

Заодно решает вопрос поддержки многоязычного интерфейса, когда все мультиязычные элементы динамически подхватывают нужные значения по параметру языка.


(Maxim Andryushchenkov) #5

Не, ну это прямо так себе решение, ибо помимо Да и Нет могут быть абсолютно любые слова


#6

Там по умолчанию для всех значений вызывается _ascii_escaped(val).

Добавьте вот такое в conftest.py:

def pytest_make_parametrize_id(config, val):
    return repr(val)

(Maxim Andryushchenkov) #7

Спасибо большое! Но мне похоже не нужен ваш аргумент config, у меня и без него работает.


(Сергей Михайлин) #8

а у меня, к сожалению этот метод не срабатывает. В смысле эта функция (хук) даже не вызывается.


(Сергей Михайлин) #9

Проблема решена таким путем:


@pytest.mark.parametrize(
    'array, number_of, expected',
    [
        pytest.param(*test_args, id=test_id)
        for test_args, test_id in zip(TEST_FRAME_CHUNKS, IDS_TEST_FRAME_CHUNKS)
    ]
)
def test_chunks(array, number_of, expected):
    ...