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/hw2/img.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
39 changes: 39 additions & 0 deletions module12/hw2/runner_and_tournament.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
class Runner:
def __init__(self, name, speed=5):
self.name = name
self.distance = 0
self.speed = speed

def run(self):
self.distance += self.speed * 2

def walk(self):
self.distance += self.speed

def __str__(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
99 changes: 99 additions & 0 deletions module12/hw2/tests_12_2.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
# Домашнее задание по теме "Методы Юнит-тестирования"
"""
Задача:
В первую очередь скачайте исходный код, который нужно обложить тестами с GitHub. (Можно скопировать)
В этом коде сможете обнаружить дополненный с предыдущей задачи класс Runner и новый класс Tournament.
Изменения в классе Runner:
Появился атрибут speed для определения скорости бегуна.
Метод __eq__ для сравнивания имён бегунов.
Переопределены методы run и walk, теперь изменение дистанции зависит от скорости.
Класс Tournament представляет собой класс соревнований, где есть дистанция, которую нужно пробежать и список участников. Также присутствует метод start, который реализует логику бега по предложенной дистанции.

Напишите класс TournamentTest, наследованный от TestCase. В нём реализуйте следующие методы:

setUpClass - метод, где создаётся атрибут класса all_results. Это словарь в который будут сохраняться результаты всех тестов.
setUp - метод, где создаются 3 объекта:
Бегун по имени Усэйн, со скоростью 10.
Бегун по имени Андрей, со скоростью 9.
Бегун по имени Ник, со скоростью 3.
tearDownClass - метод, где выводятся all_results по очереди в столбец.

Так же методы тестирования забегов, в которых создаётся объект Tournament на дистанцию 90. У объекта класса Tournament запускается метод start, который возвращает словарь в переменную all_results. В конце вызывается метод assertTrue, в котором сравниваются последний объект из all_results (брать по наибольшему ключу) и предполагаемое имя последнего бегуна.
Напишите 3 таких метода, где в забегах участвуют (порядок передачи в объект Tournament соблюсти):
Усэйн и Ник
Андрей и Ник
Усэйн, Андрей и Ник.
Как можно понять: Ник всегда должен быть последним.

Дополнительно (не обязательно, не влияет на зачёт):
В данной задаче, а именно в методе start класса Tournament, допущена логическая ошибка. В результате его работы бегун с меньшей скоростью может пробежать некоторые дистанции быстрее, чем бегун с большей.
Попробуйте решить эту проблему и обложить дополнительными тестами.
"""
import unittest
from module12.hw2.runner_and_tournament import Runner, Tournament


class TournamentTest(unittest.TestCase):


@classmethod
def setUpClass(cls):
# Создаем атрибут для хранения результатов всех тестов
cls.all_results = {}


def setUp(self):
# Создаем объекты бегунов
self.usain = Runner("Усэйн", 10)
self.andrey = Runner("Андрей", 9)
self.nick = Runner("Ник", 3)


@classmethod
def tearDownClass(cls):
# Выводим результаты всех тестов после их завершения
for test_name, result in cls.all_results.items():
# Используем имена бегунов для отображения результатов
finishers = {place: str(participant) for place, participant in result.items()}
print(f"{test_name}: {finishers}")


def test_tournament_usain_and_nick(self):
# Создаем объект Tournament для Усэйна и Ника
tournament = Tournament(90, self.usain, self.nick)
results = tournament.start()

# Сохраняем результаты в all_results
TournamentTest.all_results["Усэйн и Ник"] = results

# Проверяем, что Ник последний
self.assertTrue(results[max(results.keys())] == self.nick)


def test_tournament_andrey_and_nick(self):
# Создаем объект Tournament для Андрея и Ника
tournament = Tournament(90, self.andrey, self.nick)
results = tournament.start()

# Сохраняем результаты в all_results
TournamentTest.all_results["Андрей и Ник"] = results

# Проверяем, что Ник последний
self.assertTrue(results[max(results.keys())] == self.nick)


def test_tournament_usain_andrey_and_nick(self):
# Создаем объект Tournament для Усэйна, Андрея и Ника
tournament = Tournament(90, self.usain, self.andrey, self.nick)
results = tournament.start()

# Сохраняем результаты в all_results
TournamentTest.all_results["Усэйн, Андрей и Ник"] = results

# Проверяем, что Ник последний
self.assertTrue(results[max(results.keys())] == self.nick)


# Запуск тестов
if __name__ == '__main__':
unittest.main()