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 @@
# Python
__pycache__/
*.pyc
*.pyo
*.pyd
*.env
*.venv

# VS Code
.vscode/
22 changes: 21 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,21 @@
# qa_python
# Sprint_4
# BooksCollector – Автотесты на pytest

## О проекте
Тестируем класс BooksCollector, который позволяет:

- Добавлять книги и присваивать им жанры.
- Получать книги по жанру или подходящие детям.
- Управлять списком избранного.

## Покрытые тесты
- Добавление книг (валидные и невалидные названия).
- Установка жанра книги (валидный и невалидный жанр).
- Получение книг по жанру.
- Книги для детей (без возрастного ограничения).
- Избранные книги: добавление, удаление, проверка на дубликаты.

## Запуск тестов
```bash
pip install pytest
pytest -v
90 changes: 73 additions & 17 deletions tests.py
Original file line number Diff line number Diff line change
@@ -1,24 +1,80 @@
import pytest
from main import BooksCollector

# класс TestBooksCollector объединяет набор тестов, которыми мы покрываем наше приложение BooksCollector
# обязательно указывать префикс Test

@pytest.fixture
def collector():
return BooksCollector()


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('Вокруг света за 80 дней')
collector.add_new_book('Десять негритят')
assert len(collector.get_books_genre()) == 2

@pytest.mark.parametrize("name", ["", "A" * 41])
def test_add_new_book_invalid_name(self, collector, name):
collector.add_new_book(name)
assert name not in collector.get_books_genre()

def test_set_book_genre_success(self, collector):
collector.add_new_book("Вокруг света за 80 дней")
collector.set_book_genre("Вокруг света за 80 дней", "Приключения")
assert collector.get_books_genre()["Вокруг света за 80 дней"] == "Приключения"
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Нужно исправить: для get_books_genre тоже нужна отдельная проверка


def test_get_book_genre(self, collector):
collector.add_new_book("Вокруг света за 80 дней")
collector.set_book_genre("Вокруг света за 80 дней", "Приключения")
assert collector.get_book_genre("Вокруг света за 80 дней") == "Приключения"
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Нужно исправить: для get_book_genre должен быть отдельный тест. Тесты не должны дублировать друг друга. В идеале - чтобы в каждом тесте использовался только один проверяемый метод, все остальное можно получить прямым доступом к словарям и спискам


def test_set_book_genre_invalid_genre(self, collector):
collector.add_new_book("Книга")
collector.set_book_genre("Книга", "Неизвестный жанр")
assert collector.get_book_genre("Книга") == ""

def test_get_books_with_specific_genre(self, collector):
collector.add_new_book("Вокруг света за 80 дней")
collector.set_book_genre("Вокруг света за 80 дней", "Приключения")
collector.add_new_book("Десять негритят")
collector.set_book_genre("Десять негритят", "Детективы")
assert collector.get_books_with_specific_genre("Приключения") == ["Вокруг света за 80 дней"]

def test_get_books_for_children(self, collector):
collector.add_new_book("Вокруг света за 80 дней")
collector.set_book_genre("Вокруг света за 80 дней", "Приключения")
collector.add_new_book("Десять негритят")
collector.set_book_genre("Десять негритят", "Детективы")
assert collector.get_books_for_children() == ["Вокруг света за 80 дней"]

def test_add_book_in_favorites_success(self, collector):
collector.add_new_book("Вокруг света за 80 дней")
collector.add_book_in_favorites("Вокруг света за 80 дней")
assert "Вокруг света за 80 дней" in collector.favorites

def test_get_list_of_favorites_books(self, collector):
collector.add_new_book("Вокруг света за 80 дней")
collector.add_book_in_favorites("Вокруг света за 80 дней")
assert collector.get_list_of_favorites_books() == ["Вокруг света за 80 дней"]

# добавляем две книги
collector.add_new_book('Гордость и предубеждение и зомби')
collector.add_new_book('Что делать, если ваш кот хочет вас убить')
def test_add_book_in_favorites_no_duplicates(self, collector):
collector.add_new_book("Вокруг света за 80 дней")
collector.add_book_in_favorites("Вокруг света за 80 дней")
collector.add_book_in_favorites("Вокруг света за 80 дней")
assert collector.get_list_of_favorites_books().count("Вокруг света за 80 дней") == 1

# проверяем, что добавилось именно две
# словарь books_rating, который нам возвращает метод get_books_rating, имеет длину 2
assert len(collector.get_books_rating()) == 2
def test_delete_book_from_favorites(self, collector):
collector.add_new_book("Вокруг света за 80 дней")
collector.add_book_in_favorites("Вокруг света за 80 дней")
collector.delete_book_from_favorites("Вокруг света за 80 дней")
assert "Вокруг света за 80 дней" not in collector.get_list_of_favorites_books()

# напиши свои тесты ниже
# чтобы тесты были независимыми в каждом из них создавай отдельный экземпляр класса BooksCollector()
def test_get_books_genre_returns_dict(self, collector):
collector.add_new_book("Вокруг света за 80 дней")
collector.add_new_book("Десять негритят")
expected = {
"Вокруг света за 80 дней": "",
"Десять негритят": ""
}
assert collector.get_books_genre() == expected