From b0f806ebe768a8f110067e3b73aeb6489164713f Mon Sep 17 00:00:00 2001 From: Dmitry Zyabikov Date: Thu, 27 Aug 2026 21:57:41 +0300 Subject: [PATCH 1/2] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20=D1=8E=D0=BD=D0=B8=D1=82-=D1=82=D0=B5=D1=81?= =?UTF-8?q?=D1=82=D1=8B=20=D0=B4=D0=BB=D1=8F=20=D0=BA=D0=BB=D0=B0=D1=81?= =?UTF-8?q?=D1=81=D0=B0=20Burger=20=D1=81=20=D0=BC=D0=BE=D0=BA=D0=B0=D0=BC?= =?UTF-8?q?=D0=B8=20=D0=B8=20=D0=BF=D0=B0=D1=80=D0=B0=D0=BC=D0=B5=D1=82?= =?UTF-8?q?=D1=80=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D0=B5=D0=B9.=20=D0=9F?= =?UTF-8?q?=D0=BE=D0=BA=D1=80=D1=8B=D1=82=D0=B8=D0=B5=20100%?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 10 +++++ burger.py | 4 +- database.py | 6 +-- praktikum.py | 8 ++-- pytest.ini | 7 +++ requirements.txt | 2 + tests/__init__.py | 0 tests/test_burger.py | 100 +++++++++++++++++++++++++++++++++++++++++++ 8 files changed, 128 insertions(+), 9 deletions(-) create mode 100644 .gitignore create mode 100644 pytest.ini create mode 100644 requirements.txt create mode 100644 tests/__init__.py create mode 100644 tests/test_burger.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..f958eaa59 --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +venv/ +__pycache__/ +.pytest_cache/ +.coverage +.idea/ +.vscode/ +.DS_Store +Thumbs.db +*.py[cod] +*.log \ No newline at end of file diff --git a/burger.py b/burger.py index 2b3b6a88b..3f71aaa29 100644 --- a/burger.py +++ b/burger.py @@ -1,7 +1,7 @@ from typing import List -from praktikum.bun import Bun -from praktikum.ingredient import Ingredient +from bun import Bun +from ingredient import Ingredient class Burger: diff --git a/database.py b/database.py index 4c75baf71..84d3685d0 100644 --- a/database.py +++ b/database.py @@ -1,8 +1,8 @@ from typing import List -from praktikum.bun import Bun -from praktikum.ingredient import Ingredient -from praktikum.ingredient_types import INGREDIENT_TYPE_SAUCE, INGREDIENT_TYPE_FILLING +from bun import Bun +from ingredient import Ingredient +from ingredient_types import INGREDIENT_TYPE_SAUCE, INGREDIENT_TYPE_FILLING class Database: diff --git a/praktikum.py b/praktikum.py index ec522fa6d..88b77abd1 100644 --- a/praktikum.py +++ b/praktikum.py @@ -1,9 +1,9 @@ from typing import List -from praktikum.bun import Bun -from praktikum.burger import Burger -from praktikum.database import Database -from praktikum.ingredient import Ingredient +from bun import Bun +from burger import Burger +from database import Database +from ingredient import Ingredient def main(): diff --git a/pytest.ini b/pytest.ini new file mode 100644 index 000000000..460a60079 --- /dev/null +++ b/pytest.ini @@ -0,0 +1,7 @@ +[pytest] +testpaths = tests +addopts = + -v + --tb=short + --cov=burger + --cov-report=term-missing \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 000000000..6f9c6069c --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +pytest==9.1.1 +pytest-cov==7.1.0 \ No newline at end of file diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/test_burger.py b/tests/test_burger.py new file mode 100644 index 000000000..8b18aaacc --- /dev/null +++ b/tests/test_burger.py @@ -0,0 +1,100 @@ +"""Тесты для класса Burger.""" + +import pytest +from unittest.mock import Mock + +from burger import Burger + + +class TestBurger: + """Тесты для класса Burger.""" + + def test_set_buns(self): + """Проверка установки булочки.""" + burger = Burger() + mock_bun = Mock() + mock_bun.get_name.return_value = "black bun" + mock_bun.get_price.return_value = 100.0 + + burger.set_buns(mock_bun) + + assert burger.bun == mock_bun + assert burger.bun.get_name() == "black bun" + assert burger.bun.get_price() == 100.0 + + def test_add_ingredient(self): + """Проверка добавления ингредиента.""" + burger = Burger() + mock_ingredient = Mock() + + burger.add_ingredient(mock_ingredient) + + assert len(burger.ingredients) == 1 + assert burger.ingredients[0] == mock_ingredient + + def test_remove_ingredient(self): + """Проверка удаления ингредиента.""" + burger = Burger() + mock_ingredient = Mock() + burger.add_ingredient(mock_ingredient) + + burger.remove_ingredient(0) + + assert len(burger.ingredients) == 0 + + def test_move_ingredient(self): + """Проверка перемещения ингредиента.""" + burger = Burger() + mock_1 = Mock() + mock_2 = Mock() + burger.add_ingredient(mock_1) + burger.add_ingredient(mock_2) + + burger.move_ingredient(0, 1) + + assert burger.ingredients[0] == mock_2 + assert burger.ingredients[1] == mock_1 + + @pytest.mark.parametrize("bun_price,ingredient_prices,expected", [ + (100.0, [], 200.0), + (100.0, [100.0], 300.0), + (200.0, [100.0, 200.0], 700.0), + (300.0, [100.0, 200.0, 300.0], 1200.0), + ]) + def test_get_price(self, bun_price, ingredient_prices, expected): + """Проверка расчёта цены бургера с параметризацией.""" + burger = Burger() + mock_bun = Mock() + mock_bun.get_price.return_value = bun_price + burger.set_buns(mock_bun) + + for price in ingredient_prices: + mock_ingredient = Mock() + mock_ingredient.get_price.return_value = price + burger.add_ingredient(mock_ingredient) + + assert burger.get_price() == expected + + @pytest.mark.parametrize("ingredient_type,ingredient_name,expected_line", [ + ("SAUCE", "hot sauce", "= sauce hot sauce ="), + ("FILLING", "cutlet", "= filling cutlet ="), + ]) + def test_get_receipt(self, ingredient_type, ingredient_name, expected_line): + """Проверка формирования чека с параметризацией.""" + burger = Burger() + mock_bun = Mock() + mock_bun.get_name.return_value = "black bun" + mock_bun.get_price.return_value = 100.0 + burger.set_buns(mock_bun) + + mock_ingredient = Mock() + mock_ingredient.get_type.return_value = ingredient_type + mock_ingredient.get_name.return_value = ingredient_name + mock_ingredient.get_price.return_value = 100.0 + burger.add_ingredient(mock_ingredient) + + receipt = burger.get_receipt() + + assert "(==== black bun ====)" in receipt + assert expected_line in receipt + assert "Price: 300.0" in receipt \ No newline at end of file From cd5ce88c9d54f7357043588819fe9ebb41f88d6e Mon Sep 17 00:00:00 2001 From: Dmitry Zyabikov Date: Fri, 28 Aug 2026 21:56:00 +0300 Subject: [PATCH 2/2] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=BF=D0=BE=20=D1=80=D0=B5=D0=B2=D1=8C=D1=8E:=20=D1=82=D0=B5?= =?UTF-8?q?=D1=81=D1=82=D1=8B=20set=5Fbuns,=20add=5Fingredient,=20move=5Fi?= =?UTF-8?q?ngredient,=20get=5Freceipt=20=D1=80=D0=B0=D0=B7=D0=B1=D0=B8?= =?UTF-8?q?=D1=82=D1=8B=20=D0=BD=D0=B0=20=D0=BE=D1=82=D0=B4=D0=B5=D0=BB?= =?UTF-8?q?=D1=8C=D0=BD=D1=8B=D0=B5=20=D1=82=D0=B5=D1=81=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kriterii.txt | 67 ++++++++++++++++++++++++++++++ tests/test_burger.py | 97 +++++++++++++++++++++++++++++++++++++++----- 2 files changed, 154 insertions(+), 10 deletions(-) create mode 100644 kriterii.txt diff --git a/kriterii.txt b/kriterii.txt new file mode 100644 index 000000000..2d7d409aa --- /dev/null +++ b/kriterii.txt @@ -0,0 +1,67 @@ +К р и т е р и и о ц е н к и +К а к б у д у т п р о в е р я т ь т в о й п р о е к т +На что обращают внимание ревьюеры, к огда проверяют т вой дипломный +проект. +Ю н и т - т е с т ы +Названия пак етов, файлов, классов, мет одов, тестов и переменных +корректные: соот ветствуют пр авилам, к оторые удалось из учить в курсе. +Тесты запускаются и не падают . +В тестах ест ь моки и пар аметризация. +Тесты независимы др уг от др уга. +Тесты не избыт очны. +В конце каждог о теста ест ь a s s e r t. +Тесты лежат в t e s t s. +Сделан отчёт в p y t e s t - c o v. Тестовое покрыт ие не ниж е 100%. Отчёт +добавлен в п ул-реквест . +В проект е нет ничег о лишнег о. Например, неиспольз уемых зависимост ей +в r e q u i r e m e n t s . t x t, неиспольз уемых импорт ов, закоммент ированных блок ов +кода, файлов наст роек IDE. Мо жешь оставлят ь комментарии, к оторые +объясняют т воё решения. Эт о не будет ошибк ой. +А в т о т е с т ы A P I +Названия пак етов, файлов, классов, мет одов, тестов и переменных — +корректные. +Для каждог о эндпоинта т есты лежат в отдельном классе. +Тесты запускаются и про ходят. +Написаны все т есты, указанные в задании. +Критерии оценки +1В тестах проверяет ся тело и код ответа. +Все тесты независимы. +Нужные т естовые данные создают ся перед т естом и удаляются после +того, как он выполнит ся. +Сделан Allur e-отчёт. Отчёт добавлен в п ул-реквест . +Тесты лежат в t e s t s. +В проект е нет ничег о лишнег о. Например, неиспольз уемых зависимост ей +в r e q u i r e m e n t s . t x t, неиспольз уемых импорт ов, закоммент ированных блок ов +кода, файлов наст роек IDE. Мо жешь оставлят ь комментарии, к оторые +объясняют т воё решения. Эт о не будет ошибк ой. +А в т о т е с т ы U I +Тесты лежат в t e s t s. +Для Page Object создан отдельный пак ет. +Для каждой ст раницы создан отдельный класс с Page Object. +Тесты разделены по т ематике или функциональност и. Для т естов созданы +отдельные классы. +Все элемент ы страниц, которые ты использ уешь в тестах, опис аны в Page +Object. +Название класс а Page Object от ражает ег о содер жимое. +Локаторы нах одятся в отдельном пак ете с файлами или ф айле. +Названия локат оров понят ны. +Тесты запускаются и не падают . +Тесты не зависят др уг от др уга. +Названия т естов понят ные и неизбыт очные. +Тест — пре жде всег о проверка, а не набор дейст вий. Каждый т ест что-то +проверяет . +Критерии оценки +2Нужные т естовые данные создают ся перед т естом и удаляются после +того, как он выполнит ся. +Если для т еста нуж ен тестовый юзер, он создаёт ся с помощью API. +Есть все тесты, которые опис аны в задании. +Сделан Allur e-отчёт. Отчёт добавлен в п ул-реквест . +В проект е нет ничег о лишнег о. Например, неиспольз уемых зависимост ей +в r e q u i r e m e n t s . t x t, неиспольз уемых импорт ов, закоммент ированных блок ов +кода, файлов наст роек IDE. Мо жешь оставлят ь комментарии, к оторые +объясняют т воё решения. Эт о не будет ошибк ой. +Выполнит ь диплом т ебе помог ут материалы, шпаргалки и к онспект ы курса по +тестированию. +Успехов! +Критерии оценки +3 \ No newline at end of file diff --git a/tests/test_burger.py b/tests/test_burger.py index 8b18aaacc..9bbde6a84 100644 --- a/tests/test_burger.py +++ b/tests/test_burger.py @@ -9,27 +9,51 @@ class TestBurger: """Тесты для класса Burger.""" - def test_set_buns(self): - """Проверка установки булочки.""" + def test_set_buns_assigns_bun(self): + """Проверка, что булочка устанавливается в поле bun.""" burger = Burger() mock_bun = Mock() - mock_bun.get_name.return_value = "black bun" - mock_bun.get_price.return_value = 100.0 burger.set_buns(mock_bun) assert burger.bun == mock_bun + + def test_set_buns_returns_name(self): + """Проверка, что метод get_name булочки возвращает корректное имя.""" + burger = Burger() + mock_bun = Mock() + mock_bun.get_name.return_value = "black bun" + + burger.set_buns(mock_bun) + assert burger.bun.get_name() == "black bun" + + def test_set_buns_returns_price(self): + """Проверка, что метод get_price булочки возвращает корректную цену.""" + burger = Burger() + mock_bun = Mock() + mock_bun.get_price.return_value = 100.0 + + burger.set_buns(mock_bun) + assert burger.bun.get_price() == 100.0 - def test_add_ingredient(self): - """Проверка добавления ингредиента.""" + def test_add_ingredient_increases_count(self): + """Проверка, что при добавлении ингредиента его количество увеличивается.""" burger = Burger() mock_ingredient = Mock() burger.add_ingredient(mock_ingredient) assert len(burger.ingredients) == 1 + + def test_add_ingredient_stores_value(self): + """Проверка, что добавленный ингредиент хранится в списке.""" + burger = Burger() + mock_ingredient = Mock() + + burger.add_ingredient(mock_ingredient) + assert burger.ingredients[0] == mock_ingredient def test_remove_ingredient(self): @@ -42,8 +66,8 @@ def test_remove_ingredient(self): assert len(burger.ingredients) == 0 - def test_move_ingredient(self): - """Проверка перемещения ингредиента.""" + def test_move_ingredient_first_to_second(self): + """Проверка, что первый ингредиент перемещается на позицию второго.""" burger = Burger() mock_1 = Mock() mock_2 = Mock() @@ -53,6 +77,17 @@ def test_move_ingredient(self): burger.move_ingredient(0, 1) assert burger.ingredients[0] == mock_2 + + def test_move_ingredient_second_to_first(self): + """Проверка, что второй ингредиент перемещается на позицию первого.""" + burger = Burger() + mock_1 = Mock() + mock_2 = Mock() + burger.add_ingredient(mock_1) + burger.add_ingredient(mock_2) + + burger.move_ingredient(0, 1) + assert burger.ingredients[1] == mock_1 @pytest.mark.parametrize("bun_price,ingredient_prices,expected", [ @@ -79,8 +114,8 @@ def test_get_price(self, bun_price, ingredient_prices, expected): ("SAUCE", "hot sauce", "= sauce hot sauce ="), ("FILLING", "cutlet", "= filling cutlet ="), ]) - def test_get_receipt(self, ingredient_type, ingredient_name, expected_line): - """Проверка формирования чека с параметризацией.""" + def test_get_receipt_contains_bun(self, ingredient_type, ingredient_name, expected_line): + """Проверка, что чек содержит название булочки.""" burger = Burger() mock_bun = Mock() mock_bun.get_name.return_value = "black bun" @@ -96,5 +131,47 @@ def test_get_receipt(self, ingredient_type, ingredient_name, expected_line): receipt = burger.get_receipt() assert "(==== black bun ====)" in receipt + + @pytest.mark.parametrize("ingredient_type,ingredient_name,expected_line", [ + ("SAUCE", "hot sauce", "= sauce hot sauce ="), + ("FILLING", "cutlet", "= filling cutlet ="), + ]) + def test_get_receipt_contains_ingredient(self, ingredient_type, ingredient_name, expected_line): + """Проверка, что чек содержит ингредиент.""" + burger = Burger() + mock_bun = Mock() + mock_bun.get_name.return_value = "black bun" + mock_bun.get_price.return_value = 100.0 + burger.set_buns(mock_bun) + + mock_ingredient = Mock() + mock_ingredient.get_type.return_value = ingredient_type + mock_ingredient.get_name.return_value = ingredient_name + mock_ingredient.get_price.return_value = 100.0 + burger.add_ingredient(mock_ingredient) + + receipt = burger.get_receipt() + assert expected_line in receipt + + @pytest.mark.parametrize("ingredient_type,ingredient_name,expected_line", [ + ("SAUCE", "hot sauce", "= sauce hot sauce ="), + ("FILLING", "cutlet", "= filling cutlet ="), + ]) + def test_get_receipt_contains_price(self, ingredient_type, ingredient_name, expected_line): + """Проверка, что чек содержит итоговую цену.""" + burger = Burger() + mock_bun = Mock() + mock_bun.get_name.return_value = "black bun" + mock_bun.get_price.return_value = 100.0 + burger.set_buns(mock_bun) + + mock_ingredient = Mock() + mock_ingredient.get_type.return_value = ingredient_type + mock_ingredient.get_name.return_value = ingredient_name + mock_ingredient.get_price.return_value = 100.0 + burger.add_ingredient(mock_ingredient) + + receipt = burger.get_receipt() + assert "Price: 300.0" in receipt \ No newline at end of file