From 50f427d342c5ae287c08efd49c340333481fbbfd Mon Sep 17 00:00:00 2001 From: Emil Samigullin Date: Tue, 22 Jul 2025 22:17:43 +0300 Subject: [PATCH 1/4] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20README=20=D0=B8=20=D1=82=D0=B5=D1=81=D1=82=D1=8B=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20BooksCollector?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 29 +++++- __pycache__/main.cpython-313.pyc | Bin 0 -> 3592 bytes .../tests.cpython-313-pytest-8.4.1.pyc | Bin 0 -> 15666 bytes tests.py | 24 ----- tests_books_collector.py | 83 ++++++++++++++++++ 5 files changed, 111 insertions(+), 25 deletions(-) create mode 100644 __pycache__/main.cpython-313.pyc create mode 100644 __pycache__/tests.cpython-313-pytest-8.4.1.pyc delete mode 100644 tests.py create mode 100644 tests_books_collector.py diff --git a/README.md b/README.md index 1cc701d..605760c 100644 --- a/README.md +++ b/README.md @@ -1 +1,28 @@ -# qa_python \ No newline at end of file +# qa_python +Описание проекта +Этот проект содержит автоматизированные тесты для класса BooksCollector, который управляет коллекцией книг с жанрами и функционалом избранного. + +Основные возможности +Тесты для всех основных методов класса BooksCollector + +Параметризованные тесты для граничных случаев + +Изоляция тестов с помощью фикстур + +Полное покрытие позитивных и негативных сценариев + +Покрытие тест-кейсов +Добавление книг с проверкой имени + +Назначение и проверка жанров + +Управление избранным + +Фильтрация по жанрам + +Фильтрация по возрастному рейтингу + +Требования +Python 3.8+ + +pytest \ No newline at end of file diff --git a/__pycache__/main.cpython-313.pyc b/__pycache__/main.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..625003744d10c7739ef3bedb9d2d4e34cffb18d4 GIT binary patch literal 3592 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 Date: Wed, 23 Jul 2025 15:45:59 +0300 Subject: [PATCH 2/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=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B8=20?= =?UTF-8?q?=D1=81=20=D0=BA=D0=BE=D0=B4=D0=BE=D0=BC,=20=D0=B4=D0=BE=D0=B1?= =?UTF-8?q?=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=20=D1=82=D0=B5=D1=81=D1=82?= =?UTF-8?q?=D1=8B=20=D0=B4=D0=BB=D1=8F=20add=5Fnew=5Fbook=20=D0=B8=20get?= =?UTF-8?q?=5Fbook=5Fgenre,=20=D1=84=D0=B8=D0=BA=D1=81=D1=82=D1=83=D1=80?= =?UTF-8?q?=D0=B0=20=D0=B2=D1=8B=D0=BD=D0=B5=D1=81=D0=B5=D0=BD=D0=B0=20?= =?UTF-8?q?=D0=B2=20=D1=84=D0=B0=D0=B9=D0=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conftest.py | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 conftest.py 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 From 2e1c21fc7b970be9c8a641b428a93d3a5954270a Mon Sep 17 00:00:00 2001 From: Emil Samigullin Date: Fri, 25 Jul 2025 00:08:22 +0300 Subject: [PATCH 3/4] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=B2=20README.md,=20=D0=B4=D0=BE=D0=BF=D0=B8=D1=81?= =?UTF-8?q?=D0=B0=D0=BD=D1=8B=20=D1=82=D0=B5=D1=81=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 13 +++++-------- tests_books_collector.py | 23 +++++++++++++++++------ 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 605760c..61e04e6 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,17 @@ # qa_python -Описание проекта +## Описание проекта Этот проект содержит автоматизированные тесты для класса BooksCollector, который управляет коллекцией книг с жанрами и функционалом избранного. -Основные возможности +## Основные возможности Тесты для всех основных методов класса BooksCollector Параметризованные тесты для граничных случаев -Изоляция тестов с помощью фикстур +Изоляция тестов с помощью фикстуры вынесенной в conftest.py Полное покрытие позитивных и негативных сценариев -Покрытие тест-кейсов +## Покрытие тест-кейсов Добавление книг с проверкой имени Назначение и проверка жанров @@ -22,7 +22,4 @@ Фильтрация по возрастному рейтингу -Требования -Python 3.8+ - -pytest \ No newline at end of file +Добавлены отдельные тесты для add_new_book и get_books_genre() diff --git a/tests_books_collector.py b/tests_books_collector.py index dd59254..97d8fc7 100644 --- a/tests_books_collector.py +++ b/tests_books_collector.py @@ -2,11 +2,7 @@ from main import BooksCollector class TestBooksCollector: - #Фикстура collector - создает новый экземпляр класса для каждого теста - @pytest.fixture - def collector(self): - return BooksCollector() - + # Тесты для add_new_book # Проверяем корректность добавления новых книг с разными названиями @pytest.mark.parametrize('name, expected', [ @@ -29,7 +25,20 @@ def test_set_book_genre_invalid(self, collector): collector.add_new_book('1984') collector.set_book_genre('1984', 'Несуществующий жанр') assert collector.get_book_genre('1984') == '' - + + # Тест только для add_new_book + def test_add_new_book(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): @@ -80,4 +89,6 @@ 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 From 630a5eb9de13b40e0a96a4a903fdcdea743d8efa Mon Sep 17 00:00:00 2001 From: Emil Samigullin Date: Sat, 2 Aug 2025 23:45:45 +0300 Subject: [PATCH 4/4] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=82=D0=B5=D1=81=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests_books_collector.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/tests_books_collector.py b/tests_books_collector.py index 97d8fc7..3cceacc 100644 --- a/tests_books_collector.py +++ b/tests_books_collector.py @@ -14,20 +14,21 @@ class TestBooksCollector: def test_add_new_book(self, collector, name, expected): collector.add_new_book(name) assert (name in collector.get_books_genre()) == expected - - # # Тестирование метода set_book_genre() - валидные случаи - def test_set_book_genre_valid(self, collector): - collector.add_new_book('Преступление и наказание') - collector.set_book_genre('Преступление и наказание', 'Детективы') - assert collector.get_book_genre('Преступление и наказание') == 'Детективы' + # Тестирование добавления книг + 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') == '' - # Тест только для add_new_book - def test_add_new_book(self, collector): + # Тест только для test_book_addition_success + def test_book_addition_success(self, collector): collector.add_new_book('Мастер и Маргарита') assert 'Мастер и Маргарита' in collector.books_genre # Прямой доступ к словарю # Тест только для get_book_genre