Задача курса
Фикстуры pytest и scope: напишите тесты для очереди
Курс «Python для продвинутых: ООП, типизация и тестирование» · урок «Fixtures: подготовка тестового состояния и области видимости»
Условие
Напиши тесты для очереди с двумя scope
Что уже дано
Проверяющая система скрыто определяет класс Queue в том же пространстве имён до запуска твоего кода:
class Queue:
def __init__(self):
self.items: list[str] = []
def push(self, item: str) -> None:
self.items.append(item)
def pop(self) -> str:
return self.items.pop(0)
def size(self) -> int:
return len(self.items)
Класс уже доступен по имени Queue — импортировать ничего не нужно.
Что нужно сделать
Напиши в редакторе полноценный pytest-файл с двумя фикстурами и тремя тест-функциями.
Фикстуры:
fresh_queue— фикстура соscope="function". Создаёт новыйQueue()и возвращает его. Каждая тест-функция, запросившая эту фикстуру, должна получать отдельный объект.shared_queue— фикстура соscope="module". СоздаётQueue(), добавляет в него один элемент"seed"черезpush, и возвращает объект. Все тест-функции, запросившие эту фикстуру, получают один и тот же объект.
Тест-функции:
test_fresh_queue_is_empty(fresh_queue)— проверяет, что свежая очередь имеетsize() == 0.test_fresh_queue_isolation(fresh_queue)— добавляет элемент"x"черезpush, затем проверяетsize() == 1. Мутация не должна влиять на другие тесты, использующиеfresh_queue.test_shared_queue_has_seed(shared_queue)— проверяет, чтоshared_queueсодержит хотя бы один элемент и первый из них равен"seed"(используйitems[0]).
Ввод и вывод
stdin не используется. Печатать через print в stdout ничего не нужно.
Проверяющая система после твоего кода:
- находит в глобальном пространстве имён функции
fresh_queue,shared_queue,test_fresh_queue_is_empty,test_fresh_queue_isolation,test_shared_queue_has_seed; - запускает твои тест-функции через pytest-подобный механизм, передавая результаты фикстур;
- проверяет поведение при мутации: убеждается, что
test_fresh_queue_is_emptyне падает после того, какtest_fresh_queue_isolationуже добавил элемент в свою копию.
