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
Binary file added .coverage
Binary file not shown.
19 changes: 19 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
venv/
env/
ENV/
.venv/

*.pyc
*.pyo
*.pyd
*.pyc
__pycache__/
.python-version


.cache/
*.swp
*.swo
.idea/

.pytest_cache
38 changes: 33 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,24 +1,52 @@
## Задание 1: Юнит-тесты
<hr>

## Студент: Самигуллин Эмиль

## <h>Когорта: 33</h>
<hr>

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

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

Созданы юнит-тесты, покрывающие классы `Bun`, `Burger`, `Ingredient`, `Database`
Созданы юнит-тесты, покрывающие класс `Burger`
#Только бургеры, так как требования изменились

Процент покрытия 100% (отчет: `htmlcov/index.html`)

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

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

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

#### `test_set_buns`
Проверяет, что можно установить булочку для бургера.

#### `test_add_ingredient` (параметризованный)
Проверяет, что ингредиент (соус или начинка) корректно добавляется в список.

### Запуск автотестов
#### `test_remove_ingredient`
Проверяет, что ингредиент удаляется по индексу.

#### `test_move_ingredient`
Проверяет, что ингредиент можно переместить на новую позицию.

#### `test_get_price` (параметризованный)
Проверяет правильность расчёта общей стоимости бургера.
Формула: `2 * цена булочки + сумма цен ингредиентов`.

#### `test_get_receipt`
Проверяет формат чека, который выводится при оформлении заказа.

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

> `$ pip install -r requirements.txt`

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

> `pytest Tests/test_burger.py -v`
> `$ pytest --cov=praktikum --cov-report=html`
# Можно запускать вместе, но обычно это избыточно
pytest --cov=praktikum --cov-report=html --alluredir=allure-results
File renamed without changes.
Binary file added Tests/__pycache__/__init__.cpython-313.pyc
Binary file not shown.
Binary file not shown.
Binary file not shown.
74 changes: 74 additions & 0 deletions Tests/test_burger.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
import pytest
from unittest.mock import Mock

from praktikum.burger import Burger

from data import TEST_BUN, TEST_SAUCE, TEST_FILLING, PRICE_TEST_CASE


class TestBurger:
def test_set_buns(self, mock_bun):
burger = Burger()
burger.set_buns(mock_bun)
assert burger.bun == mock_bun

@pytest.mark.parametrize("ingredient_type", [TEST_SAUCE["type"], TEST_FILLING["type"]])
def test_add_ingredient(self, ingredient_type, mock_ingredients):
burger = Burger()
ingredient = mock_ingredients[ingredient_type]

burger.add_ingredient(ingredient)

assert len(burger.ingredients) == 1
assert burger.ingredients[0] == ingredient

def test_remove_ingredient(self, mock_sauce, mock_filling):
burger = Burger()
burger.add_ingredient(mock_sauce)
burger.add_ingredient(mock_filling)
burger.remove_ingredient(0)
assert burger.ingredients == [mock_filling]

def test_move_ingredient(self, mock_sauce, mock_filling):
burger = Burger()
burger.add_ingredient(mock_sauce)
burger.add_ingredient(mock_filling)
burger.move_ingredient(0, 1)
assert burger.ingredients == [mock_filling, mock_sauce]

@pytest.mark.parametrize(
"bun_price, ing1_price, ing2_price, expected_price",
PRICE_TEST_CASE
)
def test_get_price(self, bun_price, ing1_price, ing2_price, expected_price, mock_bun):
mock_bun.get_price.return_value = bun_price

ingredient_1 = Mock()
ingredient_1.get_price.return_value = ing1_price

ingredient_2 = Mock()
ingredient_2.get_price.return_value = ing2_price

burger = Burger()
burger.set_buns(mock_bun)
burger.add_ingredient(ingredient_1)
burger.add_ingredient(ingredient_2)

assert burger.get_price() == expected_price

def test_get_receipt(self, mock_bun, mock_sauce, mock_filling):
burger = Burger()
burger.set_buns(mock_bun)
burger.add_ingredient(mock_sauce)
burger.add_ingredient(mock_filling)

expected_receipt = (
f"(==== {TEST_BUN['name']} ====)\n"
f"= {TEST_SAUCE['type'].lower()} {TEST_SAUCE['name']} =\n"
f"= {TEST_FILLING['type'].lower()} {TEST_FILLING['name']} =\n"
f"(==== {TEST_BUN['name']} ====)\n"
f"\n"
f"Price: {burger.get_price()}"
)

assert burger.get_receipt() == expected_receipt
Binary file added __pycache__/conftest.cpython-313-pytest-8.4.2.pyc
Binary file not shown.
Binary file added __pycache__/conftest.cpython-313-pytest-9.0.2.pyc
Binary file not shown.
Binary file added __pycache__/data.cpython-313.pyc
Binary file not shown.
37 changes: 37 additions & 0 deletions conftest.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import pytest
from unittest.mock import Mock
from data import TEST_BUN, TEST_SAUCE, TEST_FILLING


@pytest.fixture
def mock_bun():
mock = Mock()
mock.get_name.return_value = TEST_BUN["name"]
mock.get_price.return_value = TEST_BUN["price"]
return mock


@pytest.fixture
def mock_sauce():
mock = Mock()
mock.get_type.return_value = TEST_SAUCE["type"]
mock.get_name.return_value = TEST_SAUCE["name"]
mock.get_price.return_value = TEST_SAUCE["price"]
return mock


@pytest.fixture
def mock_filling():
mock = Mock()
mock.get_type.return_value = TEST_FILLING["type"]
mock.get_name.return_value = TEST_FILLING["name"]
mock.get_price.return_value = TEST_FILLING["price"]
return mock


@pytest.fixture
def mock_ingredients(mock_sauce, mock_filling):
return {
TEST_SAUCE["type"]: mock_sauce,
TEST_FILLING["type"]: mock_filling
}
7 changes: 7 additions & 0 deletions data.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# Общие тестовые данные
TEST_BUN = {"name": "purple bun", "price": 10}
TEST_SAUCE = {"type": "SAUCE", "name": "Sriracha sauce", "price": 10}
TEST_FILLING = {"type": "FILLING", "name": "lettuce", "price": 10}

# Расчёт цены
PRICE_TEST_CASE = [(10, 10, 10, 40)]
Empty file added praktikum/__init__.py
Empty file.
Binary file added praktikum/__pycache__/__init__.cpython-313.pyc
Binary file not shown.
Binary file added praktikum/__pycache__/bun.cpython-313.pyc
Binary file not shown.
Binary file added praktikum/__pycache__/burger.cpython-313.pyc
Binary file not shown.
Binary file added praktikum/__pycache__/ingredient.cpython-313.pyc
Binary file not shown.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
4 changes: 4 additions & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
pytest==8.2.2
pytest-cov==5.0.0
allure-pytest==2.13.5
coverage==7.5.3