From 8a07e36fd6a0c66fa28ce13d554f35f57e409b30 Mon Sep 17 00:00:00 2001 From: Bulat Gabaev Date: Sun, 12 Jul 2026 01:47:50 +0700 Subject: [PATCH] Add tests for BooksCollector --- README.md | 11 +++- tests.py | 186 ++++++++++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 182 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 1cc701d..650bafd 100644 --- a/README.md +++ b/README.md @@ -1 +1,10 @@ -# qa_python \ No newline at end of file +В этом проекте у меня получилось 12 тестов, каждый метод покрыт хотя бы одним тестом. +1 и 2 тесты - проверяем допустимую длину названия книги, используя граничные значения +3 и 4 тесты - проверяем, что жанр устанавливается верно. Используем параметризацию +5 тест - проверяем корректность вывода жанра по книге. Используем параметризацию +6 тест - проверяем корректность вывода списка книг по жанру +7 тест - проверка вывода словаря +8 и 9 тесты - проверяем получение книг подходящих и не подходящих детям. Используем параметризацию +10 тест - проверяем корректность добавления книг в избранное +11 тест - проверяем корректность удаления книг из избранного +12 тест - проверяем корректность получения списка избранных книг diff --git a/tests.py b/tests.py index 383385e..67a65d3 100644 --- a/tests.py +++ b/tests.py @@ -1,24 +1,182 @@ +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 + + # 1. Негативный тест на допустимую длину названия + def test_add_new_book_name_over_40_symbols_not_added(self): collector = BooksCollector() + name = 's' * 41 + collector.add_new_book(name) + assert name not in collector.get_books_genre() + + # 2. Позитивный тест на допустимую длину названия + def test_add_new_book_with_name_40_symbols_added(self): + collector = BooksCollector() + name = 's' * 40 + collector.add_new_book(name) + assert name in collector.get_books_genre() + + + # 3. Тест для проверки корректной установки жанра + @pytest.mark.parametrize( + 'genre', + [ + 'Фантастика', + 'Ужасы', + 'Детективы', + 'Мультфильмы', + 'Комедии' + ] + ) + def test_set_book_genre_with_valid_genre(self, genre): + collector = BooksCollector() + collector.add_new_book('Кин-дза-дза') + collector.set_book_genre('Кин-дза-дза', genre) + + assert collector.get_book_genre('Кин-дза-дза') == genre + + + # 4. Негативный тест с попыткой установить недопустимый жанр + @pytest.mark.parametrize( + 'genre', + [ + 'Эпос', + 'Научпоп', + '1984', + '' + ] + ) + def test_set_book_genre_with_invalid_genre(self, genre): + collector = BooksCollector() + collector.add_new_book('Кин-дза-дза') + old_genre = collector.get_book_genre('Кин-дза-дза') + collector.set_book_genre('Кин-дза-дза', genre) + + assert collector.get_book_genre('Кин-дза-дза') == old_genre + + + # 5. Проверка корректности вывода жанра книги по имени + @pytest.mark.parametrize( + 'genre', + [ + 'Фантастика', + 'Ужасы', + 'Детективы', + 'Мультфильмы', + 'Комедии' + ] + ) + def test_get_book_genre_returns_book_genre(self, genre): + collector = BooksCollector() + collector.add_new_book('Кин-дза-дза') + collector.set_book_genre('Кин-дза-дза', genre) + + assert collector.get_book_genre('Кин-дза-дза') == genre + + + + # 6. Проверка вывода списка книг с определённым жанром + def test_get_books_with_specific_genre_returns_books_with_selected_genre(self): + collector = BooksCollector() + + collector.add_new_book('Кин-дза-дза') + collector.add_new_book('Слуга двух господ') + collector.add_new_book('Девушка с татуировкой дракона') + + collector.set_book_genre('Кин-дза-дза', 'Фантастика') + collector.set_book_genre('Слуга двух господ', 'Комедии') + collector.set_book_genre('Девушка с татуировкой дракона', 'Детективы') + + books = collector.get_books_with_specific_genre('Фантастика') + assert books == ['Кин-дза-дза'] + + + # 7. Проверка вывода словаря + def test_get_books_genre_returns_correct_dictionary(self): + collector = BooksCollector() + + collector.add_new_book('Кин-дза-дза') + collector.add_new_book('Азазель') + + collector.set_book_genre('Кин-дза-дза', 'Фантастика') + collector.set_book_genre('Азазель', 'Детективы') + + expected_books_genre = { + 'Кин-дза-дза': 'Фантастика', + 'Азазель': 'Детективы' + } + + assert collector.get_books_genre() == expected_books_genre + + # 8. Проверяем что книги без возрастного рейтинга подходят детям + @pytest.mark.parametrize( + 'genre', + [ + 'Фантастика', + 'Мультфильмы', + 'Комедии' + ] + ) + def test_get_books_for_children_includes_allowed_genres(self, genre): + collector = BooksCollector() + + collector.add_new_book('Кин-дза-дза') + collector.set_book_genre('Кин-дза-дза', genre) + + books = collector.get_books_for_children() + + assert 'Кин-дза-дза' in books + + # 9. Проверяем что книги с возрастным рейтингом не подходят детям + @pytest.mark.parametrize( + 'genre', + [ + 'Ужасы', + 'Детективы' + ] + ) + def test_get_books_for_children_excludes_age_rating_genres(self, genre): + collector = BooksCollector() + collector.add_new_book('Кин-дза-дза') + collector.set_book_genre('Кин-дза-дза', genre) + + books = collector.get_books_for_children() + + assert 'Кин-дза-дза' not in books + + + # 10. Проверка корректности добавления книги в избранное + def test_add_book_in_favorites_adds_book(self): + collector = BooksCollector() + collector.add_new_book('Кин-дза-дза') + collector.add_book_in_favorites('Кин-дза-дза') + + assert 'Кин-дза-дза' in collector.get_list_of_favorites_books() + + + # 11. Проверка удаления из избранного + def test_delete_book_from_favorites_removes_book(self): + collector = BooksCollector() + collector.add_new_book('Кин-дза-дза') + collector.add_book_in_favorites('Кин-дза-дза') + collector.delete_book_from_favorites('Кин-дза-дза') + + assert 'Кин-дза-дза' not in collector.get_list_of_favorites_books() + + # 12. Проверка корректности получения списка избранных книг + def test_get_list_of_favorites_books_returns_favorites_list(self): + collector = BooksCollector() + collector.add_new_book('Кин-дза-дза') + collector.add_new_book('Оно') + collector.add_book_in_favorites('Кин-дза-дза') + collector.add_book_in_favorites('Оно') - # добавляем две книги - collector.add_new_book('Гордость и предубеждение и зомби') - collector.add_new_book('Что делать, если ваш кот хочет вас убить') + expected_favorites = ['Кин-дза-дза', 'Оно'] + assert collector.get_list_of_favorites_books() == expected_favorites - # проверяем, что добавилось именно две - # словарь books_rating, который нам возвращает метод get_books_rating, имеет длину 2 - assert len(collector.get_books_rating()) == 2 - # напиши свои тесты ниже - # чтобы тесты были независимыми в каждом из них создавай отдельный экземпляр класса BooksCollector() \ No newline at end of file +