From 05b22ae720486b0ca2739508431d0bd5ae3ac592 Mon Sep 17 00:00:00 2001 From: tim Date: Wed, 10 Jun 2026 21:20:19 +0500 Subject: [PATCH] Update README, main.py, and tests.py --- README.md | 27 ++++++++++++++++++++- main.py | 4 ++++ tests.py | 72 ++++++++++++++++++++++++++++++++++++++++++++++++------- 3 files changed, 94 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 1cc701d..906dd25 100644 --- a/README.md +++ b/README.md @@ -1 +1,26 @@ -# qa_python \ No newline at end of file +# 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 +``` diff --git a/main.py b/main.py index d3e0a17..bf2836f 100644 --- a/main.py +++ b/main.py @@ -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 = [] diff --git a/tests.py b/tests.py index 383385e..c48e89b 100644 --- a/tests.py +++ b/tests.py @@ -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: @@ -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() \ No newline at end of file + # чтобы тесты были независимыми в каждом из них создавай отдельный экземпляр класса 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() \ No newline at end of file