diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f21eeb6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +# Python +__pycache__/ +*.pyc +*.pyo +*.pyd +*.env +*.venv + +# VS Code +.vscode/ diff --git a/README.md b/README.md index 1cc701d..9557513 100644 --- a/README.md +++ b/README.md @@ -1 +1,21 @@ -# qa_python \ No newline at end of file +# Sprint_4 +# BooksCollector – Автотесты на pytest + +## О проекте +Тестируем класс BooksCollector, который позволяет: + +- Добавлять книги и присваивать им жанры. +- Получать книги по жанру или подходящие детям. +- Управлять списком избранного. + +## Покрытые тесты +- Добавление книг (валидные и невалидные названия). +- Установка жанра книги (валидный и невалидный жанр). +- Получение книг по жанру. +- Книги для детей (без возрастного ограничения). +- Избранные книги: добавление, удаление, проверка на дубликаты. + +## Запуск тестов +```bash +pip install pytest +pytest -v \ No newline at end of file diff --git a/tests.py b/tests.py index 383385e..05522a2 100644 --- a/tests.py +++ b/tests.py @@ -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 дней"] == "Приключения" + + def test_get_book_genre(self, collector): + collector.add_new_book("Вокруг света за 80 дней") + collector.set_book_genre("Вокруг света за 80 дней", "Приключения") + assert collector.get_book_genre("Вокруг света за 80 дней") == "Приключения" + + 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() \ No newline at end of file + 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