diff --git a/module12/hw3/img.png b/module12/hw3/img.png new file mode 100644 index 0000000..023663d Binary files /dev/null and b/module12/hw3/img.png differ diff --git a/module12/hw3/runner_and_tournament.py b/module12/hw3/runner_and_tournament.py new file mode 100644 index 0000000..9b73368 --- /dev/null +++ b/module12/hw3/runner_and_tournament.py @@ -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 \ No newline at end of file diff --git a/module12/hw3/suite_12_3.py b/module12/hw3/suite_12_3.py new file mode 100644 index 0000000..ad2a92e --- /dev/null +++ b/module12/hw3/suite_12_3.py @@ -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()) \ No newline at end of file diff --git a/module12/hw3/tests_12_3.py b/module12/hw3/tests_12_3.py new file mode 100644 index 0000000..eb2b3ce --- /dev/null +++ b/module12/hw3/tests_12_3.py @@ -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)