diff --git a/.coverage b/.coverage new file mode 100644 index 000000000..dc5f8cbbb Binary files /dev/null and b/.coverage differ diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..1b9416895 --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +venv/ +env/ +ENV/ +.venv/ + +*.pyc +*.pyo +*.pyd +*.pyc +__pycache__/ +.python-version + + +.cache/ +*.swp +*.swo +.idea/ + +.pytest_cache \ No newline at end of file diff --git a/README.md b/README.md index 272081708..26c401a87 100644 --- a/README.md +++ b/README.md @@ -1,24 +1,52 @@ ## Задание 1: Юнит-тесты +
+ +## Студент: Самигуллин Эмиль + +## Когорта: 33 +
### Автотесты для проверки программы, которая помогает заказать бургер в 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 \ No newline at end of file diff --git a/__init__.py b/Tests/__init__.py similarity index 100% rename from __init__.py rename to Tests/__init__.py diff --git a/Tests/__pycache__/__init__.cpython-313.pyc b/Tests/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 000000000..33671ced4 Binary files /dev/null and b/Tests/__pycache__/__init__.cpython-313.pyc differ diff --git a/Tests/__pycache__/test_burger.cpython-313-pytest-8.4.2.pyc b/Tests/__pycache__/test_burger.cpython-313-pytest-8.4.2.pyc new file mode 100644 index 000000000..477cac82a Binary files /dev/null and b/Tests/__pycache__/test_burger.cpython-313-pytest-8.4.2.pyc differ diff --git a/Tests/__pycache__/test_burger.cpython-313-pytest-9.0.2.pyc b/Tests/__pycache__/test_burger.cpython-313-pytest-9.0.2.pyc new file mode 100644 index 000000000..477cac82a Binary files /dev/null and b/Tests/__pycache__/test_burger.cpython-313-pytest-9.0.2.pyc differ diff --git a/Tests/test_burger.py b/Tests/test_burger.py new file mode 100644 index 000000000..f6c1501fb --- /dev/null +++ b/Tests/test_burger.py @@ -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 \ No newline at end of file diff --git a/__pycache__/conftest.cpython-313-pytest-8.4.2.pyc b/__pycache__/conftest.cpython-313-pytest-8.4.2.pyc new file mode 100644 index 000000000..f81b09ed3 Binary files /dev/null and b/__pycache__/conftest.cpython-313-pytest-8.4.2.pyc differ diff --git a/__pycache__/conftest.cpython-313-pytest-9.0.2.pyc b/__pycache__/conftest.cpython-313-pytest-9.0.2.pyc new file mode 100644 index 000000000..f81b09ed3 Binary files /dev/null and b/__pycache__/conftest.cpython-313-pytest-9.0.2.pyc differ diff --git a/__pycache__/data.cpython-313.pyc b/__pycache__/data.cpython-313.pyc new file mode 100644 index 000000000..6b7da0755 Binary files /dev/null and b/__pycache__/data.cpython-313.pyc differ diff --git a/conftest.py b/conftest.py new file mode 100644 index 000000000..9c9372aef --- /dev/null +++ b/conftest.py @@ -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 + } \ No newline at end of file diff --git a/data.py b/data.py new file mode 100644 index 000000000..d658f6358 --- /dev/null +++ b/data.py @@ -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)] \ No newline at end of file diff --git a/praktikum/__init__.py b/praktikum/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/praktikum/__pycache__/__init__.cpython-313.pyc b/praktikum/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 000000000..296e4edbc Binary files /dev/null and b/praktikum/__pycache__/__init__.cpython-313.pyc differ diff --git a/praktikum/__pycache__/bun.cpython-313.pyc b/praktikum/__pycache__/bun.cpython-313.pyc new file mode 100644 index 000000000..c1dd3a838 Binary files /dev/null and b/praktikum/__pycache__/bun.cpython-313.pyc differ diff --git a/praktikum/__pycache__/burger.cpython-313.pyc b/praktikum/__pycache__/burger.cpython-313.pyc new file mode 100644 index 000000000..39c713f48 Binary files /dev/null and b/praktikum/__pycache__/burger.cpython-313.pyc differ diff --git a/praktikum/__pycache__/ingredient.cpython-313.pyc b/praktikum/__pycache__/ingredient.cpython-313.pyc new file mode 100644 index 000000000..ddc6abaa4 Binary files /dev/null and b/praktikum/__pycache__/ingredient.cpython-313.pyc differ diff --git a/bun.py b/praktikum/bun.py similarity index 100% rename from bun.py rename to praktikum/bun.py diff --git a/burger.py b/praktikum/burger.py similarity index 100% rename from burger.py rename to praktikum/burger.py diff --git a/database.py b/praktikum/database.py similarity index 100% rename from database.py rename to praktikum/database.py diff --git a/ingredient.py b/praktikum/ingredient.py similarity index 100% rename from ingredient.py rename to praktikum/ingredient.py diff --git a/ingredient_types.py b/praktikum/ingredient_types.py similarity index 100% rename from ingredient_types.py rename to praktikum/ingredient_types.py diff --git a/praktikum.py b/praktikum/praktikum.py similarity index 100% rename from praktikum.py rename to praktikum/praktikum.py diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 000000000..9572c0a48 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,4 @@ +pytest==8.2.2 +pytest-cov==5.0.0 +allure-pytest==2.13.5 +coverage==7.5.3