Почему списки отличаются в pytest по сравнению с выводом из консоли? - PullRequest
1 голос
/ 15 июня 2019

Я работаю через 100 дней кода. Одним из проектов является реализация pytest над проектом по выбору. Я выбрал предыдущий проект, который использует определенный словарь марок и моделей автомобилей и возвращает вывод на различные вопросы. Я написал модульный тест для двух из этих функций, и они не работают.

Запуск кода с консоли для функции get_all_jeeps() вернет:

Гранд Чероки, Чероки, Трейлхок, Трекхок

Если я запускаю pytest со следующим кодом:

def test_get_all_jeeps():
    expected = 'Grand Cherokee, Cherokee, Trailhawk, Trackhawk'
    actual = get_all_jeeps()
    assert type(actual) == str
    assert actual == expected

Сбой, потому что вывод pytests выглядит так, как будто он сортируется. Зачем это делать?

E       AssertionError: assert 'Cherokee, Gr...wk, Trailhawk' == 'Grand Cherokee...wk, Trackhawk'
E         - Cherokee, Grand Cherokee, Trackhawk, Trailhawk
E         + Grand Cherokee, Cherokee, Trailhawk, Trackhawk

Другой тест дает другой вывод, когда он запускается из консоли. Выход из консоли для функции get_first_model_each_manufacturer():

['Сокол', 'Коммодор', 'Максима', 'Сивик', 'Гранд Чероки']

За исключением того, что это не удалось Pytest:

    def test_get_first_model_each_manufacturer():
        expected = ['Falcon', 'Commodore', 'Maxima', 'Civic', 'Grand Cherokee']
        actual = get_first_model_each_manufacturer()
        assert type(actual) == list
>       assert actual == expected
E       AssertionError: assert ['Fairlane', ...', 'Cherokee'] == ['Falcon', 'Co...and Cherokee']
E         on index 0 diff: 'Fairlane' != 'Falcon'
E         Use -v to get the full diff

Как туда попадает предмет "Fairlane"? Что делает Pytest по-другому?

Репо здесь https://github.com/cadamei/100daysofcode/tree/master/days/10-12-pytest

Все функции используют этот словарь в качестве данных:

cars = {
    'Ford': ['Falcon', 'Focus', 'Festiva', 'Fairlane'],
    'Holden': ['Commodore', 'Captiva', 'Barina', 'Trailblazer'],
    'Nissan': ['Maxima', 'Pulsar', '350Z', 'Navara'],
    'Honda': ['Civic', 'Accord', 'Odyssey', 'Jazz'],
    'Jeep': ['Grand Cherokee', 'Cherokee', 'Trailhawk', 'Trackhawk']

1 Ответ

0 голосов
/ 15 июня 2019

Ваш скрипт cars.py изменяет список, так как при импорте он запускает print(sort_car_models()), удалите эти строки или поместите их в if __name__ == '__main__':

Чтобы узнать больше об этом, взгляните на Что делать, если __name__ == "__main__": do?

...