Skip to content
Open
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
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
__pycache__/
.pytest_cache/
.venv/
.coverage
htmlcov/
*.pyc
82 changes: 74 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,24 +1,90 @@
## Задание 1: Юнит-тесты
# Дипломный проект: Stellar Burgers

## Задание 1: юнит-тесты

### Автотесты для проверки программы, которая помогает заказать бургер в Stellar Burgers

### Реализованные сценарии

Созданы юнит-тесты, покрывающие классы `Bun`, `Burger`, `Ingredient`, `Database`
Класс `Burger` покрыт unit-тестами с использованием моков и параметризации:

- создание бургера;
- установка булочки;
- добавление и удаление ингредиента;
- перемещение ингредиента;
- расчёт цены;
- формирование чека.

Процент покрытия 100% (отчет: `htmlcov/index.html`)
Покрытие файла `burger.py` — 100%.

### Структура проекта

- `praktikum` - пакет, содержащий код программы
- `tests` - пакет, содержащий тесты, разделенные по классам. Например, `bun_test.py`, `burger_test.py` и т.д.
- `burger.py` — тестируемый класс `Burger`;
- `bun.py`, `ingredient.py` — модели, используемые классом `Burger`;
- `tests/test_burger.py` — unit-тесты;
- `tests/api/` — API-тесты;
- `api_client.py` — клиент для запросов к API;
- `constants.py` — адреса эндпоинтов и ожидаемые сообщения API;
- `data.py` — генерация уникальных тестовых пользователей;
- `requirements.txt` — зависимости проекта;
- `pytest.ini` — настройки pytest.

### Запуск автотестов

**Установка зависимостей**

> `$ pip install -r requirements.txt`
> `$ python -m pip install -r requirements.txt`

**Запуск автотестов с проверкой обязательного покрытия 100%**

> `$ pytest tests --cov=burger --cov-report=term-missing --cov-fail-under=100`

**Создание HTML-отчёта**

> `$ pytest tests --cov=burger --cov-report=html --cov-fail-under=100`

## Задание 2: API-тесты

Проверены эндпоинты создания пользователя, авторизации и создания заказа.
Для обязательных полей и неверных учётных данных используется параметризация.
Созданные тестами пользователи удаляются после выполнения проверок.

**Запуск API-тестов с формированием данных Allure**

> `$ pytest tests/api --alluredir=allure-results`

**Просмотр отчёта**

Если Allure Commandline установлен:

> `$ allure serve allure-results`

По документации заказ без авторизации должен возвращать `401 Unauthorized`.
Если стенд возвращает `200 OK`, соответствующий тест падает и фиксирует дефект API;
ожидаемый результат не заменяется фактическим поведением неисправного стенда.

## Задание 3: UI-тесты

Элементы и действия страниц описаны с помощью Page Object в каталоге `pages/`,
а локаторы собраны в `locators.py`. Реализовано восемь UI-тестов основной
функциональности и ленты заказов. При падении теста в Allure прикладывается
снимок экрана.

**Запуск в Google Chrome**

> `$ pytest tests/ui --browser chrome --alluredir=allure-results --clean-alluredir`

**Запуск в Mozilla Firefox**

> `$ pytest tests/ui --browser firefox --alluredir=allure-results`

Для запуска без видимого окна браузера добавь параметр `--headless`.
Команды запускаются последовательно: Chrome очищает каталог результатов,
а Firefox дописывает в него свои результаты. Поэтому итоговый Allure-отчёт
содержит проверки обоих браузеров.

**Формирование HTML-отчёта**

**Запуск автотестов и создание HTML-отчета о покрытии**
> `$ allure generate allure-results -o allure-report --clean`

> `$ pytest --cov=praktikum --cov-report=html`
> `$ allure open allure-report`
Binary file added allure-report/assets/favicon-BDLHVmV7.ico
Binary file not shown.
62 changes: 62 additions & 0 deletions allure-report/assets/index-TNctPo69.js

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions allure-report/data/attachments/1818eac4d2b6590b.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
WARNING selenium.webdriver.common.selenium_manager:selenium_manager.py:163 The geckodriver version (0.37.0) detected in PATH at D:\WebDriver\bin\geckodriver.exe might not be compatible with the detected firefox version (152.0.6); currently, geckodriver 0.37.1 is recommended for firefox 152.*, so it is advised to delete the driver in PATH and retry
1 change: 1 addition & 0 deletions allure-report/data/attachments/28dbcf3fb5d56d34.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
WARNING selenium.webdriver.common.selenium_manager:selenium_manager.py:163 The geckodriver version (0.37.0) detected in PATH at D:\WebDriver\bin\geckodriver.exe might not be compatible with the detected firefox version (152.0.6); currently, geckodriver 0.37.1 is recommended for firefox 152.*, so it is advised to delete the driver in PATH and retry
2 changes: 2 additions & 0 deletions allure-report/data/attachments/42429ffce567f549.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
HTTP 200
{"success":true,"user":{"email":"qa_baydashev_24d27e9c7f8347009b674f744ada5f33@yandex.ru","name":"Dmitry"},"accessToken":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjZhOTFjYjMxOTg0MjcwMDAxYmVjZTA0MSIsImlhdCI6MTc4NzkzOTYzMywiZXhwIjoxNzg3OTQwODMzfQ.G5u1gM2ZCSd8IqjTG_KJmgPesbDMYqBIPHbSD6xmDkQ","refreshToken":"1502f1b45033285b84031830b05e32d0b502b0b032eb2e05ff5e89585edffbd30b484d3682fe5b21"}
1 change: 1 addition & 0 deletions allure-report/data/attachments/46f6d3e2ca54e5a8.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
WARNING selenium.webdriver.common.selenium_manager:selenium_manager.py:163 The geckodriver version (0.37.0) detected in PATH at D:\WebDriver\bin\geckodriver.exe might not be compatible with the detected firefox version (152.0.6); currently, geckodriver 0.37.1 is recommended for firefox 152.*, so it is advised to delete the driver in PATH and retry
1 change: 1 addition & 0 deletions allure-report/data/attachments/4802259c1454ec03.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
WARNING selenium.webdriver.common.selenium_manager:selenium_manager.py:163 The geckodriver version (0.37.0) detected in PATH at D:\WebDriver\bin\geckodriver.exe might not be compatible with the detected firefox version (152.0.6); currently, geckodriver 0.37.1 is recommended for firefox 152.*, so it is advised to delete the driver in PATH and retry
1 change: 1 addition & 0 deletions allure-report/data/attachments/4aaf6062f796eaad.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
WARNING selenium.webdriver.common.selenium_manager:selenium_manager.py:163 The geckodriver version (0.37.0) detected in PATH at D:\WebDriver\bin\geckodriver.exe might not be compatible with the detected firefox version (152.0.6); currently, geckodriver 0.37.1 is recommended for firefox 152.*, so it is advised to delete the driver in PATH and retry
1 change: 1 addition & 0 deletions allure-report/data/attachments/57226614c31c9af5.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
WARNING selenium.webdriver.common.selenium_manager:selenium_manager.py:163 The geckodriver version (0.37.0) detected in PATH at D:\WebDriver\bin\geckodriver.exe might not be compatible with the detected firefox version (152.0.6); currently, geckodriver 0.37.1 is recommended for firefox 152.*, so it is advised to delete the driver in PATH and retry
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions allure-report/data/attachments/8f347e27251f87c1.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
WARNING selenium.webdriver.common.selenium_manager:selenium_manager.py:163 The geckodriver version (0.37.0) detected in PATH at D:\WebDriver\bin\geckodriver.exe might not be compatible with the detected firefox version (152.0.6); currently, geckodriver 0.37.1 is recommended for firefox 152.*, so it is advised to delete the driver in PATH and retry
2 changes: 2 additions & 0 deletions allure-report/data/attachments/916164937ae66618.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
HTTP 202
{"success":true,"message":"User successfully removed"}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions allure-report/data/attachments/cbef4b378fda81f2.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
WARNING selenium.webdriver.common.selenium_manager:selenium_manager.py:163 The geckodriver version (0.37.0) detected in PATH at D:\WebDriver\bin\geckodriver.exe might not be compatible with the detected firefox version (152.0.6); currently, geckodriver 0.37.1 is recommended for firefox 152.*, so it is advised to delete the driver in PATH and retry
3 changes: 3 additions & 0 deletions allure-report/data/behaviors.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
"BROKEN","EPIC","FAILED","FEATURE","PASSED","SKIPPED","STORY","UNKNOWN"
"3","Stellar Burgers","0","Лента заказов","0","0","","0"
"0","Stellar Burgers","0","Основная функциональность","5","0","","0"
1 change: 1 addition & 0 deletions allure-report/data/behaviors.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"uid":"b1a8273437954620fa374b796ffaacdd","name":"behaviors","children":[{"name":"Stellar Burgers","children":[{"name":"Основная функциональность","children":[{"name":"Переход в Конструктор по клику","uid":"100111cadde840ab","parentUid":"19d08746b61ecaa10ce504ebac7051d9","status":"passed","time":{"start":1787939548519,"stop":1787939567573,"duration":19054},"flaky":false,"newFailed":false,"newPassed":false,"newBroken":false,"retriesCount":0,"retriesStatusChange":false,"parameters":[],"tags":["ui"]},{"name":"Переход в Ленту заказов по клику","uid":"445fc1b4e519e8e9","parentUid":"19d08746b61ecaa10ce504ebac7051d9","status":"passed","time":{"start":1787939571077,"stop":1787939576600,"duration":5523},"flaky":false,"newFailed":false,"newPassed":false,"newBroken":false,"retriesCount":0,"retriesStatusChange":false,"parameters":[],"tags":["ui"]},{"name":"Клик по ингредиенту открывает окно с деталями","uid":"b3e9867d4a84e4c","parentUid":"19d08746b61ecaa10ce504ebac7051d9","status":"passed","time":{"start":1787939579967,"stop":1787939585597,"duration":5630},"flaky":false,"newFailed":false,"newPassed":false,"newBroken":false,"retriesCount":0,"retriesStatusChange":false,"parameters":[],"tags":["ui"]},{"name":"Крестик закрывает окно с деталями ингредиента","uid":"cd81c6bade549f5","parentUid":"19d08746b61ecaa10ce504ebac7051d9","status":"passed","time":{"start":1787939589170,"stop":1787939595769,"duration":6599},"flaky":false,"newFailed":false,"newPassed":false,"newBroken":false,"retriesCount":0,"retriesStatusChange":false,"parameters":[],"tags":["ui"]},{"name":"После добавления ингредиента его счётчик увеличивается","uid":"ea7a3f27a8a3507f","parentUid":"19d08746b61ecaa10ce504ebac7051d9","status":"passed","time":{"start":1787939599156,"stop":1787939631539,"duration":32383},"flaky":false,"newFailed":false,"newPassed":false,"newBroken":false,"retriesCount":0,"retriesStatusChange":false,"parameters":[],"tags":["ui"]}],"uid":"19d08746b61ecaa10ce504ebac7051d9"},{"name":"Лента заказов","children":[{"name":"Новый заказ увеличивает счётчик за всё время","uid":"49525649b3c72d35","parentUid":"c32f8b51aaca4f56ebca8e1eef6859ce","status":"broken","time":{"start":1787939636145,"stop":1787939733520,"duration":97375},"flaky":false,"newFailed":false,"newPassed":false,"newBroken":false,"retriesCount":0,"retriesStatusChange":false,"parameters":[],"tags":["ui"]},{"name":"Новый заказ увеличивает счётчик за сегодня","uid":"22a1039dcceaf7b5","parentUid":"c32f8b51aaca4f56ebca8e1eef6859ce","status":"broken","time":{"start":1787939737144,"stop":1787939818780,"duration":81636},"flaky":false,"newFailed":false,"newPassed":false,"newBroken":false,"retriesCount":0,"retriesStatusChange":false,"parameters":[],"tags":["ui"]},{"name":"Номер нового заказа появляется в разделе В работе","uid":"7e3fdd33371fdc9a","parentUid":"c32f8b51aaca4f56ebca8e1eef6859ce","status":"broken","time":{"start":1787939822168,"stop":1787939879547,"duration":57379},"flaky":false,"newFailed":false,"newPassed":false,"newBroken":false,"retriesCount":0,"retriesStatusChange":false,"parameters":[],"tags":["ui"]}],"uid":"c32f8b51aaca4f56ebca8e1eef6859ce"}],"uid":"3ac5ed04dae1ef27cb363ce63c46d0f5"}]}
2 changes: 2 additions & 0 deletions allure-report/data/categories.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
"BROKEN","CATEGORY","FAILED","PASSED","SKIPPED","UNKNOWN"
"3","Test defects","0","0","0","0"
1 change: 1 addition & 0 deletions allure-report/data/categories.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"uid":"4b4757e66a1912dae1a509f688f20b0f","name":"categories","children":[{"name":"Test defects","children":[{"name":"selenium.common.exceptions.TimeoutException: Message:","children":[{"name":"Новый заказ увеличивает счётчик за всё время","uid":"49525649b3c72d35","parentUid":"31bb78a6a95ede3f78b260ed048910d8","status":"broken","time":{"start":1787939636145,"stop":1787939733520,"duration":97375},"flaky":false,"newFailed":false,"newPassed":false,"newBroken":false,"retriesCount":0,"retriesStatusChange":false,"parameters":[],"tags":["ui"]},{"name":"Новый заказ увеличивает счётчик за сегодня","uid":"22a1039dcceaf7b5","parentUid":"31bb78a6a95ede3f78b260ed048910d8","status":"broken","time":{"start":1787939737144,"stop":1787939818780,"duration":81636},"flaky":false,"newFailed":false,"newPassed":false,"newBroken":false,"retriesCount":0,"retriesStatusChange":false,"parameters":[],"tags":["ui"]},{"name":"Номер нового заказа появляется в разделе В работе","uid":"7e3fdd33371fdc9a","parentUid":"31bb78a6a95ede3f78b260ed048910d8","status":"broken","time":{"start":1787939822168,"stop":1787939879547,"duration":57379},"flaky":false,"newFailed":false,"newPassed":false,"newBroken":false,"retriesCount":0,"retriesStatusChange":false,"parameters":[],"tags":["ui"]}],"uid":"31bb78a6a95ede3f78b260ed048910d8"}],"uid":"bdbf199525818fae7a8651db9eafe741"}]}
1 change: 1 addition & 0 deletions allure-report/data/packages.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"uid":"83edc06c07f9ae9e47eb6dd1b683e4e2","name":"packages","children":[{"name":"tests.ui","children":[{"name":"test_main_functionality","children":[{"name":"Переход в Конструктор по клику","uid":"100111cadde840ab","parentUid":"ad1a5472d962e74ebbfaddc33202dd7b","status":"passed","time":{"start":1787939548519,"stop":1787939567573,"duration":19054},"flaky":false,"newFailed":false,"newPassed":false,"newBroken":false,"retriesCount":0,"retriesStatusChange":false,"parameters":[],"tags":["ui"]},{"name":"Переход в Ленту заказов по клику","uid":"445fc1b4e519e8e9","parentUid":"ad1a5472d962e74ebbfaddc33202dd7b","status":"passed","time":{"start":1787939571077,"stop":1787939576600,"duration":5523},"flaky":false,"newFailed":false,"newPassed":false,"newBroken":false,"retriesCount":0,"retriesStatusChange":false,"parameters":[],"tags":["ui"]},{"name":"Клик по ингредиенту открывает окно с деталями","uid":"b3e9867d4a84e4c","parentUid":"ad1a5472d962e74ebbfaddc33202dd7b","status":"passed","time":{"start":1787939579967,"stop":1787939585597,"duration":5630},"flaky":false,"newFailed":false,"newPassed":false,"newBroken":false,"retriesCount":0,"retriesStatusChange":false,"parameters":[],"tags":["ui"]},{"name":"Крестик закрывает окно с деталями ингредиента","uid":"cd81c6bade549f5","parentUid":"ad1a5472d962e74ebbfaddc33202dd7b","status":"passed","time":{"start":1787939589170,"stop":1787939595769,"duration":6599},"flaky":false,"newFailed":false,"newPassed":false,"newBroken":false,"retriesCount":0,"retriesStatusChange":false,"parameters":[],"tags":["ui"]},{"name":"После добавления ингредиента его счётчик увеличивается","uid":"ea7a3f27a8a3507f","parentUid":"ad1a5472d962e74ebbfaddc33202dd7b","status":"passed","time":{"start":1787939599156,"stop":1787939631539,"duration":32383},"flaky":false,"newFailed":false,"newPassed":false,"newBroken":false,"retriesCount":0,"retriesStatusChange":false,"parameters":[],"tags":["ui"]}],"uid":"ad1a5472d962e74ebbfaddc33202dd7b"},{"name":"test_order_feed","children":[{"name":"Новый заказ увеличивает счётчик за всё время","uid":"49525649b3c72d35","parentUid":"b76b920e89f13318eb15522aaea04e3b","status":"broken","time":{"start":1787939636145,"stop":1787939733520,"duration":97375},"flaky":false,"newFailed":false,"newPassed":false,"newBroken":false,"retriesCount":0,"retriesStatusChange":false,"parameters":[],"tags":["ui"]},{"name":"Новый заказ увеличивает счётчик за сегодня","uid":"22a1039dcceaf7b5","parentUid":"b76b920e89f13318eb15522aaea04e3b","status":"broken","time":{"start":1787939737144,"stop":1787939818780,"duration":81636},"flaky":false,"newFailed":false,"newPassed":false,"newBroken":false,"retriesCount":0,"retriesStatusChange":false,"parameters":[],"tags":["ui"]},{"name":"Номер нового заказа появляется в разделе В работе","uid":"7e3fdd33371fdc9a","parentUid":"b76b920e89f13318eb15522aaea04e3b","status":"broken","time":{"start":1787939822168,"stop":1787939879547,"duration":57379},"flaky":false,"newFailed":false,"newPassed":false,"newBroken":false,"retriesCount":0,"retriesStatusChange":false,"parameters":[],"tags":["ui"]}],"uid":"b76b920e89f13318eb15522aaea04e3b"}],"uid":"tests.ui"}]}
9 changes: 9 additions & 0 deletions allure-report/data/suites.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
"DESCRIPTION","DURATION IN MS","NAME","PARENT SUITE","START TIME","STATUS","STOP TIME","SUB SUITE","SUITE","TEST CLASS","TEST METHOD"
"","57379","Номер нового заказа появляется в разделе В работе","tests.ui","2026-08-28","broken","2026-08-28","TestOrderFeed","test_order_feed","",""
"","5630","Клик по ингредиенту открывает окно с деталями","tests.ui","2026-08-28","passed","2026-08-28","TestMainFunctionality","test_main_functionality","",""
"","19054","Переход в Конструктор по клику","tests.ui","2026-08-28","passed","2026-08-28","TestMainFunctionality","test_main_functionality","",""
"","5523","Переход в Ленту заказов по клику","tests.ui","2026-08-28","passed","2026-08-28","TestMainFunctionality","test_main_functionality","",""
"","97375","Новый заказ увеличивает счётчик за всё время","tests.ui","2026-08-28","broken","2026-08-28","TestOrderFeed","test_order_feed","",""
"","81636","Новый заказ увеличивает счётчик за сегодня","tests.ui","2026-08-28","broken","2026-08-28","TestOrderFeed","test_order_feed","",""
"","32383","После добавления ингредиента его счётчик увеличивается","tests.ui","2026-08-28","passed","2026-08-28","TestMainFunctionality","test_main_functionality","",""
"","6599","Крестик закрывает окно с деталями ингредиента","tests.ui","2026-08-28","passed","2026-08-28","TestMainFunctionality","test_main_functionality","",""
Loading