Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added module12/hw4/img.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added module12/hw4/img_1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
56 changes: 56 additions & 0 deletions module12/hw4/rt_with_exceptions.py
Original file line number Diff line number Diff line change
@@ -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())
16 changes: 16 additions & 0 deletions module12/hw4/runner_tests.log
Original file line number Diff line number Diff line change
@@ -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
94 changes: 94 additions & 0 deletions module12/hw4/tests_12_4.py
Original file line number Diff line number Diff line change
@@ -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()