Код Senior pytest и фикстуры обновлено

Порядок setup фикстур

Условие

Упрощённая модель pytest. fixtures: словарь имя → {"scope": ..., "deps": [...]}, скоупы session, package, module, class, function. requested: фикстуры, которые запросил тест, по порядку аргументов. Напишите setup_order(fixtures, requested):

  1. Если какая-то фикстура из словаря зависит от фикстуры с более узким скоупом, вернуть ["ScopeMismatch: <фикстура> -> <зависимость>"] для первой такой пары (фикстуры в порядке словаря, зависимости по порядку).
  2. Иначе стабильно отсортировать requested по скоупу от широкого к узкому и для каждой обойти в глубину: сначала зависимости по порядку, затем сама фикстура. Каждая фикстура один раз. Вернуть порядок setup.

Примеры

setup_order({"page":{"scope":"function","deps":["browser"]},"browser":{"scope":"session","deps":[]},"api":{"scope":"session","deps":[]}}, ["page", "api"]) // ["api", "browser", "page"]
setup_order({"user":{"scope":"function","deps":["api"]},"api":{"scope":"session","deps":["config"]},"config":{"scope":"session","deps":[]}}, ["user"]) // ["config", "api", "user"]
setup_order({"db":{"scope":"session","deps":["tmp_user"]},"tmp_user":{"scope":"function","deps":[]}}, ["db"]) // ["ScopeMismatch: db -> tmp_user"]

Как подойти

Подсказки: 2
  1. Сначала проверка скоупов по всем фикстурам словаря.
  2. sorted в Python стабилен: одинаковые скоупы сохранят порядок аргументов.

Решите в тренажёре

Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.

Термины по теме