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
27 changes: 26 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,26 @@
# qa_python
# qa_python

## Описание тестов

В проекте проверяются методы класса `BooksCollector`.

### Тесты

- `test_add_new_book_add_two_books` — проверяет, что при добавлении двух книг в пустой `BooksCollector` их становится ровно две.
- `test_get_books_with_specific_genre` — проверяет, что метод `get_books_with_specific_genre("Фантастика")` возвращает только книгу `B1`.
- `test_get_books_with_specific_genre_returns_empty_for_unknown_genre` — проверяет, что неизвестный жанр возвращает пустой список.
- `test_add_new_book_param` — параметризованный тест проверяет добавление книги:
- обычное имя добавляет одну книгу;
- пустое имя не добавляет книгу;
- имя длиной более 40 символов не добавляет книгу.
- `test_new_book_has_no_genre` — проверяет, что новая книга без установки жанра возвращает пустую строку жанра.
- `test_age_rated_books_not_in_children` — проверяет, что книга жанра `Ужасы` не попадает в список `get_books_for_children()`.
- `test_add_book_in_favorites` — проверяет добавление книги в избранное.
- `test_delete_book_from_favorites` — проверяет удаление книги из избранного.
- `test_delete_non_favorite_book` — проверяет, что удаление книги, которая не была в избранном, не ломает список.

## Как запускать

```bash
pytest -q tests.py
```
4 changes: 4 additions & 0 deletions main.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,10 @@ def get_books_with_specific_genre(self, genre):
def get_books_genre(self):
return self.books_genre

# получаем словарь books_rating
def get_books_rating(self):
return self.books_genre

# возвращаем книги, подходящие детям
def get_books_for_children(self):
books_for_children = []
Expand Down
72 changes: 64 additions & 8 deletions tests.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,21 @@
import pytest
from main import BooksCollector

@pytest.fixture
def collector():
# новый экземпляр BooksCollector для каждого теста
return BooksCollector()

@pytest.fixture
def populated_collector():
# BooksCollector с заранее добавленными книгами и жанрами для тестов
c = BooksCollector()
c.add_new_book("B1")
c.add_new_book("B2")
c.set_book_genre("B1", "Фантастика")
c.set_book_genre("B2", "Ужасы")
return c

# класс TestBooksCollector объединяет набор тестов, которыми мы покрываем наше приложение BooksCollector
# обязательно указывать префикс Test
class TestBooksCollector:
Expand All @@ -8,17 +24,57 @@ class TestBooksCollector:
# обязательно указывать префикс test_
# дальше идет название метода, который тестируем add_new_book_
# затем, что тестируем add_two_books - добавление двух книг
def test_add_new_book_add_two_books(self):
# создаем экземпляр (объект) класса BooksCollector
collector = BooksCollector()

# добавляем две книги
def test_add_new_book_add_two_books(self, collector):
# проверка добавления двух книг в пустую коллекцию
collector.add_new_book('Гордость и предубеждение и зомби')
collector.add_new_book('Что делать, если ваш кот хочет вас убить')

# проверяем, что добавилось именно две
# словарь books_rating, который нам возвращает метод get_books_rating, имеет длину 2
# коллекция должна содержать именно две книги
assert len(collector.get_books_rating()) == 2

# напиши свои тесты ниже
# чтобы тесты были независимыми в каждом из них создавай отдельный экземпляр класса BooksCollector()
# чтобы тесты были независимыми в каждом из них создавай отдельный экземпляр класса BooksCollector()


def test_get_books_with_specific_genre(self, populated_collector):
# проверка, что метод возвращает книги только заданного жанра
assert populated_collector.get_books_with_specific_genre("Фантастика") == ["B1"]

def test_get_books_with_specific_genre_returns_empty_for_unknown_genre(self, populated_collector):
# если жанр не указан в списке разрешённых, метод должен вернуть пустой список
assert populated_collector.get_books_with_specific_genre("Романтика") == []

# параметризованный тест для разных вариантов названия книги
@pytest.mark.parametrize("name,expected_count", [
("Книга", 1),
("", 0),
("A" * 41, 0),
])
def test_add_new_book_param(self, collector, name, expected_count):
collector.add_new_book(name)
assert len(collector.get_books_rating()) == expected_count

def test_new_book_has_no_genre(self, collector):
# новая книга должна иметь пустой жанр до его установки
collector.add_new_book("New Book")
assert collector.get_book_genre("New Book") == ""

def test_age_rated_books_not_in_children(self, populated_collector):
# книги жанра "Ужасы" не должны попадать в детский список
assert "B2" not in populated_collector.get_books_for_children()

def test_add_book_in_favorites(self, populated_collector):
# проверка добавления книги в избранное
populated_collector.add_book_in_favorites("B1")
assert "B1" in populated_collector.get_list_of_favorites_books()

def test_delete_book_from_favorites(self, populated_collector):
# проверка удаления книги из избранного
populated_collector.add_book_in_favorites("B1")
populated_collector.delete_book_from_favorites("B1")
assert "B1" not in populated_collector.get_list_of_favorites_books()

def test_delete_non_favorite_book(self, populated_collector):
# при попытке удалить книгу, которой нет в избранном, список остаётся пустым
populated_collector.delete_book_from_favorites("B1")
assert "B1" not in populated_collector.get_list_of_favorites_books()