diff --git a/README.md b/README.md index 1cc701d..61e04e6 100644 --- a/README.md +++ b/README.md @@ -1 +1,25 @@ -# qa_python \ No newline at end of file +# qa_python +## Описание проекта +Этот проект содержит автоматизированные тесты для класса BooksCollector, который управляет коллекцией книг с жанрами и функционалом избранного. + +## Основные возможности +Тесты для всех основных методов класса BooksCollector + +Параметризованные тесты для граничных случаев + +Изоляция тестов с помощью фикстуры вынесенной в conftest.py + +Полное покрытие позитивных и негативных сценариев + +## Покрытие тест-кейсов +Добавление книг с проверкой имени + +Назначение и проверка жанров + +Управление избранным + +Фильтрация по жанрам + +Фильтрация по возрастному рейтингу + +Добавлены отдельные тесты для add_new_book и get_books_genre() diff --git a/__pycache__/main.cpython-313.pyc b/__pycache__/main.cpython-313.pyc new file mode 100644 index 0000000..6250037 Binary files /dev/null and b/__pycache__/main.cpython-313.pyc differ diff --git a/__pycache__/tests.cpython-313-pytest-8.4.1.pyc b/__pycache__/tests.cpython-313-pytest-8.4.1.pyc new file mode 100644 index 0000000..4a3ac93 Binary files /dev/null and b/__pycache__/tests.cpython-313-pytest-8.4.1.pyc differ diff --git a/conftest.py b/conftest.py new file mode 100644 index 0000000..f7c3b7f --- /dev/null +++ b/conftest.py @@ -0,0 +1,5 @@ +conftest.py +#Фикстура collector - создает новый экземпляр класса для каждого теста + @pytest.fixture + def collector(self): + return BooksCollector() \ No newline at end of file diff --git a/tests.py b/tests.py deleted file mode 100644 index 383385e..0000000 --- a/tests.py +++ /dev/null @@ -1,24 +0,0 @@ -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() \ No newline at end of file diff --git a/tests_books_collector.py b/tests_books_collector.py new file mode 100644 index 0000000..3cceacc --- /dev/null +++ b/tests_books_collector.py @@ -0,0 +1,95 @@ +import pytest +from main import BooksCollector + +class TestBooksCollector: + + # Тесты для add_new_book + # Проверяем корректность добавления новых книг с разными названиями + @pytest.mark.parametrize('name, expected', [ + ('Мастер и Маргарита', True), + ('', False), + ('X' * 41, False), + ('X' * 40, True) + ]) + def test_add_new_book(self, collector, name, expected): + collector.add_new_book(name) + assert (name in collector.get_books_genre()) == expected + # Тестирование добавления книг + def test_get_books_genre_returns_correct_dict(self, collector): + collector.add_new_book('Мастер и Маргарита') + collector.add_new_book('Онегин') + collector.set_book_genre('Мастер и Маргарита', 'Драма') + expected = {'Мастер и Маргарита': 'Драма', 'Онегин': ''} + assert collector.get_books_genre() == expected + # Тестирование метода set_book_genre() - невалидные случаи + def test_set_book_genre_invalid(self, collector): + collector.add_new_book('1984') + collector.set_book_genre('1984', 'Несуществующий жанр') + assert collector.get_book_genre('1984') == '' + + # Тест только для test_book_addition_success + def test_book_addition_success(self, collector): + collector.add_new_book('Мастер и Маргарита') + assert 'Мастер и Маргарита' in collector.books_genre # Прямой доступ к словарю + # Тест только для get_book_genre + def test_get_book_genre(self, collector): + collector.books_genre = {'Убийство в Восточном экспрессе': 'Детективы'} + assert collector.get_book_genre('Убийство в Восточном экспрессе') == 'Детективы' + # Проверяем, что set_book_genre устанавливает жанр при использовании книги из books_genre и жанра из genre + def test_set_book_genre_valid_genre_is_set(self, collector): + collector.add_new_book('Десять негритят') + collector.set_book_genre('Десять негритят', 'Детективы') + assert collector.books_genre['Десять негритят'] == 'Детективы' + # Проверяем что get_books_with_specific_genre возвращает книги определенного жанра + # Запрашиваем книги определенного жанра ('Фантастика') + def test_get_books_with_specific_genre(self, collector): + collector.add_new_book('Гарри Поттер и философский камень') + collector.add_new_book('Оно') + collector.set_book_genre('Гарри Поттер и философский камень', 'Фантастика') + collector.set_book_genre('Оно', 'Ужасы') + assert collector.get_books_with_specific_genre('Фантастика') == ['Гарри Поттер и философский камень'] + + # Проверяем что метод get_books_for_children возвращает только детскую книгу + def test_get_books_for_children(self, collector): + collector.add_new_book('Винни-Пух') + collector.add_new_book('Дракула') + collector.set_book_genre('Винни-Пух', 'Мультфильмы') + collector.set_book_genre('Дракула', 'Ужасы') + assert collector.get_books_for_children() == ['Винни-Пух'] + + # Проверяем, что add_book_in_favorites добавляет книгу в избранное + def test_add_book_in_favorites(self, collector): + collector.add_new_book('Три товарища') + collector.add_book_in_favorites('Три товарища') + assert 'Три товарища' in collector.get_list_of_favorites_books() + # Проверяем, что add_book_in_favorites не добавляет повторно книгу в избранное + def test_add_book_in_favorites_twice(self, collector): + collector.add_new_book('Маленький принц') + collector.add_book_in_favorites('Маленький принц') + collector.add_book_in_favorites('Маленький принц') + assert len(collector.get_list_of_favorites_books()) == 1 + + # Проверяем метод delete_book_from_favorites для удаления из избранного + def test_delete_book_from_favorites(self, collector): + 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(self, collector): + collector.add_new_book('Скотный двор') + collector.add_new_book('Мы') + collector.add_book_in_favorites('Скотный двор') + collector.add_book_in_favorites('Мы') + assert collector.get_list_of_favorites_books() == ['Скотный двор', 'Мы'] + + # Проверяем что метод get_book_genre возвращает правильный жанр + def test_get_book_genre(self, collector): + collector.add_new_book('Убийство в Восточном экспрессе') + collector.set_book_genre('Убийство в Восточном экспрессе', 'Детективы') + assert collector.get_book_genre('Убийство в Восточном экспрессе') == 'Детективы' + + + \ No newline at end of file