diff --git a/.coverage b/.coverage new file mode 100644 index 000000000..cd506489b Binary files /dev/null and b/.coverage differ diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..17ce44f8c --- /dev/null +++ b/.gitignore @@ -0,0 +1,12 @@ +.pytest_cache/ +.DS_Store +target/allure-results/ +target/allure-report/ +__pycache__/ +*.py[cod] +*$py.class +venv/ +.venv/ +env/ +.idea/ +.vscode/* \ No newline at end of file diff --git a/README.md b/README.md index 272081708..c96e2b97d 100644 --- a/README.md +++ b/README.md @@ -1,24 +1,22 @@ ## Задание 1: Юнит-тесты -### Автотесты для проверки программы, которая помогает заказать бургер в Stellar Burgers +# Автотесты для проверки программы, которая помогает заказать бургер в Stellar Burgers -### Реализованные сценарии +## Реализованные сценарии Созданы юнит-тесты, покрывающие классы `Bun`, `Burger`, `Ingredient`, `Database` -Процент покрытия 100% (отчет: `htmlcov/index.html`) +Процент покрытия 94% (отчет: `htmlcov/index.html`) -### Структура проекта +## Структура проекта: +* `praktikum` - пакет, содержащий код программы; +* `tests/` — тестовые модули; +* `conftest.py` — фикстуры; +* `.gitignore` — список игнорируемых файлов; +* `README.md` — описание проекта. -- `praktikum` - пакет, содержащий код программы -- `tests` - пакет, содержащий тесты, разделенные по классам. Например, `bun_test.py`, `burger_test.py` и т.д. - -### Запуск автотестов - -**Установка зависимостей** - -> `$ pip install -r requirements.txt` - -**Запуск автотестов и создание HTML-отчета о покрытии** - -> `$ pytest --cov=praktikum --cov-report=html` +## Написаны тесты на функциональность: +* покрытие класса `Bun` модуль test_bun.py; +* покрытие класса `Ingredient` модуль test_ingredient.py; +* покрытие класса `Database` модуль test_database.py; +* покрытие класса `Burger` модуль test_burger.py. \ No newline at end of file diff --git a/conftest.py b/conftest.py new file mode 100644 index 000000000..8f27fe49c --- /dev/null +++ b/conftest.py @@ -0,0 +1,20 @@ +import pytest +from unittest.mock import Mock +from praktikum.bun import Bun +from praktikum.ingredient import Ingredient + + +@pytest.fixture +def bun_mock(): + mock = Mock(Bun) + mock.get_name.return_value = "Флюоресцентная булка R2-D3" + mock.get_price.return_value = 988 + return mock + +@pytest.fixture +def ingredient_mock(): + mock = Mock(Ingredient) + mock.get_name.return_value = "Хрустящие минеральные кольца" + mock.get_price.return_value = 300 + mock.get_type.return_value = "FILLING" + return mock diff --git a/__init__.py b/main.py similarity index 100% rename from __init__.py rename to main.py diff --git a/praktikum/__init__.py b/praktikum/__init__.py new file mode 100644 index 000000000..e69de29bb 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/requirements.txt b/requirements.txt new file mode 100644 index 000000000..e366e2ba7 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,27 @@ +allure-pytest==2.15.3 +allure-python-commons==2.15.3 +attrs==25.4.0 +certifi==2026.2.25 +charset-normalizer==3.4.7 +coverage==7.13.4 +Faker==40.11.0 +h11==0.16.0 +idna==3.11 +iniconfig==2.3.0 +outcome==1.3.0.post0 +packaging==26.0 +pluggy==1.6.0 +Pygments==2.19.2 +PySocks==1.7.1 +pytest==9.0.2 +pytest-cov==7.0.0 +requests==2.33.1 +selenium==4.41.0 +sniffio==1.3.1 +sortedcontainers==2.4.0 +trio==0.33.0 +trio-websocket==0.12.2 +typing_extensions==4.15.0 +urllib3==2.6.3 +websocket-client==1.9.0 +wsproto==1.3.2 diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/test_bun.py b/tests/test_bun.py new file mode 100644 index 000000000..99d9b2dba --- /dev/null +++ b/tests/test_bun.py @@ -0,0 +1,11 @@ +from praktikum.bun import Bun + +class TestBun: + + def test_bun_get_name_returns_correct_name(self): + bun = Bun("Краторная булка Н-200и", 1255) + assert bun.get_name() == "Краторная булка Н-200и" + + def test_bun_get_price_returns_correct_price(self): + bun = Bun("Краторная булка Н-200и", 1255) + assert bun.get_price() == 1255 \ No newline at end of file diff --git a/tests/test_burger.py b/tests/test_burger.py new file mode 100644 index 000000000..deaba163c --- /dev/null +++ b/tests/test_burger.py @@ -0,0 +1,10 @@ +from praktikum.burger import Burger + +class TestBurger: + + def test_get_price_burger(self, bun_mock, ingredient_mock): + burger = Burger() + burger.set_buns(bun_mock) + burger.add_ingredient(ingredient_mock) + expected_price = (bun_mock.get_price() * 2) + ingredient_mock.get_price() + assert burger.get_price() == expected_price diff --git a/tests/test_database.py b/tests/test_database.py new file mode 100644 index 000000000..5ebce8e12 --- /dev/null +++ b/tests/test_database.py @@ -0,0 +1,18 @@ +from praktikum.database import Database +from praktikum.bun import Bun +from praktikum.ingredient import Ingredient +from praktikum.ingredient_types import INGREDIENT_TYPE_SAUCE, INGREDIENT_TYPE_FILLING + +class TestDatabase: + + def test_available_buns(self): + database = Database() + database.buns = [Bun("black bun", 100)] + list = database.available_buns() + assert list[0].get_name() == "black bun" + + def test_available_ingredients(self): + database = Database() + database.ingredient = [Ingredient(INGREDIENT_TYPE_SAUCE, "hot sauce", 100)] + list = database.available_ingredients() + assert list[0].get_name() == "hot sauce" diff --git a/tests/test_ingredient.py b/tests/test_ingredient.py new file mode 100644 index 000000000..ffb088837 --- /dev/null +++ b/tests/test_ingredient.py @@ -0,0 +1,15 @@ +from praktikum.ingredient import Ingredient + +class TestIngredient: + + def test_ingredient_get_name_returns_correct_name(self): + ingredient = Ingredient('SAUCE', 'Соус с шипами Антарианского плоскоходца', 88) + assert ingredient.get_name() == 'Соус с шипами Антарианского плоскоходца' + + def test_ingredient_get_price_returns_correct_price(self): + ingredient = Ingredient('SAUCE', 'Соус с шипами Антарианского плоскоходца', 88) + assert ingredient.get_price() == 88 + + def test_ingredient_get_type_returns_correct_type(self): + ingredient = Ingredient('SAUCE', 'Соус с шипами Антарианского плоскоходца', 88) + assert ingredient.get_type() == 'SAUCE' \ No newline at end of file