Skip to content
Draft
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/hw3/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/hw3/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
36 changes: 36 additions & 0 deletions module12/hw3/suite_12_3.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
#
"""
Задача "Заморозка кейсов":

Подготовка:

В этом задании используйте те же TestCase, что и в предыдущем: RunnerTest и TournamentTest.

Часть 1. TestSuit.
1. Создайте модуль suite_12_3.py для описания объекта TestSuite.
Укажите на него переменной с произвольным названием.
2. Добавьте тесты RunnerTest и TournamentTest в этот TestSuit.
3. Создайте объект класса TextTestRunner, с аргументом verbosity=2.

Часть 2. Пропуск тестов.
1. Классы RunnerTest дополнить атрибутом is_frozen = False и TournamentTest атрибутом is_frozen = True.
2. Напишите соответствующий декоратор к каждому методу (кроме @classmethod), который при значении is_frozen = False будет выполнять тесты, а is_frozen = True - пропускать и выводить сообщение 'Тесты в этом кейсе заморожены'.

Таким образом вы сможете контролировать пропуск всех тестов в TestCase изменением всего одного атрибута.
Запустите TestSuite и проверьте полученные результаты тестов из обоих TestCase
"""
import unittest
from tests_12_3 import TournamentTest, RunnerTest


# Создание тестового набора
def suite():
suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(RunnerTest))
suite.addTest(unittest.makeSuite(TournamentTest))
return suite

# Запуск тестов
if __name__ == '__main__':
runner = unittest.TextTestRunner(verbosity=2)
runner.run(suite())
127 changes: 127 additions & 0 deletions module12/hw3/tests_12_3.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
import unittest

from runner_and_tournament import Runner, Tournament


# Декоратор для пропуска тестов, если 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):
# Создаем объект класса Runner
runner = Runner("TestRunner")

# Вызываем метод walk 10 раз
for _ in range(10):
runner.walk()

# Проверяем, что расстояние равно 50
self.assertEqual(runner.distance, 50)


@skip_if_frozen
def test_run(self):
# Создаем объект класса Runner
runner = Runner("TestRunner")

# Вызываем метод run 10 раз
for _ in range(10):
runner.run()

# Проверяем, что расстояние равно 100
self.assertEqual(runner.distance, 100)


@skip_if_frozen
def test_challenge(self):
# Создаем два объекта класса Runner
runner1 = Runner("Runner1")
runner2 = Runner("Runner2")

# Runner1 бегает, Runner2 ходит
for _ in range(10):
runner1.run()
runner2.walk()

# Проверяем, что дистанции разные
self.assertNotEqual(runner1.distance, runner2.distance)


class TournamentTest(unittest.TestCase):
""" Тесты для класса Tournament """

is_frozen = True # Замороженные тесты


@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}")


@skip_if_frozen
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)


@skip_if_frozen
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)


@skip_if_frozen
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)