тестирование функции 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 шт):
Если запустить тест, то будет такой вывод:
.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
Краткий вывод из всего этого: нужно читать, то что пишет вам тест. Тест не просто падает или проходит, в случае падения тестовый фреймворк прямо пишет вам в чем была причина падения.