diff --git a/module12/hw4/img.png b/module12/hw4/img.png new file mode 100644 index 0000000..12f0fd1 Binary files /dev/null and b/module12/hw4/img.png differ diff --git a/module12/hw4/img_1.png b/module12/hw4/img_1.png new file mode 100644 index 0000000..40ec836 Binary files /dev/null and b/module12/hw4/img_1.png differ diff --git a/module12/hw4/rt_with_exceptions.py b/module12/hw4/rt_with_exceptions.py new file mode 100644 index 0000000..7bfbcc6 --- /dev/null +++ b/module12/hw4/rt_with_exceptions.py @@ -0,0 +1,56 @@ +class Runner: + def __init__(self, name, speed=5): + if isinstance(name, str): + self.name = name + else: + raise TypeError(f'Имя может быть только строкой, передано {type(name).__name__}') + self.distance = 0 + if speed > 0: + self.speed = speed + else: + raise ValueError(f'Скорость не может быть отрицательной, сейчас {speed}') + + def run(self): + self.distance += self.speed * 2 + + def walk(self): + self.distance += self.speed + + def __str__(self): + return self.name + + def __repr__(self): + return self.name + + def __eq__(self, other): + if isinstance(other, str): + return self.name == other + elif isinstance(other, Runner): + return self.name == other.name + + +class Tournament: + def __init__(self, distance, *participants): + self.full_distance = distance + self.participants = list(participants) + + def start(self): + finishers = {} + place = 1 + while self.participants: + for participant in self.participants: + participant.run() + if participant.distance >= self.full_distance: + finishers[place] = participant + place += 1 + self.participants.remove(participant) + + return finishers + + +# first = Runner('Вося', 10) +# second = Runner('Илья', 5) +# # third = Runner('Арсен', 10) +# +# t = Tournament(101, first, second) +# print(t.start()) \ No newline at end of file diff --git a/module12/hw4/runner_tests.log b/module12/hw4/runner_tests.log new file mode 100644 index 0000000..db2bfb0 --- /dev/null +++ b/module12/hw4/runner_tests.log @@ -0,0 +1,16 @@ +WARNING: Неверный тип данных для объекта Runner: Имя может быть только строкой, передано int +Traceback (most recent call last): + File "C:\Users\daire\PycharmProjects\python-course\module12\hw3\tests_12_4.py", line 78, in test_run + runner = Runner(12345, speed=10) # Это вызовет исключение + ^^^^^^^^^^^^^^^^^^^^^^^ + File "C:\Users\daire\PycharmProjects\python-course\module12\hw3\rt_with_exceptions.py", line 6, in __init__ + raise TypeError(f'Имя может быть только строкой, передано {type(name).__name__}') +TypeError: Имя может быть только строкой, передано int +WARNING: Неверная скорость для Runner: Скорость не может быть отрицательной, сейчас -5 +Traceback (most recent call last): + File "C:\Users\daire\PycharmProjects\python-course\module12\hw3\tests_12_4.py", line 61, in test_walk + runner = Runner("TestRunner", speed=-5) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "C:\Users\daire\PycharmProjects\python-course\module12\hw3\rt_with_exceptions.py", line 11, in __init__ + raise ValueError(f'Скорость не может быть отрицательной, сейчас {speed}') +ValueError: Скорость не может быть отрицательной, сейчас -5 diff --git a/module12/hw4/tests_12_4.py b/module12/hw4/tests_12_4.py new file mode 100644 index 0000000..3b66a10 --- /dev/null +++ b/module12/hw4/tests_12_4.py @@ -0,0 +1,94 @@ +# +""" +Задача "Логирование бегунов": +В первую очередь скачайте исходный код, который нужно обложить тестами с GitHub. (Можно скопировать) +Основное обновление - выбрасывание исключений, если передан неверный тип в name и если передано отрицательное значение в speed. + +Для решения этой задачи вам понадобиться класс RunnerTest из предыдущей задачи. +В модуле tests_12_4.py импортируйте пакет logging и настройте basicConfig на следующие параметры: +Уровень - INFO +Режим - запись с заменой('w') +Название файла - runner_tests.log +Кодировка - UTF-8 +Формат вывода - на своё усмотрение, обязательная информация: уровень логирования, сообщение логирования. + +Дополните методы тестирования в классе RunnerTest следующим образом: +test_walk: +Оберните основной код конструкцией try-except. +При создании объекта Runner передавайте отрицательное значение в speed. +В блок try добавьте логирование INFO с сообщением '"test_walk" выполнен успешно' +В блоке except обработайте исключение соответствующего типа и логируйте его на уровне WARNING с сообщением "Неверная скорость для Runner". +test_run: +Оберните основной код конструкцией try-except. +При создании объекта Runner передавайте что-то кроме строки в name. +В блок try добавьте логирование INFO с сообщением '"test_run" выполнен успешно' +В блоке except обработайте исключение соответствующего типа и логируйте его на уровне WARNING с сообщением "Неверный тип данных для объекта Runner". +""" +import unittest +import logging +from rt_with_exceptions import Runner + + +# Настройка логирования +logging.basicConfig( + level=logging.INFO, + filename='runner_tests.log', + filemode='w', + encoding='utf-8', + format='%(levelname)s: %(message)s' +) + + +# Декоратор для пропуска тестов, если is_frozen = True +def skip_if_frozen(func): + def wrapper(self, *args, **kwargs): + if getattr(self, 'is_frozen', False): + self.skipTest('Тесты в этом кейсе заморожены') + return func(self, *args, **kwargs) + return wrapper + + +class RunnerTest(unittest.TestCase): + """ Тесты для класса Runner """ + + is_frozen = False # Эти тесты должны выполняться + + + @skip_if_frozen + def test_walk(self): + try: + # Создаем объект класса Runner с отрицательной скоростью, что вызовет исключение + runner = Runner("TestRunner", speed=-5) + # Вызываем метод walk 10 раз + for _ in range(10): + runner.walk() + + # Логируем успешное выполнение теста + logging.info('"test_walk" выполнен успешно') + + except ValueError as e: + # Логируем исключение + logging.warning(f"Неверная скорость для Runner: {e}", exc_info=True) + + + @skip_if_frozen + def test_run(self): + try: + # Создаем объект класса Runner с неверным типом имени + runner = Runner(12345, speed=10) # Это вызовет исключение + + # Вызываем метод run 10 раз + for _ in range(10): + runner.run() + + # Логируем успешное выполнение теста + logging.info('"test_run" выполнен успешно') + + except TypeError as e: + # Логируем исключение + logging.warning(f"Неверный тип данных для объекта Runner: {e}", exc_info=True) + + +# Запуск тестов +if __name__ == '__main__': + unittest.main()