From eacd14ac5359a5b08812890ed769ff106f80fc72 Mon Sep 17 00:00:00 2001 From: Misha Volkov Date: Sun, 26 Oct 2025 23:09:05 +0300 Subject: [PATCH 1/2] My first commit --- README.md | 27 +++++++++++++- tests.py | 106 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 131 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1cc701d..76c75c0 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_valid_name_book_added - проверяет добавление книги с валидным названием + +test_set_book_genre_valid_data_genre_set - проверяет установку жанра для книги + +test_get_books_with_specific_genre_returns_correct_books - проверяет получение книг по конкретному жанру + +test_get_books_for_children_returns_only_child_friendly_books - проверяет, что возвращаются только книги без возрастного рейтинга + +test_add_book_in_favorites_book_added_to_favorites - проверяет добавление книги в избранное + +test_delete_book_from_favorites_book_removed - проверяет удаление книги из избранного + +test_get_list_of_favorites_books_returns_correct_list - проверяет получение списка избранных книг + +test_add_new_book_name_length_boundaries - параметризованный тест для проверки граничных значений длины названия + +test_add_new_book_duplicate_not_added - проверяет, что дубликаты не добавляются + +test_set_book_genre_invalid_genre_not_set - проверяет, что несуществующий жанр не устанавливается + +Все тесты независимы и каждый создает свой экземпляр класса. Параметризация используется для тестирования разных длин названий книг. + +- \ No newline at end of file diff --git a/tests.py b/tests.py index 383385e..c97608e 100644 --- a/tests.py +++ b/tests.py @@ -21,4 +21,108 @@ def test_add_new_book_add_two_books(self): assert len(collector.get_books_rating()) == 2 # напиши свои тесты ниже - # чтобы тесты были независимыми в каждом из них создавай отдельный экземпляр класса BooksCollector() \ No newline at end of file + # чтобы тесты были независимыми в каждом из них создавай отдельный экземпляр класса BooksCollector() + + +from main import BooksCollector +import pytest + + +class TestBooksCollector: + + def test_add_new_book_add_two_books(self): + collector = BooksCollector() + collector.add_new_book('Гордость и предубеждение и зомби') + collector.add_new_book('Что делать, если ваш кот хочет вас убить') + assert len(collector.get_books_genre()) == 2 + + # Тест для add_new_book - добавление книги с валидным названием + def test_add_new_book_valid_name_book_added(self): + collector = BooksCollector() + collector.add_new_book('Гарри Поттер') + assert 'Гарри Поттер' in collector.get_books_genre() + assert collector.get_book_genre('Гарри Поттер') == '' + + # Тест для set_book_genre - установка жанра для существующей книги + def test_set_book_genre_valid_data_genre_set(self): + collector = BooksCollector() + collector.add_new_book('Метро 2033') + collector.set_book_genre('Метро 2033', 'Фантастика') + assert collector.get_book_genre('Метро 2033') == 'Фантастика' + + # Тест для get_books_with_specific_genre - получение книг по жанру + def test_get_books_with_specific_genre_returns_correct_books(self): + collector = BooksCollector() + collector.add_new_book('Книга 1') + collector.add_new_book('Книга 2') + collector.set_book_genre('Книга 1', 'Ужасы') + collector.set_book_genre('Книга 2', 'Ужасы') + + result = collector.get_books_with_specific_genre('Ужасы') + assert 'Книга 1' in result + assert 'Книга 2' in result + assert len(result) == 2 + + # Тест для get_books_for_children - книги без возрастного рейтинга + def test_get_books_for_children_returns_only_child_friendly_books(self): + collector = BooksCollector() + collector.add_new_book('Детская книга') + collector.add_new_book('Страшная книга') + collector.set_book_genre('Детская книга', 'Мультфильмы') + collector.set_book_genre('Страшная книга', 'Ужасы') + + children_books = collector.get_books_for_children() + assert 'Детская книга' in children_books + assert 'Страшная книга' not in children_books + + # Тест для add_book_in_favorites - добавление в избранное + def test_add_book_in_favorites_book_added_to_favorites(self): + collector = BooksCollector() + collector.add_new_book('Любимая книга') + collector.add_book_in_favorites('Любимая книга') + assert 'Любимая книга' in collector.get_list_of_favorites_books() + + # Тест для delete_book_from_favorites - удаление из избранного + def test_delete_book_from_favorites_book_removed(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() + + # Тест для get_list_of_favorites_books - получение списка избранного + def test_get_list_of_favorites_books_returns_correct_list(self): + collector = BooksCollector() + collector.add_new_book('Книга 1') + collector.add_new_book('Книга 2') + collector.add_book_in_favorites('Книга 1') + + favorites = collector.get_list_of_favorites_books() + assert 'Книга 1' in favorites + assert 'Книга 2' not in favorites + + # Параметризованный тест для проверки граничных значений длины названия + @pytest.mark.parametrize('book_name, expected_count', [ + ('А' * 1, 1), # 1 символ - должно добавиться + ('А' * 40, 1), # 40 символов - должно добавиться + ('А' * 41, 0), # 41 символ - не должно добавиться + ('', 0), # пустая строка - не должно добавиться + ]) + def test_add_new_book_name_length_boundaries(self, book_name, expected_count): + collector = BooksCollector() + collector.add_new_book(book_name) + assert len(collector.get_books_genre()) == expected_count + + # Тест для проверки, что нельзя добавить дубликат книги + def test_add_new_book_duplicate_not_added(self): + collector = BooksCollector() + collector.add_new_book('Дубликат') + collector.add_new_book('Дубликат') + assert len(collector.get_books_genre()) == 1 + + # Тест для проверки, что нельзя установить несуществующий жанр + def test_set_book_genre_invalid_genre_not_set(self): + collector = BooksCollector() + collector.add_new_book('Книга') + collector.set_book_genre('Книга', 'Несуществующий жанр') + assert collector.get_book_genre('Книга') == '' \ No newline at end of file From abbd1eef7b94e4b4ffc727b19f024c84d7ff1f73 Mon Sep 17 00:00:00 2001 From: Misha Volkov Date: Sun, 9 Nov 2025 01:06:08 +0300 Subject: [PATCH 2/2] Update tests.py with new implementation --- tests.py | 183 ++++++++++++++++++++++++------------------------------- 1 file changed, 79 insertions(+), 104 deletions(-) diff --git a/tests.py b/tests.py index c97608e..b6cb786 100644 --- a/tests.py +++ b/tests.py @@ -1,128 +1,103 @@ -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('Гордость и предубеждение и зомби') - collector.add_new_book('Что делать, если ваш кот хочет вас убить') - - # проверяем, что добавилось именно две - # словарь books_rating, который нам возвращает метод get_books_rating, имеет длину 2 - assert len(collector.get_books_rating()) == 2 - - # напиши свои тесты ниже - # чтобы тесты были независимыми в каждом из них создавай отдельный экземпляр класса BooksCollector() - - from main import BooksCollector import pytest class TestBooksCollector: - def test_add_new_book_add_two_books(self): - collector = BooksCollector() - collector.add_new_book('Гордость и предубеждение и зомби') - collector.add_new_book('Что делать, если ваш кот хочет вас убить') - assert len(collector.get_books_genre()) == 2 + # Фикстура для создания экземпляра коллектора перед каждым тестом + @pytest.fixture + def collector(self): + return BooksCollector() - # Тест для add_new_book - добавление книги с валидным названием - def test_add_new_book_valid_name_book_added(self): - collector = BooksCollector() + # Тест 1: Добавление одной книги с валидным названием + def test_add_new_book_valid_name_book_added(self, collector): collector.add_new_book('Гарри Поттер') - assert 'Гарри Поттер' in collector.get_books_genre() - assert collector.get_book_genre('Гарри Поттер') == '' + assert 'Гарри Поттер' in collector.books_genre + assert collector.books_genre['Гарри Поттер'] == '' + + # Тест 2: Проверка граничных значений длины названия книги + @pytest.mark.parametrize('book_name, expected_count', [ + ('А' * 1, 1), # минимальная длина + ('А' * 40, 1), # максимальная длина + ('А' * 41, 0), # превышение длины + ('', 0), # пустая строка + ]) + def test_add_new_book_name_length_boundaries(self, collector, book_name, expected_count): + collector.add_new_book(book_name) + assert len(collector.books_genre) == expected_count + + # Тест 3: Невозможность добавления дубликата книги + def test_add_new_book_duplicate_not_added(self, collector): + collector.add_new_book('Дубликат') + collector.add_new_book('Дубликат') + assert len(collector.books_genre) == 1 - # Тест для set_book_genre - установка жанра для существующей книги - def test_set_book_genre_valid_data_genre_set(self): - collector = BooksCollector() + # Тест 4: Установка валидного жанра для существующей книги + def test_set_book_genre_valid_data_genre_set(self, collector): collector.add_new_book('Метро 2033') collector.set_book_genre('Метро 2033', 'Фантастика') - assert collector.get_book_genre('Метро 2033') == 'Фантастика' + assert collector.books_genre['Метро 2033'] == 'Фантастика' - # Тест для get_books_with_specific_genre - получение книг по жанру - def test_get_books_with_specific_genre_returns_correct_books(self): - collector = BooksCollector() - collector.add_new_book('Книга 1') - collector.add_new_book('Книга 2') - collector.set_book_genre('Книга 1', 'Ужасы') - collector.set_book_genre('Книга 2', 'Ужасы') + # Тест 5: Невозможность установки несуществующего жанра + def test_set_book_genre_invalid_genre_not_set(self, collector): + collector.add_new_book('Книга') + collector.set_book_genre('Книга', 'Несуществующий жанр') + assert collector.books_genre['Книга'] == '' + + # Тест 6: Получение жанра книги по имени + def test_get_book_genre_returns_correct_genre(self, collector): + collector.add_new_book('Книга') + collector.books_genre['Книга'] = 'Комедии' + assert collector.get_book_genre('Книга') == 'Комедии' + + # Тест 7: Получение списка книг с определенным жанром + def test_get_books_with_specific_genre_returns_correct_books(self, collector): + # Добавляем книги разных жанров + collector.books_genre = { + 'Книга 1': 'Ужасы', + 'Книга 2': 'Ужасы', + 'Книга 3': 'Фантастика', + 'Книга 4': '' + } result = collector.get_books_with_specific_genre('Ужасы') - assert 'Книга 1' in result - assert 'Книга 2' in result - assert len(result) == 2 - - # Тест для get_books_for_children - книги без возрастного рейтинга - def test_get_books_for_children_returns_only_child_friendly_books(self): - collector = BooksCollector() - collector.add_new_book('Детская книга') - collector.add_new_book('Страшная книга') - collector.set_book_genre('Детская книга', 'Мультфильмы') - collector.set_book_genre('Страшная книга', 'Ужасы') + assert result == ['Книга 1', 'Книга 2'] + + # Тест 8: Получение словаря books_genre + def test_get_books_genre_returns_current_dict(self, collector): + test_books = {'Книга 1': 'Фантастика', 'Книга 2': 'Комедии'} + collector.books_genre = test_books + assert collector.get_books_genre() == test_books + + # Тест 9: Получение книг, подходящих для детей + def test_get_books_for_children_returns_only_child_friendly_books(self, collector): + collector.books_genre = { + 'Детская книга': 'Мультфильмы', + 'Страшная книга': 'Ужасы', + 'Фантастическая книга': 'Фантастика', + 'Книга без жанра': '' + } children_books = collector.get_books_for_children() assert 'Детская книга' in children_books + assert 'Фантастическая книга' in children_books assert 'Страшная книга' not in children_books + assert 'Книга без жанра' not in children_books - # Тест для add_book_in_favorites - добавление в избранное - def test_add_book_in_favorites_book_added_to_favorites(self): - collector = BooksCollector() - collector.add_new_book('Любимая книга') + # Тест 10: Добавление книги в избранное + def test_add_book_in_favorites_book_added_to_favorites(self, collector): + collector.books_genre = {'Любимая книга': 'Фантастика'} collector.add_book_in_favorites('Любимая книга') - assert 'Любимая книга' in collector.get_list_of_favorites_books() + assert 'Любимая книга' in collector.favorites - # Тест для delete_book_from_favorites - удаление из избранного - def test_delete_book_from_favorites_book_removed(self): - collector = BooksCollector() - collector.add_new_book('Книга') - collector.add_book_in_favorites('Книга') + # Тест 11: Удаление книги из избранного + def test_delete_book_from_favorites_book_removed(self, collector): + collector.favorites = ['Книга'] collector.delete_book_from_favorites('Книга') - assert 'Книга' not in collector.get_list_of_favorites_books() + assert 'Книга' not in collector.favorites - # Тест для get_list_of_favorites_books - получение списка избранного - def test_get_list_of_favorites_books_returns_correct_list(self): - collector = BooksCollector() - collector.add_new_book('Книга 1') - collector.add_new_book('Книга 2') - collector.add_book_in_favorites('Книга 1') - + # Тест 12: Получение списка избранных книг + def test_get_list_of_favorites_books_returns_correct_list(self, collector): + collector.favorites = ['Книга 1', 'Книга 2'] favorites = collector.get_list_of_favorites_books() - assert 'Книга 1' in favorites - assert 'Книга 2' not in favorites - - # Параметризованный тест для проверки граничных значений длины названия - @pytest.mark.parametrize('book_name, expected_count', [ - ('А' * 1, 1), # 1 символ - должно добавиться - ('А' * 40, 1), # 40 символов - должно добавиться - ('А' * 41, 0), # 41 символ - не должно добавиться - ('', 0), # пустая строка - не должно добавиться - ]) - def test_add_new_book_name_length_boundaries(self, book_name, expected_count): - collector = BooksCollector() - collector.add_new_book(book_name) - assert len(collector.get_books_genre()) == expected_count - - # Тест для проверки, что нельзя добавить дубликат книги - def test_add_new_book_duplicate_not_added(self): - collector = BooksCollector() - collector.add_new_book('Дубликат') - collector.add_new_book('Дубликат') - assert len(collector.get_books_genre()) == 1 - - # Тест для проверки, что нельзя установить несуществующий жанр - def test_set_book_genre_invalid_genre_not_set(self): - collector = BooksCollector() - collector.add_new_book('Книга') - collector.set_book_genre('Книга', 'Несуществующий жанр') - assert collector.get_book_genre('Книга') == '' \ No newline at end of file + assert favorites == ['Книга 1', 'Книга 2'] \ No newline at end of file