diff --git a/.coverage b/.coverage new file mode 100644 index 000000000..738a18d31 Binary files /dev/null and b/.coverage differ diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..080556996 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +__pycache__/ +tests/__pycache__ +tests/.pytest_cache +.pytest_cache +*.py[cod] diff --git a/README.md b/README.md index 272081708..e2a977b9f 100644 --- a/README.md +++ b/README.md @@ -1,24 +1,12 @@ -## Задание 1: Юнит-тесты +Тесты для покрытия функциональности Burger: +1) test_set_bun - проверяет добавление булочек +2) test_move_bun_success - проверяет замену одного вида булочки на другой +3) test_add_ingredient_success - проверяет добавление ингредиентов +4) test_remove_ingredients_success - проверяет удаление ингредиентов +5) test_move_ingredients_success - проверяет перемещение ингредиентов +6) test_addtwo_move_one_ingredients_success - проверяет добавление двух и удаление одного из добавленных ингредиентов +7) test_burger_get_price_success - проверяет получения цены +8) test_get_receipt - проверяет получение чека + +с 1 по 6 тест выполнены с помощью парамертизации, 7-8 - с использованием моков -### Автотесты для проверки программы, которая помогает заказать бургер в Stellar Burgers - -### Реализованные сценарии - -Созданы юнит-тесты, покрывающие классы `Bun`, `Burger`, `Ingredient`, `Database` - -Процент покрытия 100% (отчет: `htmlcov/index.html`) - -### Структура проекта - -- `praktikum` - пакет, содержащий код программы -- `tests` - пакет, содержащий тесты, разделенные по классам. Например, `bun_test.py`, `burger_test.py` и т.д. - -### Запуск автотестов - -**Установка зависимостей** - -> `$ pip install -r requirements.txt` - -**Запуск автотестов и создание HTML-отчета о покрытии** - -> `$ pytest --cov=praktikum --cov-report=html` 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/conftest.py b/conftest.py new file mode 100644 index 000000000..e22687639 --- /dev/null +++ b/conftest.py @@ -0,0 +1,12 @@ +import sys +import os +sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +import pytest +from data import * + +@pytest.fixture() +def bunsandOtherIngredients(): + buns = BunsandOtherIngredients.mock_buns + ingredients = BunsandOtherIngredients.mock_ingredients + return[buns, ingredients] diff --git a/data.py b/data.py new file mode 100644 index 000000000..27728cf81 --- /dev/null +++ b/data.py @@ -0,0 +1,52 @@ +from unittest.mock import Mock + + +class BunsandOtherIngredients: + """Добавление моков булочек""" + mock_buns=[] + mock_bun1=Mock() + mock_bun1.get_name.return_value ="red bun" + mock_bun1.get_price.return_value =300.0 + mock_bun2=Mock() + mock_bun2.get_name.return_value ="black bun" + mock_bun2.get_price.return_value =100.0 + mock_bun3=Mock() + mock_bun3.get_name.return_value ="white bun" + mock_bun3.get_price.return_value =200.0 + mock_buns.append(mock_bun1) + mock_buns.append(mock_bun2) + mock_buns.append(mock_bun3) + + """Добавление моков ингредиентов""" + mock_ingredients=[] + mock_ingredient1=Mock() + mock_ingredient1.get_name.return_value ="sour cream" + mock_ingredient1.get_price.return_value =200.0 + mock_ingredient1.get_type.return_value ='SAUCE' + mock_ingredient2=Mock() + mock_ingredient2.get_name.return_value ="sausage" + mock_ingredient2.get_price.return_value =300.0 + mock_ingredient2.get_type.return_value ='FILLING' + mock_ingredient3=Mock() + mock_ingredient3.get_name.return_value ="dinosaur" + mock_ingredient3.get_price.return_value =200.0 + mock_ingredient3.get_type.return_value ='FILLING' + mock_ingredients.append(mock_ingredient1) + mock_ingredients.append(mock_ingredient2) + mock_ingredients.append(mock_ingredient3) + + """Вывод сформированного рецепта для 1 булки и 1 ингредиента""" + @staticmethod + def get_receipt(bun, ingredient): + receipt = f'(==== {bun.get_name()} ====)\n' + receipt += f'= {str(ingredient.get_type()).lower()} {ingredient.get_name()} =\n' + receipt += f'(==== {bun.get_name()} ====)\n\n' + receipt += f'Price: {bun.get_price() *2+ingredient.get_price()}' + return receipt + + +class TestData: + buns_available=[["black bun", 100], ["white bun", 200], ["red bun", 300]] + ingredients_available=[["SAUCE", "hot sauce", 100], ["SAUCE", "sour cream", 200], ["SAUCE", "chili sauce", 300], + ["FILLING", "cutlet", 100], ["FILLING", "dinosaur", 200], ["FILLING", "sausage", 300]] + 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/requirements.txt b/requirements.txt new file mode 100644 index 000000000..6238571c5 Binary files /dev/null and b/requirements.txt differ diff --git a/tests/.coverage b/tests/.coverage new file mode 100644 index 000000000..47b233d46 Binary files /dev/null and b/tests/.coverage differ 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..6606238da --- /dev/null +++ b/tests/test_burger.py @@ -0,0 +1,85 @@ +import sys +import os +sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) +from conftest import bunsandOtherIngredients +import pytest +from data import * +from burger import Burger +from bun import Bun + +class TestBurger: + + """Добавление булочек""" + @pytest.mark.parametrize("buns", TestData.buns_available) + def test_set_bun_success(self, buns): + burger = Burger() + burger.set_buns(buns) + assert burger.bun ==buns + + + """Замена булочек""" + @pytest.mark.parametrize("buns", TestData.buns_available) + def test_move_bun_success(self, buns): + burger = Burger() + burger.set_buns(buns[0]) + burger.set_buns(buns[1]) + assert burger.bun ==buns[1] + + """Добавление ингредиентов""" + @pytest.mark.parametrize("ingredient", TestData.ingredients_available) + def test_add_ingredient_success(self, ingredient): + burger = Burger() + burger.add_ingredient(ingredient) + assert len(burger.ingredients) == 1 + + """Удаление ингредиентов""" + @pytest.mark.parametrize("ingredient", TestData.ingredients_available) + def test_remove_ingredients_success(self, ingredient): + burger = Burger() + burger.add_ingredient(ingredient) + burger.remove_ingredient(0) + assert burger.ingredients ==[] and ingredient not in burger.ingredients + + """Перемещение ингредиентов""" + @pytest.mark.parametrize("ingredient_indices", [(0, 5)]) + def test_move_ingredients_success(self, ingredient_indices): + burger = Burger() + ingredient1=TestData.ingredients_available[ingredient_indices[0]] + ingredient2=TestData.ingredients_available[ingredient_indices[1]] + burger.add_ingredient(ingredient1) + burger.add_ingredient(ingredient2) + burger.move_ingredient(0, 1) + assert burger.ingredients[0] == ingredient2 and burger.ingredients[1] ==ingredient1 + + """Добавление нескольких ингредиентов и удаление одного из них""" + @pytest.mark.parametrize("ingredient_indices", [(0, 5)]) + def test_addtwo_move_one_ingredients_success(self, ingredient_indices): + burger = Burger() + ingredient1=TestData.ingredients_available[ingredient_indices[0]] + ingredient2=TestData.ingredients_available[ingredient_indices[1]] + burger.add_ingredient(ingredient1) + burger.add_ingredient(ingredient2) + burger.remove_ingredient(0) + assert burger.ingredients[0] == ingredient2 and len(burger.ingredients) ==1 + + """Получение цены бургера""" + @pytest.mark.parametrize('id_item', [0, 1]) + def test_burger_get_price_success(self, id_item, bunsandOtherIngredients): + burger = Burger() + burger.set_buns(bunsandOtherIngredients[0][id_item]) + burger.add_ingredient(bunsandOtherIngredients[1][id_item]) + assert burger.get_price() ==(bunsandOtherIngredients[0][id_item].get_price()*2+bunsandOtherIngredients[1][id_item].get_price()) + + """Получение чека""" + @pytest.mark.parametrize('id_item', [0, 1]) + def test_get_receipt(self, id_item, bunsandOtherIngredients): + burger = Burger() + burger.set_buns(bunsandOtherIngredients[0][id_item]) + burger.add_ingredient(bunsandOtherIngredients[1][id_item]) + + expected_receipt = BunsandOtherIngredients.get_receipt( + bunsandOtherIngredients[0][id_item], + bunsandOtherIngredients[1][id_item] + ) + + assert burger.get_receipt() == expected_receipt