-
Notifications
You must be signed in to change notification settings - Fork 1.1k
добавляю первое задание второй части диплома #635
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,40 @@ | ||
| # Python | ||
| __pycache__/ | ||
| *.py[cod] | ||
| *$py.class | ||
| *.so | ||
| .Python | ||
| build/ | ||
| develop-eggs/ | ||
| dist/ | ||
| downloads/ | ||
| eggs/ | ||
| .eggs/ | ||
| lib/ | ||
| lib64/ | ||
| parts/ | ||
| sdist/ | ||
| var/ | ||
| wheels/ | ||
| *.egg-info/ | ||
| .installed.cfg | ||
| *.egg | ||
| MANIFEST | ||
|
|
||
| # pytest | ||
| .pytest_cache/ | ||
| .coverage | ||
| htmlcov/ | ||
|
|
||
| # VS Code | ||
| .vscode/ | ||
| *.swp | ||
| *.swo | ||
|
|
||
| # OS | ||
| .DS_Store | ||
| Thumbs.db | ||
|
|
||
| # Temporary files | ||
| *.tmp | ||
| *.temp |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,58 @@ | ||
| """ | ||
| Общие фикстуры для всех тестов | ||
| """ | ||
| import pytest | ||
| from unittest.mock import Mock | ||
| import sys | ||
| import os | ||
|
|
||
| # Добавляем текущую директорию в путь для импортов | ||
| sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) | ||
|
|
||
| @pytest.fixture | ||
| def bun(): | ||
| """Фикстура для создания булочки""" | ||
| from bun import Bun | ||
| return Bun("Краторная булочка", 100.0) | ||
|
|
||
|
|
||
| @pytest.fixture | ||
| def mock_bun(): | ||
| """Фикстура для мока булочки""" | ||
| mock = Mock() | ||
| mock.get_price.return_value = 100 | ||
| mock.get_name.return_value = "test bun" | ||
| return mock | ||
|
|
||
|
|
||
| @pytest.fixture | ||
| def ingredient(): | ||
| """Фикстура для создания ингредиента""" | ||
| from ingredient import Ingredient | ||
| from ingredient_types import INGREDIENT_TYPE_SAUCE | ||
| return Ingredient(INGREDIENT_TYPE_SAUCE, "hot sauce", 100.0) | ||
|
|
||
|
|
||
| @pytest.fixture | ||
| def mock_ingredient(): | ||
| """Фикстура для мока ингредиента""" | ||
| from ingredient_types import INGREDIENT_TYPE_SAUCE | ||
| mock = Mock() | ||
| mock.get_price.return_value = 50 | ||
| mock.get_name.return_value = "test ingredient" | ||
| mock.get_type.return_value = INGREDIENT_TYPE_SAUCE | ||
| return mock | ||
|
|
||
|
|
||
| @pytest.fixture | ||
| def burger(): | ||
| """Фикстура для создания бургера""" | ||
| from burger import Burger | ||
| return Burger() | ||
|
|
||
|
|
||
| @pytest.fixture | ||
| def database(): | ||
| """Фикстура для создания базы данных""" | ||
| from database import Database | ||
| return Database() | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,38 @@ | ||
| import pytest | ||
| import sys | ||
| import os | ||
|
|
||
| # Добавляем путь к корню проекта | ||
| sys.path.append(os.path.dirname(os.path.dirname(__file__))) | ||
|
|
||
|
|
||
| class TestBun: | ||
| """Тесты для класса Bun""" | ||
|
|
||
| def test_bun_name_initialization(self, bun): | ||
| """Только инициализация имени""" | ||
| assert bun.name == "Краторная булочка" | ||
|
|
||
| def test_bun_price_initialization(self, bun): | ||
| """Только инициализация цены""" | ||
| assert bun.price == 100.0 | ||
|
|
||
| def test_bun_get_name(self, bun): | ||
| """Только получение названия""" | ||
| assert bun.get_name() == "Краторная булочка" | ||
|
|
||
| def test_bun_get_price(self, bun): | ||
| """Только получение цены""" | ||
| assert bun.get_price() == 100.0 | ||
|
|
||
| @pytest.mark.parametrize("name, price", [ | ||
| ("Булочка 1", 50.0), | ||
| ("Булочка 2", 150.5), | ||
| ("С кунжутом", 75.25), | ||
| ]) | ||
| def test_bun_different_parameters(self, name, price): | ||
| """Тестируем разные параметры""" | ||
| from bun import Bun | ||
| bun = Bun(name, price) | ||
| assert bun.get_name() == name | ||
| assert bun.get_price() == price |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,94 @@ | ||
| import pytest | ||
| from unittest.mock import Mock, patch | ||
| import sys | ||
| import os | ||
|
|
||
| sys.path.append(os.path.dirname(os.path.dirname(__file__))) | ||
|
|
||
| from burger import Burger | ||
| from bun import Bun | ||
| from ingredient import Ingredient | ||
| from ingredient_types import INGREDIENT_TYPE_SAUCE, INGREDIENT_TYPE_FILLING | ||
|
|
||
| @pytest.fixture | ||
| def burger(): | ||
| """Создает новый бургер для каждого теста""" | ||
| return Burger() | ||
|
|
||
| @pytest.fixture | ||
| def mock_bun(): | ||
| """Создает мок булочки""" | ||
| mock = Mock() | ||
| mock.get_price.return_value = 100 | ||
| mock.get_name.return_value = "test bun" | ||
| return mock | ||
|
|
||
| @pytest.fixture | ||
| def mock_ingredient(): | ||
| """Создает мок ингредиента""" | ||
| mock = Mock() | ||
| mock.get_price.return_value = 50 | ||
| mock.get_name.return_value = "test ingredient" | ||
| mock.get_type.return_value = INGREDIENT_TYPE_SAUCE | ||
| return mock | ||
|
Comment on lines
+13
to
+33
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Необходимо исправить здесь и далее: фикстуры стоит вынести к остальным в модуль conftest There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. А тут фикстуры все еще в теле теста, дублируют те что уже есть в conftest. От этих можно избавиться |
||
|
|
||
| class TestBurger: | ||
| """Тесты для класса Burger""" | ||
|
|
||
| def test_burger_initialization(self, burger): | ||
| """ТЕСТ 1: Только инициализация""" | ||
| assert burger.bun is None | ||
| assert burger.ingredients == [] | ||
|
|
||
| def test_set_buns(self, burger, mock_bun): | ||
| """ТЕСТ 2: Только установка булочки""" | ||
| burger.set_buns(mock_bun) | ||
| assert burger.bun == mock_bun | ||
|
|
||
| def test_add_ingredient(self, burger, mock_ingredient): | ||
| """ТЕСТ 3: Только добавление ингредиента""" | ||
| burger.add_ingredient(mock_ingredient) | ||
| assert len(burger.ingredients) == 1 | ||
| assert burger.ingredients[0] == mock_ingredient | ||
|
|
||
| def test_remove_ingredient(self, burger, mock_ingredient): | ||
| """ТЕСТ 4: Только удаление ингредиента""" | ||
| burger.add_ingredient(mock_ingredient) | ||
| burger.remove_ingredient(0) | ||
| assert len(burger.ingredients) == 0 | ||
|
|
||
| def test_move_ingredient(self, burger): | ||
| """ТЕСТ 5: Только перемещение ингредиента""" | ||
| mock1, mock2, mock3 = Mock(), Mock(), Mock() | ||
| burger.ingredients = [mock1, mock2, mock3] | ||
|
|
||
| burger.move_ingredient(2, 1) | ||
| assert burger.ingredients == [mock1, mock3, mock2] | ||
|
|
||
| def test_get_price(self, burger, mock_bun): | ||
| """ТЕСТ 6: Только расчет цены""" | ||
| burger.set_buns(mock_bun) | ||
|
|
||
| mock_ingredient = Mock() | ||
| mock_ingredient.get_price.return_value = 50 | ||
| burger.ingredients = [mock_ingredient] | ||
|
|
||
| assert burger.get_price() == 250 # 2*100 + 50 | ||
|
|
||
| def test_get_receipt(self, burger, mock_bun): | ||
| """ТЕСТ 7: Формирование чека""" | ||
| burger.set_buns(mock_bun) | ||
| mock_ingredient = Mock() | ||
| mock_ingredient.get_type.return_value = INGREDIENT_TYPE_SAUCE | ||
| mock_ingredient.get_name.return_value = "test sauce" | ||
| mock_ingredient.get_price.return_value = 50 | ||
| burger.ingredients = [mock_ingredient] | ||
|
|
||
| receipt = burger.get_receipt() | ||
| # ИСПРАВЛЕНИЕ: заменили "in" на полное сравнение строки | ||
| expected_receipt = """(==== test bun ====) | ||
| = sauce test sauce = | ||
| (==== test bun ====) | ||
|
|
||
| Price: 250""" | ||
| assert receipt == expected_receipt | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,40 @@ | ||
| import pytest | ||
| import sys | ||
| import os | ||
|
|
||
| sys.path.append(os.path.dirname(os.path.dirname(__file__))) | ||
|
|
||
| from database import Database | ||
|
|
||
|
|
||
| @pytest.fixture | ||
| def database(): | ||
| """Фикстура для создания базы данных""" | ||
| return Database() | ||
|
|
||
|
|
||
| class TestDatabase: | ||
| """Тесты для класса Database""" | ||
|
|
||
| def test_database_initialization(self, database): | ||
| """Только инициализация""" | ||
| buns = database.available_buns() | ||
| ingredients = database.available_ingredients() | ||
|
|
||
| assert len(buns) == 3 | ||
| assert len(ingredients) == 6 | ||
|
|
||
| def test_available_buns(self, database): | ||
| """Только получение булочек""" | ||
| buns = database.available_buns() | ||
|
|
||
| assert len(buns) == 3 | ||
| # ИСПРАВЛЕНИЕ: заменили "in" на точное сравнение | ||
| bun_names = [bun.get_name() for bun in buns] | ||
| assert bun_names == ["black bun", "white bun", "red bun"] | ||
|
|
||
| def test_available_ingredients(self, database): | ||
| """Только получение ингредиентов""" | ||
| ingredients = database.available_ingredients() | ||
|
|
||
| assert len(ingredients) == 6 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Можно лучше здесь и далее: лучше выносить тестовые данные во внешний модуль (например, data). Это позволит облегчить их поддержку