тестирование функции python - укажите на ошибку

Сначала создал функцию 'city_functions.py'

def get_city_country(city, country, population=''):

    """строит отформатированное имя города и стране."""
    if population:
        full_name = f"{city}, {country} - population {population}"
    else:
        full_name = f"{city}, {country}"

    return full_name.title()

Затем это отформатировал в 'names.py'

from city_functions import get_city_country

print("Enter 'q' at any time to quit.")

while True:

    city = input("\nIn what city you are born? ")
    if city == 'q':
        break
    country = input("In what country the city are? ")
    if country == 'q':
        break
    population = input("And how many people leave there? ")
    if population == 'q':
        break
    elif population == '':
        pass

    formated_name = get_city_country(city, country, population)

    print(f"{formated_name}")

Создал функционал для тестирования 'test_cities'

import unittest
from city_functions import get_city_country

class NamesTestCase(unittest.TestCase):
    """тесты для 'city_function.py."""

    def test_city_country_name(self):
        """имена вида 'Santiago, Chile' работают правильно?."""
        formated_name = get_city_country('santiago', 'chile')
        self.assertEqual(formated_name, 'Santiago, Chile')

    def test_city_country_population_name(self):
        """работает ли правильно? 'Santiago, Chile - population 5000000."""
        formated_name = get_city_country('santiago', 'chile', 5000000)
        self.assertEqual(formated_name, 'Santiago, Chile - population 5000000')

if __name__ == '__main__':
    unittest.main()

пока не добавил необязательный параметр population оно работало хорошо, укажите на ошибку пожалуйста!


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

Автор решения: Эникейщик

Передаёшь названия с маленькой буквы, а проверяешь с заглавной.

→ Ссылка
Автор решения: insolor

Если запустить тест, то будет такой вывод:

.F
======================================================================
FAIL: test_city_country_population_name (__main__.NamesTestCase)
работает ли правильно? 'Santiago, Chile - population 5000000.
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/insolor/Projects/stackoverflow/utest/test_cities.py", line 15, in test_city_country_population_name
    self.assertEqual(formated_name, 'Santiago, Chile - population 5000000')
AssertionError: 'Santiago, Chile - Population 5000000' != 'Santiago, Chile - population 5000000'
- Santiago, Chile - Population 5000000
?                   ^
+ Santiago, Chile - population 5000000
?                   ^


----------------------------------------------------------------------
Ran 2 tests in 0.002s

FAILED (failures=1)

Вот тут тест вам явно указывает на проблему:

    self.assertEqual(formated_name, 'Santiago, Chile - population 5000000')
AssertionError: 'Santiago, Chile - Population 5000000' != 'Santiago, Chile - population 5000000'
- Santiago, Chile - Population 5000000
?                   ^
+ Santiago, Chile - population 5000000
?                   ^

Этот вывод означает, что ожидалось что population будет с маленькой буквы, а получили с большой.

Так произошло из-за того, что метод строки .title() в функции get_city_country делает каждое слово с большой буквы. Чтобы так не происходило, можно применять метод .title() не ко всей конечной строке, а только к названиям города и страны:

def get_city_country(city, country, population=''):
    """строит отформатированное имя города и стране."""
    city = city.title()
    country = country.title()
    if population:
        full_name = f"{city}, {country} - population {population}"
    else:
        full_name = f"{city}, {country}"

    return full_name

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

→ Ссылка