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
25 changes: 25 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
__pycache__/
*.py[cod]
*.pyo
*.pyd
*.pytest_cache/
.pytest_cache/
*.egg-info/
dist/
build/
venv/
env/
.venv/
.idea/
.vscode/
*.swp
*.swo
.DS_Store
*.log
selenium-screenshots/
screenshots/
videos/
.cache/
htmlcov/
.coverage
coverage.xml
69 changes: 56 additions & 13 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,24 +1,67 @@
## Задание 1: Юнит-тесты
# Задание 1. Юнит-тесты
## Автотесты для проверки программы, которая помогает заказать бургер в Stellar Burgers
### Реализованные сценарии

### Автотесты для проверки программы, которая помогает заказать бургер в Stellar Burgers
Разработаны юнит-тесты для следующих классов:
- `Bun`
- `Burger`
- `Ingredient`
- `Database`

### Реализованные сценарии
Использованы:
- `pytest`
- параметризация (`pytest.mark.parametrize`)
- моки (`unittest.mock`)

Процент покрытия кода — **78%**.

HTML-отчет о покрытии можно сгенерировать командой:

```bash
python3 -m pytest --cov=praktikum --cov-report=html
```

## Структура проекта

```text
praktikum/
bun.py
burger.py
database.py
ingredient.py
ingredient_types.py
praktikum.py

tests/
conftest.py
test_bun.py
test_burger.py
test_database.py
test_ingredient.py
```

Созданы юнит-тесты, покрывающие классы `Bun`, `Burger`, `Ingredient`, `Database`
## Установка зависимостей

Процент покрытия 100% (отчет: `htmlcov/index.html`)
```bash
pip install -r requirements.txt
```

### Структура проекта
## Запуск тестов

- `praktikum` - пакет, содержащий код программы
- `tests` - пакет, содержащий тесты, разделенные по классам. Например, `bun_test.py`, `burger_test.py` и т.д.
```bash
python3 -m pytest
```

### Запуск автотестов
## Запуск тестов с отчетом о покрытии

**Установка зависимостей**
Отчет в консоли:

> `$ pip install -r requirements.txt`
```bash
python3 -m pytest --cov=praktikum --cov-report=term-missing
```

**Запуск автотестов и создание HTML-отчета о покрытии**
HTML-отчет:

> `$ pytest --cov=praktikum --cov-report=html`
```bash
python3 -m pytest --cov=praktikum --cov-report=html
```
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
2 changes: 0 additions & 2 deletions praktikum.py → praktikum/praktikum.py
Original file line number Diff line number Diff line change
@@ -1,11 +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


def main():
# Инициализируем базу данных
database: Database = Database()
Expand Down
3 changes: 3 additions & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
pytest==9.0.2
pytest-cov==7.1.0
allure-pytest==2.16.0
24 changes: 24 additions & 0 deletions tests/conftest.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import pytest
from praktikum.bun import Bun
from praktikum.ingredient import Ingredient
from praktikum.burger import Burger
from praktikum.ingredient_types import (
INGREDIENT_TYPE_SAUCE,
INGREDIENT_TYPE_FILLING
)

@pytest.fixture
def bun():
return Bun("white bun", 200)

@pytest.fixture
def sauce():
return Ingredient(INGREDIENT_TYPE_SAUCE, "hot sauce", 100)

@pytest.fixture
def filling():
return Ingredient(INGREDIENT_TYPE_FILLING, "cutlet", 300)

@pytest.fixture
def burger():
return Burger()
28 changes: 28 additions & 0 deletions tests/test_bun.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import pytest
from praktikum.bun import Bun

class TestBun:
@pytest.mark.parametrize(
"name",
[
"white bun",
"black bun",
"red bun"
]
)
def test_get_name(self, name):
bun = Bun(name, 200)
assert bun.get_name() == name

@pytest.mark.parametrize(
"price",
[
100,
200,
300
]
)
def test_get_price(self, price):
bun = Bun("white bun", price)
assert bun.get_price() == price

55 changes: 55 additions & 0 deletions tests/test_burger.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
from unittest.mock import Mock

class TestBurger:
def test_set_bun(self, burger):
bun = Mock()
burger.set_buns(bun)
assert burger.bun == bun

def test_add_ingredient(self,burger, sauce):
burger.add_ingredient(sauce)
assert sauce in burger.ingredients

def test_remove_ingredient(self, burger, sauce, filling):
burger.add_ingredient(sauce)
burger.add_ingredient(filling)
burger.remove_ingredient(0)
assert burger.ingredients == [filling]

def test_move_ingredient(self, burger, sauce, filling):
burger.add_ingredient(sauce)
burger.add_ingredient(filling)
burger.move_ingredient(0, 1)
assert burger.ingredients == [filling, sauce]

def test_get_price(self, burger):
bun = Mock()
bun.get_price.return_value = 200
ingredient_1 = Mock()
ingredient_1.get_price.return_value = 100

ingredient_2 = Mock()
ingredient_2.get_price.return_value = 300
burger.set_buns(bun)
burger.add_ingredient(ingredient_1)
burger.add_ingredient(ingredient_2)
assert burger.get_price() == 800

def test_get_receipt(self, burger):
bun = Mock()
bun.get_name.return_value = "white bun"
bun.get_price.return_value = 200

ingredient = Mock()
ingredient.get_type.return_value = "SAUCE"
ingredient.get_name.return_value = "hot sauce"
ingredient.get_price.return_value = 100
burger.set_buns(bun)
burger.add_ingredient(ingredient)
expected = (
"(==== white bun ====)\n"
"= sauce hot sauce =\n"
"(==== white bun ====)\n\n"
"Price: 500"
)
assert burger.get_receipt() == expected
14 changes: 14 additions & 0 deletions tests/test_database.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
from praktikum.database import Database

class TestDatabase:
def test_database_contains_buns(self):
database = Database()
buns = database.available_buns()
assert len(buns) == 3
assert buns[0].get_name() == "black bun"

def test_database_contains_ingredients(self):
database = Database()
ingredients = database.available_ingredients()
assert len(ingredients) == 6
assert ingredients[0].get_name() == "hot sauce"
41 changes: 41 additions & 0 deletions tests/test_ingredient.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import pytest
from praktikum.ingredient import Ingredient
from praktikum.ingredient_types import (
INGREDIENT_TYPE_FILLING,
INGREDIENT_TYPE_SAUCE
)

class TestIngredient:
@pytest.mark.parametrize(
"ingredient_type",
[
INGREDIENT_TYPE_SAUCE,
INGREDIENT_TYPE_FILLING,
]
)
def test_get_type(self, ingredient_type):
ingredient = Ingredient(ingredient_type, "test", 100)
assert ingredient.get_type() == ingredient_type

@pytest.mark.parametrize(
"name",
[
"hot sauce",
"cutlet"
]
)
def test_get_name(self, name):
ingredient = Ingredient(INGREDIENT_TYPE_SAUCE, name, 100)
assert ingredient.get_name() == name

@pytest.mark.parametrize(
"price",
[
100,
300
]
)
def test_get_price(self, price):
ingredient = Ingredient(INGREDIENT_TYPE_SAUCE, "test", price)
assert ingredient.get_price() == price