0
import unittest
from number_writer import get_formatted_name 

class NamesTestCase(unittest.TestCase):

    def test_first_last_name(self):
        formatted_name = get_formatted_name('janis', 'joplin')
        self.assertEqual(formatted_name, 'Janis', 'Joplin')

unittest.main()

Почему вместо запуска теста, импортируется и запускается программа

Импортирую этот код:

def get_formatted_name(first, last):
    full_name = first + ' ' + last
    return full_name.title()

print("Enter 'q' at any time to quit") while True: first = input("\nplease give me a first name: ") if first == 'q': break last = input("\nplease give me a last name: ") if last == 'q': break

formatted_name = get_formatted_name(first, last)
print("\nNeatly formatted name: " + formatted_name)

insolor
  • 49,104

1 Answers1

1

При импорте модуля весь код, который находится не внутри функций или методов классов, запускается. Чтобы избежать запуска кода при импорте, его убирают в блок if __name__ == “__main__” (смысл проверки в том, что при импорте модуля глобальная переменная __name__ равна имени этого модуля, а при запуске модуля без импорта она равна "__main__").

Подробнее можно почитать в этом ответе: Что делает if __name__ == “__main__”?

У вас при импорте модуля сразу запускается бесконечный цикл запроса данных от пользователя, до выполнения теста код не доходит. Нужно спрятать этот цикл в блок if __name__ == “__main__”, пример:

def get_formatted_name(first, last):
    full_name = first + ' ' + last
    return full_name.title()

def main(): print("Enter 'q' at any time to quit") while True: first = input("\nplease give me a first name: ") if first == 'q': break last = input("\nplease give me a last name: ") if last == 'q': break

    formatted_name = get_formatted_name(first, last)
    print("\nNeatly formatted name: " + formatted_name)


if name == "main": main()

Я обычно большие блоки (больше 1-2 строк) убираю в функцию с именем main, но это не обязательно, так тоже будет работать:

def get_formatted_name(first, last):
    full_name = first + ' ' + last
    return full_name.title()

if name == "main": print("Enter 'q' at any time to quit") while True: first = input("\nplease give me a first name: ") if first == 'q': break last = input("\nplease give me a last name: ") if last == 'q': break

    formatted_name = get_formatted_name(first, last)
    print("\nNeatly formatted name: " + formatted_name)

insolor
  • 49,104
  • А теперь новая проблема, запускаю тест и ничего не происходит – Алексей Карнеенко Jul 20 '21 at 11:25
  • @АлексейКарнеенко значит что-то не так запускаете, у меня ваш тест успешно падает) https://i.stack.imgur.com/ujcmQ.png – insolor Jul 20 '21 at 11:29
  • Блин, он не должен падать – Алексей Карнеенко Jul 20 '21 at 11:32
  • Ну, функция возвращает 'Janis Joplin', а вы в тесте пишете, что должно возвращать 'Janis'. Если изменить на self.assertEqual(formatted_name, 'Janis Joplin'), то успешно проходит тест – insolor Jul 20 '21 at 11:33
  • Вот это выражение self.assertEqual(formatted_name, 'Janis', 'Joplin') означает, что formatted_name должно быть равно 'Janis', а если не равно, то нужно вывести сообщение 'Joplin' – insolor Jul 20 '21 at 11:34