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
14 changes: 14 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@

venv/
.env/
__pycache__/
*.py[cod]
*.pyo
*.pyd
.pytest_cache/
.coverage
htmlcov/
.idea/
.vscode/
.DS_Store
Thumbs.db
64 changes: 56 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,71 @@

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

В проекте реализованы юнит-тесты для программы, которая помогает заказать бургер в Stellar Burgers.

Тестами покрыт класс Burger из пакета praktikum.

🏁 Покрытие кода класса Burger — 100%
(HTML-отчёт: htmlcov/index.html)

### Реализованные сценарии
В проекте реализованы юнит-тесты для программы, которая помогает заказать бургер в Stellar Burgers.

Созданы юнит-тесты, покрывающие классы `Bun`, `Burger`, `Ingredient`, `Database`
Тестами покрыт класс Burger из пакета praktikum.

Процент покрытия 100% (отчет: `htmlcov/index.html`)
🏁 Покрытие кода класса Burger — 100%
HTML-отчёт: htmlcov/index.html

Проверены методы класса Burger:

set_buns
add_ingredient
remove_ingredient
move_ingredient
get_price
get_receipt

В тестах используются:
моки (unittest.mock) — для изоляции зависимостей (Bun, Ingredient)
параметризация (pytest.mark.parametrize)

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

- `praktikum` - пакет, содержащий код программы
- `tests` - пакет, содержащий тесты, разделенные по классам. Например, `bun_test.py`, `burger_test.py` и т.д.
Используемые библиотеки :

### Запуск автотестов
pytest
pytest-cov
### Структура проекта
Diplom_1
├── praktikum
│ ├── __init__.py
│ ├── bun.py
│ ├── burger.py
│ ├── database.py
│ ├── ingredient.py
│ └── ingredient_types.py
├── tests
│ └── test_burger.py
├── pytest.ini
├── requirements.txt
└── README.md
└── .gitignore

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

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

**Запуск автотестов и создание HTML-отчета о покрытии**

> `$ pytest --cov=praktikum --cov-report=html`
> python -m pytest tests -q

Покрытие проверяется для класса Burger:

> python -m pytest tests --cov=praktikum.burger --cov-report=term-missing

HTML-отчёт можно получить командой:

> python -m pytest tests --cov=praktikum.burger --cov-report=html

Отчёт будет доступен в папке:

> htmlcov/index.html
41 changes: 0 additions & 41 deletions praktikum.py

This file was deleted.

File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
3 changes: 3 additions & 0 deletions pytest.ini
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[pytest]
pythonpath = .
testpaths = tests
98 changes: 98 additions & 0 deletions tests/test_burger.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
import pytest
from unittest.mock import Mock

from praktikum.burger import Burger


@pytest.fixture
def burger():
return Burger()


@pytest.fixture
def bun():
bun = Mock()
bun.get_name.return_value = "black bun"
bun.get_price.return_value = 100
return bun


@pytest.fixture
def ingredient_sauce():
ing = Mock()
ing.get_type.return_value = "SAUCE"
ing.get_name.return_value = "hot sauce"
ing.get_price.return_value = 50
return ing


@pytest.fixture
def ingredient_filling():
ing = Mock()
ing.get_type.return_value = "FILLING"
ing.get_name.return_value = "cutlet"
ing.get_price.return_value = 200
return ing


def test_set_buns_sets_bun(burger, bun):
burger.set_buns(bun)
assert burger.bun == bun


@pytest.mark.parametrize("count", [1, 2, 3])
def test_add_ingredient_appends_to_list(burger, ingredient_sauce, count):
for _ in range(count):
burger.add_ingredient(ingredient_sauce)
assert len(burger.ingredients) == count
assert burger.ingredients[-1] == ingredient_sauce


def test_remove_ingredient_deletes_by_index(burger, ingredient_sauce, ingredient_filling):
burger.add_ingredient(ingredient_sauce)
burger.add_ingredient(ingredient_filling)

burger.remove_ingredient(0)

assert burger.ingredients == [ingredient_filling]


def test_move_ingredient_changes_order(burger, ingredient_sauce, ingredient_filling):
burger.add_ingredient(ingredient_sauce)
burger.add_ingredient(ingredient_filling)

burger.move_ingredient(0, 1)

assert burger.ingredients == [ingredient_filling, ingredient_sauce]


def test_get_price_counts_bun_twice_and_ingredients(burger, bun, ingredient_sauce, ingredient_filling):
burger.set_buns(bun)
burger.add_ingredient(ingredient_sauce)
burger.add_ingredient(ingredient_filling)

assert burger.get_price() == 100 * 2 + 50 + 200
bun.get_price.assert_called()
ingredient_sauce.get_price.assert_called()
ingredient_filling.get_price.assert_called()


def test_get_price_with_no_ingredients(burger, bun):
burger.set_buns(bun)
assert burger.get_price() == 100 * 2


def test_get_receipt_format_and_content(burger, bun, ingredient_sauce, ingredient_filling):
burger.set_buns(bun)
burger.add_ingredient(ingredient_sauce)
burger.add_ingredient(ingredient_filling)

receipt = burger.get_receipt()

assert f"(==== {bun.get_name()} ====)" in receipt
assert f"(==== {bun.get_name()} ====)\n" in receipt

assert f"= sauce {ingredient_sauce.get_name()} =" in receipt
assert f"= filling {ingredient_filling.get_name()} =" in receipt

assert f"Price: {burger.get_price()}" in receipt