Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
venv/
__pycache__/
.pytest_cache/
.coverage
.idea/
.vscode/
.DS_Store
Thumbs.db
*.py[cod]
*.log
4 changes: 2 additions & 2 deletions burger.py
Original file line number Diff line number Diff line change
@@ -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:
Expand Down
6 changes: 3 additions & 3 deletions database.py
Original file line number Diff line number Diff line change
@@ -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:
Expand Down
67 changes: 67 additions & 0 deletions kriterii.txt
Original file line number Diff line number Diff line change
@@ -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
8 changes: 4 additions & 4 deletions praktikum.py
Original file line number Diff line number Diff line change
@@ -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():
Expand Down
7 changes: 7 additions & 0 deletions pytest.ini
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
[pytest]
testpaths = tests
addopts =
-v
--tb=short
--cov=burger
--cov-report=term-missing
2 changes: 2 additions & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
pytest==9.1.1
pytest-cov==7.1.0
Empty file added tests/__init__.py
Empty file.
177 changes: 177 additions & 0 deletions tests/test_burger.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,177 @@
"""Тесты для класса Burger."""

import pytest
from unittest.mock import Mock

from burger import Burger


class TestBurger:
"""Тесты для класса Burger."""

def test_set_buns_assigns_bun(self):
"""Проверка, что булочка устанавливается в поле bun."""
burger = Burger()
mock_bun = Mock()

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_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):
"""Проверка удаления ингредиента."""
burger = Burger()
mock_ingredient = Mock()
burger.add_ingredient(mock_ingredient)

burger.remove_ingredient(0)

assert len(burger.ingredients) == 0

def test_move_ingredient_first_to_second(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

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", [
(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_contains_bun(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

@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