From e1b95539a25ac03074a614e213f09a60760f12e8 Mon Sep 17 00:00:00 2001 From: Kirill Pahamovich Date: Fri, 26 Jun 2026 21:30:37 +0300 Subject: [PATCH 1/3] =?UTF-8?q?=D1=82=D0=B5=D1=81=D1=82=D1=8B=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20=D0=BA=D0=BB=D0=B0=D1=81=D1=81=D0=B0=20BooksColl?= =?UTF-8?q?ector?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests.py | 69 +++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 61 insertions(+), 8 deletions(-) diff --git a/tests.py b/tests.py index 383385e..ada2fcc 100644 --- a/tests.py +++ b/tests.py @@ -1,24 +1,77 @@ +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): + + def test_add_new_book_add_two_books(self): #1 # создаем экземпляр (объект) класса BooksCollector collector = BooksCollector() - # добавляем две книги collector.add_new_book('Гордость и предубеждение и зомби') collector.add_new_book('Что делать, если ваш кот хочет вас убить') - # проверяем, что добавилось именно две # словарь books_rating, который нам возвращает метод get_books_rating, имеет длину 2 - assert len(collector.get_books_rating()) == 2 + assert len(collector.get_books_genre()) == 2 # исправил на collector.get_books_genre() + + # чтобы тесты были независимыми в каждом из них создавай отдельный экземпляр класса BooksCollector() + def test_add_new_book_with_too_long_name_not_added(self): #2, тест на слишком длинное название книги + collector = BooksCollector() + collector.add_new_book('A' * 41) + assert len(collector.get_books_genre()) == 0 + + def test_add_new_book_with_same_name_not_added(self): #3, тест на дупликат + collector = BooksCollector() + collector.add_new_book('Гнев дяди Андрея') + collector.add_new_book('Гнев дяди Андрея') + assert len(collector.get_books_genre()) == 1 + + @pytest.mark.parametrize("book_name, genre, expected_genre", + [('Существующая', 'Фантастика', 'Фантастика'), ('Неизвестная', 'Комедии', None)]) + #4, параметризованный тест на существующую / несуществующую книгу + def test_set_book_genre_with_parametrize(self, collector, book_name, genre, expected_genre): + collector.add_new_book('Существующая') + collector.set_book_genre(book_name, genre) + if book_name == 'Существующая': + assert collector.get_book_genre(book_name) == expected_genre + else: + assert collector.get_book_genre('Существующая') == '' + + def test_get_books_with_specific_genres(self, collector): #5, тест на получение списка книг по жанру + collector.add_new_book('Кн1') + collector.set_book_genre('Кн1', 'Комедии') + collector.add_new_book('Кн2') + collector.set_book_genre('Кн2', 'Ужасы') + assert collector.get_books_with_specific_genre('Комедии') == ['Кн1'] + + def test_get_books_genre_returns_dict(self, collector): #6, тест метода get_books_genre + collector.add_new_book('Дбд') + books = collector.get_books_genre() + assert 'Дбд' in books + + def test_get_books_for_children_without_high_age_rating(self, collector): #7, тест на сортировку детских и взрослых жанров + collector.add_new_book('Для детей') + collector.set_book_genre('Для детей', 'Мультфильмы') + collector.add_new_book('Для взрослых') + collector.set_book_genre('Для взрослых', 'Ужасы') + assert collector.get_books_for_children() == ['Для детей'] + + def test_add_book_in_favorites_and_duplicate(self, collector): #8, тест на добавление книги в любимые + тест на дупликат + collector.add_new_book('Гнев дяди Андрея') + collector.add_book_in_favorites('Гнев дяди Андрея') + collector.add_book_in_favorites('Гнев дяди Андрея') # книга_дупликат + favorites = collector.get_list_of_favorites_books() + assert 'Гнев дяди Андрея' in favorites + assert favorites.count('Гнев дяди Андрея') == 1 - # напиши свои тесты ниже - # чтобы тесты были независимыми в каждом из них создавай отдельный экземпляр класса BooksCollector() \ No newline at end of file + def test_del_book_from_favorites(self, collector): #9, тест на удаление книги из любимых + collector.add_new_book('Гнев дяди Андрея') + collector.add_book_in_favorites('Гнев дяди Андрея') + collector.delete_book_from_favorites('Гнев дяди Андрея') + assert 'Гнев дяди Андрея' not in collector.get_list_of_favorites_books() From 415880bf8b40d83ba0d8b81165a2871292475225 Mon Sep 17 00:00:00 2001 From: Kirill Pahamovich Date: Sat, 27 Jun 2026 18:20:58 +0300 Subject: [PATCH 2/3] =?UTF-8?q?README-=D1=84=D0=B0=D0=B9=D0=BB=20=D1=81=20?= =?UTF-8?q?=D0=BE=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=B8=D0=B5=D0=BC=20=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D0=B5=D0=BA=D1=82=D0=B0=20=D0=B8=20=D1=82=D0=B5?= =?UTF-8?q?=D1=81=D1=82=D0=BE=D0=B2=20=D0=B2=20=D0=BD=D0=B5=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 1cc701d..40bc974 100644 --- a/README.md +++ b/README.md @@ -1 +1,14 @@ -# qa_python \ No newline at end of file +# qa_python +В данном проекте сделаны 9 тестов на различные сценарии для класса BooksCollector. 2 теста объединено в 1 (используя параметризацию). Теперь кратко о каждом тесте: + +№1 - тест на добавление 2-ух книг +№2 - тест на слишком длинное название книги +№3 - тест на добавление книги-дупликата +№4 - параметризованный тест на существующую / несуществующую книгу +№5 - тест на получение списка книг по жанру +№6 - тест метода get_books_genre +№7 - тест на сортировку детских и взрослых жанров +№8 - тест на добавление книги в любимые + тест на дупликат +№9 - тест на удаление книги из любимых + +Это далеко не все тесты, которые можно сделать для класса BooksCollector, но я старался сделать наиболее важные из них. \ No newline at end of file From daa09a6617b46dcbeee19ae2fd1ce000bcf93ef5 Mon Sep 17 00:00:00 2001 From: Kirill Pahamovich Date: Sun, 28 Jun 2026 22:52:26 +0300 Subject: [PATCH 3/3] =?UTF-8?q?=D0=B4=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=BF=D1=80=D0=BE=D0=B5=D0=BA=D1=82=D0=B0=20(?= =?UTF-8?q?=E2=84=961)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests.py | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/tests.py b/tests.py index ada2fcc..b8bebe6 100644 --- a/tests.py +++ b/tests.py @@ -21,10 +21,13 @@ def test_add_new_book_add_two_books(self): #1 assert len(collector.get_books_genre()) == 2 # исправил на collector.get_books_genre() # чтобы тесты были независимыми в каждом из них создавай отдельный экземпляр класса BooksCollector() - def test_add_new_book_with_too_long_name_not_added(self): #2, тест на слишком длинное название книги - collector = BooksCollector() - collector.add_new_book('A' * 41) - assert len(collector.get_books_genre()) == 0 + @pytest.mark.parametrize('name, expected_added', [('A' * 39, True), ('A' * 40, True), ('A' * 41, False)]) + def test_add_new_book_name_length_boundaries(self, collector, name, expected_added): + collector.add_new_book(name) + if expected_added: + assert name in collector.get_books_genre() + else: + assert name not in collector.get_books_genre() def test_add_new_book_with_same_name_not_added(self): #3, тест на дупликат collector = BooksCollector() @@ -32,16 +35,15 @@ def test_add_new_book_with_same_name_not_added(self): #3, тест на дуп collector.add_new_book('Гнев дяди Андрея') assert len(collector.get_books_genre()) == 1 - @pytest.mark.parametrize("book_name, genre, expected_genre", - [('Существующая', 'Фантастика', 'Фантастика'), ('Неизвестная', 'Комедии', None)]) - #4, параметризованный тест на существующую / несуществующую книгу - def test_set_book_genre_with_parametrize(self, collector, book_name, genre, expected_genre): - collector.add_new_book('Существующая') - collector.set_book_genre(book_name, genre) - if book_name == 'Существующая': - assert collector.get_book_genre(book_name) == expected_genre - else: - assert collector.get_book_genre('Существующая') == '' + def test_set_book_genre_existing_book(self, collector): #4, тест на успешную установку жанра существующей книге + collector.add_new_book('Гнев дяди Андрея') + collector.set_book_genre('Гнев дяди Андрея', 'Фантастика') + assert collector.get_book_genre('Гнев дяди Андрея') == 'Фантастика' + + def test_set_book_genre_unknown_book_no_effect(self, collector): #5, тест на установку жанра несуществующей книге без эффекта + collector.add_new_book('Гнев дяди Андрея') + collector.set_book_genre('Добри дядя Андрюша', 'Комедии') + assert collector.get_book_genre('Гнев дяди Андрея') == '' def test_get_books_with_specific_genres(self, collector): #5, тест на получение списка книг по жанру collector.add_new_book('Кн1')