From 31b1744a84bcde97a0e69d87216695a9a0bf3f17 Mon Sep 17 00:00:00 2001 From: Galina Date: Thu, 4 Sep 2025 22:28:54 +0300 Subject: [PATCH 1/4] =?UTF-8?q?Sprint=5F4=20=20=D0=B2=D1=8B=D0=BF=D0=BE?= =?UTF-8?q?=D0=BB=D0=BD=D0=B5=D0=BD=D0=BE=20=D0=B7=D0=B0=D0=B4=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 22 ++++++++++++++++- tests.py | 71 +++++++++++++++++++++++++++++++++++++++++++------------ 2 files changed, 77 insertions(+), 16 deletions(-) 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..20092ad 100644 --- a/tests.py +++ b/tests.py @@ -1,24 +1,65 @@ +import pytest from main import BooksCollector -# класс TestBooksCollector объединяет набор тестов, которыми мы покрываем наше приложение BooksCollector -# обязательно указывать префикс Test + class TestBooksCollector: - # пример теста: - # обязательно указывать префикс test_ - # дальше идет название метода, который тестируем add_new_book_ - # затем, что тестируем add_two_books - добавление двух книг def test_add_new_book_add_two_books(self): - # создаем экземпляр (объект) класса BooksCollector collector = BooksCollector() + 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, name): + collector = BooksCollector() + collector.add_new_book(name) + assert name not in collector.get_books_genre() + + def test_set_book_genre_success(self): + collector = BooksCollector() + 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 = BooksCollector() + collector.add_new_book("Книга") + collector.set_book_genre("Книга", "Неизвестный жанр") + assert collector.get_book_genre("Книга") == "" - # добавляем две книги - collector.add_new_book('Гордость и предубеждение и зомби') - collector.add_new_book('Что делать, если ваш кот хочет вас убить') + def test_get_books_with_specific_genre(self): + collector = BooksCollector() + 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 = BooksCollector() + 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 дней"] - # проверяем, что добавилось именно две - # словарь books_rating, который нам возвращает метод get_books_rating, имеет длину 2 - assert len(collector.get_books_rating()) == 2 + def test_add_book_in_favorites_success(self): + collector = BooksCollector() + collector.add_new_book("Вокруг света за 80 дней") + collector.add_book_in_favorites("Вокруг света за 80 дней") + assert "Вокруг света за 80 дней" in collector.get_list_of_favorites_books() - # напиши свои тесты ниже - # чтобы тесты были независимыми в каждом из них создавай отдельный экземпляр класса BooksCollector() \ No newline at end of file + def test_add_book_in_favorites_no_duplicates(self): + collector = BooksCollector() + 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 + + def test_delete_book_from_favorites(self): + collector = BooksCollector() + 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() \ No newline at end of file From e6ba6450882ef83ccf1e1d50881f0297b9d47312 Mon Sep 17 00:00:00 2001 From: Galina Date: Thu, 4 Sep 2025 22:34:21 +0300 Subject: [PATCH 2/4] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20.gitignore?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 .gitignore 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/ From a579072f08fa6481f695db5ac8cb0fa595a8d2db Mon Sep 17 00:00:00 2001 From: Galina Date: Sat, 6 Sep 2025 13:45:43 +0300 Subject: [PATCH 3/4] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D1=82=D0=B5=D1=81=D1=82=D1=8B:=20=D1=84?= =?UTF-8?q?=D0=B8=D0=BA=D1=81=D1=82=D1=83=D1=80=D0=B0,=20=D1=80=D0=B0?= =?UTF-8?q?=D0=B7=D0=B4=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B=D0=B5=20=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B8=20=D0=B4=D0=BB=D1=8F=20get?= =?UTF-8?q?=5Fbook=5Fgenre=20=D0=B8=20get=5Flist=5Fof=5Ffavorites=5Fbooks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests.py | 47 +++++++++++++++++++++++++++-------------------- 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/tests.py b/tests.py index 20092ad..ff2217f 100644 --- a/tests.py +++ b/tests.py @@ -2,64 +2,71 @@ from main import BooksCollector +@pytest.fixture +def collector(): + return BooksCollector() + + class TestBooksCollector: - def test_add_new_book_add_two_books(self): - 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, name): - collector = BooksCollector() + 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 = BooksCollector() + def test_set_book_genre_success(self, collector): + collector.add_new_book("Вокруг света за 80 дней") + collector.set_book_genre("Вокруг света за 80 дней", "Приключения") + # проверяем напрямую словарь, а не через get_book_genre + 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 = BooksCollector() + 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 = BooksCollector() + 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 = BooksCollector() + 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 = BooksCollector() + 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 "Вокруг света за 80 дней" in collector.get_list_of_favorites_books() + assert collector.get_list_of_favorites_books() == ["Вокруг света за 80 дней"] - def test_add_book_in_favorites_no_duplicates(self): - collector = BooksCollector() + 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 - def test_delete_book_from_favorites(self): - collector = BooksCollector() + 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() \ No newline at end of file + assert "Вокруг света за 80 дней" not in collector.get_list_of_favorites_books() From e2de5d39fc0aa118e9ac5e409cfb2848b4b81e88 Mon Sep 17 00:00:00 2001 From: Galina Date: Sun, 7 Sep 2025 15:53:43 +0300 Subject: [PATCH 4/4] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20=D1=82=D0=B5=D1=81=D1=82=20=D0=B4=D0=BB=D1=8F=20get=5F?= =?UTF-8?q?books=5Fgenre?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/tests.py b/tests.py index ff2217f..05522a2 100644 --- a/tests.py +++ b/tests.py @@ -22,7 +22,6 @@ def test_add_new_book_invalid_name(self, collector, name): def test_set_book_genre_success(self, collector): collector.add_new_book("Вокруг света за 80 дней") collector.set_book_genre("Вокруг света за 80 дней", "Приключения") - # проверяем напрямую словарь, а не через get_book_genre assert collector.get_books_genre()["Вокруг света за 80 дней"] == "Приключения" def test_get_book_genre(self, collector): @@ -52,7 +51,7 @@ def test_get_books_for_children(self, collector): 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 # проверяем напрямую список + assert "Вокруг света за 80 дней" in collector.favorites def test_get_list_of_favorites_books(self, collector): collector.add_new_book("Вокруг света за 80 дней") @@ -70,3 +69,12 @@ def test_delete_book_from_favorites(self, collector): collector.add_book_in_favorites("Вокруг света за 80 дней") collector.delete_book_from_favorites("Вокруг света за 80 дней") assert "Вокруг света за 80 дней" not in collector.get_list_of_favorites_books() + + 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