From ed908f22bd767803a9d2cbc17f25c8fd0a93d5a1 Mon Sep 17 00:00:00 2001 From: Serg-nt Date: Tue, 6 May 2025 11:53:40 +0300 Subject: [PATCH 1/4] =?UTF-8?q?=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=B2=20tests.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests.py | 112 +++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 97 insertions(+), 15 deletions(-) diff --git a/tests.py b/tests.py index 383385e..2a4f1e3 100644 --- a/tests.py +++ b/tests.py @@ -1,24 +1,106 @@ from main import BooksCollector +import pytest # класс TestBooksCollector объединяет набор тестов, которыми мы покрываем наше приложение BooksCollector # обязательно указывать префикс Test class TestBooksCollector: - # пример теста: - # обязательно указывать префикс test_ - # дальше идет название метода, который тестируем add_new_book_ - # затем, что тестируем add_two_books - добавление двух книг - def test_add_new_book_add_two_books(self): - # создаем экземпляр (объект) класса BooksCollector - collector = BooksCollector() + @pytest.fixture + def collector(self): + return BooksCollector() - # добавляем две книги - collector.add_new_book('Гордость и предубеждение и зомби') - collector.add_new_book('Что делать, если ваш кот хочет вас убить') + def test_initial_state(self, collector): + assert collector.get_books_genre() == {} + assert collector.get_list_of_favorites_books() == [] - # проверяем, что добавилось именно две - # словарь books_rating, который нам возвращает метод get_books_rating, имеет длину 2 - assert len(collector.get_books_rating()) == 2 + def test_add_new_book_correct_add_book_successful_add(self, collector): + collector.add_new_book('Азбука') + assert collector.get_book_genre('Азбука') == '' + assert len(collector.get_books_genre()) == 1 + + def test_add_new_book_incorrect_add_book_unsuccessful_add(self, collector): + collector.add_new_book('Азбука') + assert len(collector.get_books_genre()) == 1 + collector.add_new_book('Азбука') + assert len(collector.get_books_genre()) == 1 + collector.add_new_book('Азбука' * 10) + assert len(collector.get_books_genre()) == 1 - # напиши свои тесты ниже - # чтобы тесты были независимыми в каждом из них создавай отдельный экземпляр класса BooksCollector() \ No newline at end of file + def test_set_book_genre_correct_genre_success(self, collector): + collector.add_new_book('Азбука') + collector.set_book_genre('Азбука', 'Ужасы') + assert collector.books_genre['Азбука'] == 'Ужасы' + + def test_set_book_genre_incorrect_genre_unsuccess(self, collector): + collector.set_book_genre('Азбука', 'Ужасы') + assert len(collector.books_genre) == 0 + collector.add_new_book('Азбука') + collector.set_book_genre('Азбука', 'FFFFFF') + assert collector.books_genre['Азбука'] == '' + + def test_get_book_genre(self, collector): + collector.add_new_book('Азбука') + collector.set_book_genre('Азбука', 'Ужасы') + assert collector.get_book_genre('Азбука') == 'Ужасы' + + def test_get_books_with_specific_genre(self, collector): + books = ['Азбука', 'Алгебра', 'Маленький принц'] + for book in books: + collector.add_new_book(book) + collector.set_book_genre(book, 'Ужасы') + + collector.add_new_book('Ну погоди') + collector.set_book_genre('Ну погоди', 'Мультфильмы') + + assert len(collector.get_books_with_specific_genre('Ужасы')) == 3 + assert len(collector.get_books_with_specific_genre('Мультфильмы')) == 1 + + def test_get_books_genre(self, collector): + collector.add_new_book('Азбука') + assert collector.get_books_genre() == {'Азбука': ''} + + def test_get_books_for_children(self, collector): + books = ['детская1', 'детская2', 'детская3', 'взрослая1', 'взрослая2'] + genres = ['Фантастика', 'Мультфильмы', 'Комедии', 'Ужасы', 'Детективы'] + + for i in range(len(books)): + collector.add_new_book(books[i]) + collector.set_book_genre(books[i], genres[i]) + + children_books = collector.get_books_for_children() + assert len(children_books) == 3 + assert 'детская1' in children_books + assert 'детская2' in children_books + assert 'детская3' in children_books + assert 'взрослая1' not in children_books + assert 'взрослая2' not in children_books + + def test_add_book_in_favorites(self, collector): + collector.add_book_in_favorites('Азбука') + assert len(collector.get_books_genre()) == 0 + collector.add_new_book('Азбука') + collector.add_book_in_favorites('Азбука') + assert len(collector.get_books_genre()) == 1 + assert len(collector.favorites) == 1 + assert 'Азбука' in collector.favorites + collector.add_book_in_favorites('Азбука') + assert len(collector.favorites) == 1 + + def test_delete_book_from_favorites(self, collector): + collector.add_new_book('Азбука') + collector.add_book_in_favorites('Азбука') + collector.delete_book_from_favorites('Алгебра') + assert len(collector.favorites) == 1 + assert 'Азбука' in collector.favorites + collector.delete_book_from_favorites('Азбука') + assert len(collector.favorites) == 0 + assert 'Азбука' not in collector.favorites + + def get_list_of_favorites_books(self, collector): + collector.add_new_book('Азбука') + collector.add_book_in_favorites('Азбука') + collector.add_new_book('Алгебра') + collector.add_book_in_favorites('Алгебра') + assert len(collector.get_list_of_favorites_books()) == 2 + assert 'Азбука' in collector.get_list_of_favorites_books() + assert 'Алгебра' in collector.get_list_of_favorites_books() \ No newline at end of file From 94b22430d0351a8570c24d1c808259552e30cc8a Mon Sep 17 00:00:00 2001 From: Serg-nt Date: Wed, 14 May 2025 13:27:21 +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=D0=B8=D0=B5=20=D0=B7=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests.py | 107 +++++++++++++++++++++++-------------------------------- 1 file changed, 45 insertions(+), 62 deletions(-) diff --git a/tests.py b/tests.py index 2a4f1e3..5484ccc 100644 --- a/tests.py +++ b/tests.py @@ -1,49 +1,48 @@ -from main import BooksCollector import pytest +from main import BooksCollector + -# класс TestBooksCollector объединяет набор тестов, которыми мы покрываем наше приложение BooksCollector -# обязательно указывать префикс Test class TestBooksCollector: - @pytest.fixture - def collector(self): - return BooksCollector() + def test_initial_state(self): + collector = BooksCollector() + assert collector.get_books_genre() == {} and collector.get_list_of_favorites_books() == [] - def test_initial_state(self, collector): - assert collector.get_books_genre() == {} - assert collector.get_list_of_favorites_books() == [] - - def test_add_new_book_correct_add_book_successful_add(self, collector): + def test_add_new_book_correct_add_book_successful_add(self): + collector = BooksCollector() collector.add_new_book('Азбука') assert collector.get_book_genre('Азбука') == '' - assert len(collector.get_books_genre()) == 1 - - def test_add_new_book_incorrect_add_book_unsuccessful_add(self, collector): - collector.add_new_book('Азбука') - assert len(collector.get_books_genre()) == 1 - collector.add_new_book('Азбука') - assert len(collector.get_books_genre()) == 1 - collector.add_new_book('Азбука' * 10) - assert len(collector.get_books_genre()) == 1 - def test_set_book_genre_correct_genre_success(self, collector): + @pytest.mark.parametrize("name, expected_count", [ + ('Азбука', 1), + ('', 0), + ('Азбука' * 10, 0) + ]) + def test_add_new_book_incorrect_add_book_unsuccessful_add(self, name, expected_count): + collector = BooksCollector() + collector.add_new_book(name) + assert len(collector.get_books_genre()) == expected_count + + def test_set_book_genre_correct_genre_success(self): + collector = BooksCollector() collector.add_new_book('Азбука') collector.set_book_genre('Азбука', 'Ужасы') assert collector.books_genre['Азбука'] == 'Ужасы' - def test_set_book_genre_incorrect_genre_unsuccess(self, collector): - collector.set_book_genre('Азбука', 'Ужасы') - assert len(collector.books_genre) == 0 + def test_set_book_genre_incorrect_genre_unsuccess(self): + collector = BooksCollector() collector.add_new_book('Азбука') collector.set_book_genre('Азбука', 'FFFFFF') assert collector.books_genre['Азбука'] == '' - def test_get_book_genre(self, collector): + def test_get_book_genre(self): + collector = BooksCollector() collector.add_new_book('Азбука') collector.set_book_genre('Азбука', 'Ужасы') assert collector.get_book_genre('Азбука') == 'Ужасы' - def test_get_books_with_specific_genre(self, collector): + def test_get_books_with_specific_genre(self): + collector = BooksCollector() books = ['Азбука', 'Алгебра', 'Маленький принц'] for book in books: collector.add_new_book(book) @@ -52,55 +51,39 @@ def test_get_books_with_specific_genre(self, collector): collector.add_new_book('Ну погоди') collector.set_book_genre('Ну погоди', 'Мультфильмы') - assert len(collector.get_books_with_specific_genre('Ужасы')) == 3 - assert len(collector.get_books_with_specific_genre('Мультфильмы')) == 1 + assert collector.get_books_with_specific_genre('Ужасы') == books - def test_get_books_genre(self, collector): + def test_get_books_genre(self): + collector = BooksCollector() collector.add_new_book('Азбука') assert collector.get_books_genre() == {'Азбука': ''} - def test_get_books_for_children(self, collector): - books = ['детская1', 'детская2', 'детская3', 'взрослая1', 'взрослая2'] - genres = ['Фантастика', 'Мультфильмы', 'Комедии', 'Ужасы', 'Детективы'] - - for i in range(len(books)): - collector.add_new_book(books[i]) - collector.set_book_genre(books[i], genres[i]) + def test_get_books_for_children(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 len(children_books) == 3 - assert 'детская1' in children_books - assert 'детская2' in children_books - assert 'детская3' in children_books - assert 'взрослая1' not in children_books - assert 'взрослая2' not in children_books + assert collector.get_books_for_children() == ['Детская'] - def test_add_book_in_favorites(self, collector): - collector.add_book_in_favorites('Азбука') - assert len(collector.get_books_genre()) == 0 + def test_add_book_in_favorites(self): + collector = BooksCollector() collector.add_new_book('Азбука') collector.add_book_in_favorites('Азбука') - assert len(collector.get_books_genre()) == 1 - assert len(collector.favorites) == 1 - assert 'Азбука' in collector.favorites - collector.add_book_in_favorites('Азбука') - assert len(collector.favorites) == 1 + assert collector.get_list_of_favorites_books() == ['Азбука'] - def test_delete_book_from_favorites(self, collector): + def test_delete_book_from_favorites(self): + collector = BooksCollector() collector.add_new_book('Азбука') collector.add_book_in_favorites('Азбука') - collector.delete_book_from_favorites('Алгебра') - assert len(collector.favorites) == 1 - assert 'Азбука' in collector.favorites collector.delete_book_from_favorites('Азбука') - assert len(collector.favorites) == 0 - assert 'Азбука' not in collector.favorites + assert collector.get_list_of_favorites_books() == [] - def get_list_of_favorites_books(self, collector): + def test_get_list_of_favorites_books(self): + collector = BooksCollector() collector.add_new_book('Азбука') - collector.add_book_in_favorites('Азбука') collector.add_new_book('Алгебра') + collector.add_book_in_favorites('Азбука') collector.add_book_in_favorites('Алгебра') - assert len(collector.get_list_of_favorites_books()) == 2 - assert 'Азбука' in collector.get_list_of_favorites_books() - assert 'Алгебра' in collector.get_list_of_favorites_books() \ No newline at end of file + assert collector.get_list_of_favorites_books() == ['Азбука', 'Алгебра'] \ No newline at end of file From 102d8895ebc4feb4fa453c83cd6bc477719b86ae Mon Sep 17 00:00:00 2001 From: Serg-nt Date: Wed, 14 May 2025 13:41:37 +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=20README=20=D1=81=D0=BE=20=D1=81=D0=BF=D0=B8=D1=81=D0=BA?= =?UTF-8?q?=D0=BE=D0=BC=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 --- README.md | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 1cc701d..286080d 100644 --- a/README.md +++ b/README.md @@ -1 +1,15 @@ -# qa_python \ No newline at end of file +# qa_python +Тесты для BooksCollector + +test_initial_state - проверка первоначального состояния +test_add_new_book_correct_add_book_successful_add - проверка добавления книги в словарь без жанра +test_add_new_book_incorrect_add_book_unsuccessful_add - проверка добавления книги в словарь +test_set_book_genre_correct_genre_success - проверка на успешную установку жанра из списка +test_set_book_genre_incorrect_genre_unsuccess - проверку жанр не входящий в список не устанавливается +test_get_book_genre - получение книг по жанрам +test_get_books_with_specific_genre - проверка выведения списка книг с определенным жанром +test_get_books_genre - проверка получения списка книг +test_get_books_for_children - проверка возврата детских книг +test_add_book_in_favorites - проверка добавления книги в избранное +test_delete_book_from_favorites - проверка удаления книги из избранного +test_get_list_of_favorites_books - проверка получения списка избранных книг \ No newline at end of file From 138cb76ac8cb0b0d1eb86e3ea01203c9fb4263b8 Mon Sep 17 00:00:00 2001 From: duke300-QA Date: Fri, 6 Mar 2026 21:14:07 +0300 Subject: [PATCH 4/4] Sprint_4 - tests for BooksCollector MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Автор: Козина Елена Описание изменений: - Добавлены тесты для класса BooksCollector, который управляет книгами и избранным. - Тесты покрывают следующие сценарии: - Добавление новых книг (корректные и некорректные названия) - Установка жанра книги (правильного и неправильного) - Получение жанра книги - Получение списка книг по жанру - Получение всех книг для детей (исключая книги с возрастным рейтингом) - Добавление и удаление книг из избранного - Получение полного списка избранных книг --- test_books_collector.py | 135 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 test_books_collector.py diff --git a/test_books_collector.py b/test_books_collector.py new file mode 100644 index 0000000..e3ed17a --- /dev/null +++ b/test_books_collector.py @@ -0,0 +1,135 @@ +import pytest +from main import BooksCollector + + +class TestBooksCollector: + + # фикстура для пустого коллектора + @pytest.fixture + def collector(self): + return BooksCollector() + + # фикстура с несколькими книгами и жанрами + @pytest.fixture + def collector_with_books(self): + collector = BooksCollector() + # добавляем книги разных жанров + collector.add_new_book('Гарри Поттер') # фантастика + collector.add_new_book('Дюна') # фантастика + collector.add_new_book('Оно') # ужасы + collector.add_new_book('Дракула') # ужасы + collector.add_new_book('Малыш и Карлсон') # детская / мультфильм + collector.add_new_book('Незнайка на Луне') # детская / мультфильм + collector.add_new_book('Ну, погоди!') # мультфильм + + # устанавливаем жанры + collector.set_book_genre('Гарри Поттер', 'Фантастика') + collector.set_book_genre('Дюна', 'Фантастика') + collector.set_book_genre('Оно', 'Ужасы') + collector.set_book_genre('Дракула', 'Ужасы') + collector.set_book_genre('Малыш и Карлсон', 'Мультфильмы') + collector.set_book_genre('Незнайка на Луне', 'Мультфильмы') + collector.set_book_genre('Ну, погоди!', 'Мультфильмы') + return collector + + # проверка добавления одной книги + def test_add_new_book_add_one_book(self, collector): + collector.add_new_book('Том Сойер') + # проверяем, что книга добавилась + assert 'Том Сойер' in collector.get_books_genre() + # проверяем, что жанр пустой + assert collector.get_book_genre('Том Сойер') == '' + + # проверка разных вариантов добавления книги + @pytest.mark.parametrize( + "name, expected_count", + [ + ('Том Сойер', 1), + ('', 0), + ('А'*41, 0) # название слишком длинное + ], + ids=["valid_name", "empty_name", "too_long_name"] + ) + def test_add_new_book_various_cases(self, collector, name, expected_count): + collector.add_new_book(name) + assert len(collector.get_books_genre()) == expected_count + + # проверка установки жанра книги корректного + def test_set_book_genre_correct(self, collector): + collector.add_new_book('Том Сойер') + collector.set_book_genre('Том Сойер', 'Фантастика') + assert collector.get_book_genre('Том Сойер') == 'Фантастика' + + # проверка установки жанра книги некорректного + def test_set_book_genre_wrong_genre(self, collector): + collector.add_new_book('Том Сойер') + collector.set_book_genre('Том Сойер', 'НеверныйЖанр') + assert collector.get_book_genre('Том Сойер') == '' + + # проверка получения жанра книги + def test_get_book_genre_returns_right_genre(self, collector_with_books): + assert collector_with_books.get_book_genre('Гарри Поттер') == 'Фантастика' + assert collector_with_books.get_book_genre('Оно') == 'Ужасы' + + # проверка получения списка книг по жанру + def test_get_books_with_specific_genre(self, collector_with_books): + books = collector_with_books.get_books_with_specific_genre('Фантастика') + assert 'Гарри Поттер' in books + assert 'Дюна' in books + assert len(books) == 2 + + # проверка получения словаря всех книг + def test_get_books_genre_returns_dict(self, collector_with_books): + books_dict = collector_with_books.get_books_genre() + assert 'Гарри Поттер' in books_dict + assert isinstance(books_dict, dict) + + # проверка получения книг для детей + def test_get_books_for_children_excludes_rated(self, collector_with_books): + books_for_children = collector_with_books.get_books_for_children() + # книги без возрастного рейтинга должны быть + assert 'Малыш и Карлсон' in books_for_children + assert 'Незнайка на Луне' in books_for_children + assert 'Ну, погоди!' in books_for_children + # книги с возрастным рейтингом не должны быть + assert 'Оно' not in books_for_children + assert 'Дракула' not in books_for_children + + # проверка добавления книги в избранное + def test_add_book_in_favorites_adds_book(self, collector): + collector.add_new_book('Том Сойер') + collector.add_book_in_favorites('Том Сойер') + assert collector.get_list_of_favorites_books() == ['Том Сойер'] + + # проверка, что дубликаты не добавляются в избранное + def test_add_book_in_favorites_no_duplicates(self, collector): + collector.add_new_book('Том Сойер') + collector.add_book_in_favorites('Том Сойер') + collector.add_book_in_favorites('Том Сойер') + assert collector.get_list_of_favorites_books() == ['Том Сойер'] + + # проверка удаления книги из избранного + def test_delete_book_from_favorites(self, collector): + # создаём книгу + collector.add_new_book('Том Сойер') + + # добавляем в избранное + collector.add_book_in_favorites('Том Сойер') + # проверяем, что книга в избранном + assert collector.get_list_of_favorites_books() == ['Том Сойер'] + + # удаляем из избранного + collector.delete_book_from_favorites('Том Сойер') + # проверяем, что её больше нет + assert collector.get_list_of_favorites_books() == [] + + # проверка получения списка всех избранных книг + def test_get_list_of_favorites_books_returns_correct_list(self, collector): + collector.add_new_book('Том Сойер') + collector.add_new_book('Дюна') + collector.add_book_in_favorites('Том Сойер') + collector.add_book_in_favorites('Дюна') + favorites = collector.get_list_of_favorites_books() + assert favorites == ['Том Сойер', 'Дюна'] + + \ No newline at end of file