Не запускается тест в питоне

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)

Ответы (1 шт):

Автор решения: insolor

При импорте модуля весь код, который находится не внутри функций или методов классов, запускается. Чтобы избежать запуска кода при импорте, его убирают в блок 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)
→ Ссылка