⚖️ Старый vs Новый подход
⚡ Три главных улучшения
- Тест без шагов → тест с
with allure.step()— видно где упало - Методы класса без разметки →
@allure.stepна методах — не надо дублировать шаги в тестах - Ручной запуск тестов → скрипт
run.sh/run.ps1— один шаг для всего
1. Тесты без Allure vs с Allure-шагами
Из лекции: без шагов сложно понять, на каком этапе упал тест.
Из лекции (старое) — без шагов:
# test_companies.py — без Allure-шагов
def test_add_new(self):
body = self.api.get_company_list()
len_before = len(body)
name = "Autotest"
result = self.api.create_company(name, "Descr")
new_id = result["id"]
body = self.api.get_company_list()
for company in body:
if company["id"] == new_id:
assert company["name"] == name
body = self.api.get_company_list()
len_after = len(body)
assert len_after - len_before == 1
self.db.delete(new_id)
Современный подход — с Allure-шагами:
# test_companies.py — с Allure-шагами
@allure.title("Создание организации")
def test_add_new(self):
with allure.step("Получить количество организаций ДО"):
len_before = len(self.api.get_company_list())
with allure.step("Создать организацию"):
with allure.step("Сгенерировать название"):
name, descr = "Autotest", "Descr"
with allure.step("Вызвать API-метод"):
result = self.api.create_company(name, descr)
new_id = result["id"]
with allure.step("Проверить поля новой организации"):
companies = self.api.get_company_list()
match = next((c for c in companies if c["id"] == new_id), None)
assert match and match["name"] == name
with allure.step("Проверить счётчик (ДО + 1 = ПОСЛЕ)"):
len_after = len(self.api.get_company_list())
assert len_after - len_before == 1
with allure.step("Удалить из БД"):
self.db.delete(new_id)
2. Методы класса без @allure.step vs с @allure.step
Из лекции: без декоратора на методе — приходится оборачивать каждый вызов в with allure.step() в каждом тесте. С декоратором — вызов метода автоматически становится шагом в отчёте.
Старый подход — шаги только в тестах:
# Каждый тест вынужден дублировать шаги
def test_get_companies(self):
with allure.step("Получить список через API"):
api_result = self.api.get_company_list() # метод без @allure.step
with allure.step("Получить список из БД"):
db_result = self.db.get_companies() # метод без @allure.step
with allure.step("Сравнить"):
assert len(api_result) == len(db_result)
def test_add_new(self):
with allure.step("Получить список через API"):
result = self.api.get_company_list() # снова дублируем шаг
...
Современный подход — @allure.step на методах класса:
# company_api.py
class CompanyApi:
@allure.step("api. Получить список компаний")
def get_company_list(self):
...
@allure.step("api. Создать компанию '{name}'")
def create_company(self, name, description=""):
...
# test_companies.py — тесты без дублирования шагов
def test_get_companies(self):
api_result = self.api.get_company_list() # автоматически шаг в отчёте
db_result = self.db.get_companies() # автоматически шаг в отчёте
assert len(api_result) == len(db_result)
3. Ручной запуск vs скрипт автоматизации
Из лекции: ручной запуск требует помнить три команды и правильный порядок.
Ручной (из лекции — старое):
# Нужно помнить порядок и вводить 3 команды вручную
pytest --alluredir=allure-results
allure generate allure-results -o allure-report --clean
allure open allure-report
Современный — один скрипт run.ps1 (Windows):
# run.ps1 — запустить: .\run.ps1
$results = "allure-results"
$report = "allure-report"
Remove-Item -Recurse -Force $results -ErrorAction SilentlyContinue
Remove-Item -Recurse -Force $report -ErrorAction SilentlyContinue
pytest --alluredir=$results
allure generate $results -o $report --clean
allure open $report
4. allure generate без --clean vs с --clean
Проблема без --clean:
# Старые результаты смешиваются с новыми
allure generate allure-results -o allure-report
# В отчёте будут и старые, и новые тесты — неверная статистика
Правильно — с --clean:
# --clean очищает папку перед генерацией
allure generate allure-results -o allure-report --clean
# Отчёт содержит только текущий прогон
5. @allure.step без параметров vs с параметрами
Из лекции: без параметров в названии шага непонятно, с какими данными работал метод.
Без параметров — непонятно:
# Шаг в отчёте: "БД. Удалить организацию"
@allure.step("БД. Удалить организацию")
def delete(self, id):
...
С параметрами — id видно в отчёте:
# Шаг в отчёте: "БД. Удалить организацию по 42"
@allure.step("БД. Удалить организацию по {id}")
def delete(self, id):
...
# {id} подставится автоматически из аргумента метода