From ab619d88377ae18e939793d662e7320b1cae0d09 Mon Sep 17 00:00:00 2001 From: Ulugbek Sharipov Date: Mon, 24 Mar 2025 15:37:39 +0500 Subject: [PATCH 1/2] =?UTF-8?q?=D1=82=D0=B5=D1=81=D1=82=D0=BE=D0=B2=D1=8B?= =?UTF-8?q?=D0=B9=20=D0=BA=D0=BE=D0=BC=D0=BC=D0=B8=D1=82,=20=D0=BD=D0=B5?= =?UTF-8?q?=20=D0=BD=D1=83=D0=B6=D0=BD=D0=BE=20=D0=BE=D0=B1=D1=80=D0=B0?= =?UTF-8?q?=D1=89=D0=B0=D1=82=D1=8C=20=D0=B2=D0=BD=D0=B8=D0=BC=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test.py | 1 + 1 file changed, 1 insertion(+) create mode 100644 test.py diff --git a/test.py b/test.py new file mode 100644 index 0000000..bf330c3 --- /dev/null +++ b/test.py @@ -0,0 +1 @@ +# добавляю тестовый файл для того, чтобы убедиться, что все работает перед тем, как начать работать \ No newline at end of file From 23195befe9189ca444285dc0fcc4a4db104cbd74 Mon Sep 17 00:00:00 2001 From: Ulugbek Sharipov Date: Mon, 24 Mar 2025 22:35:32 +0500 Subject: [PATCH 2/2] =?UTF-8?q?=D0=A2=D0=B5=D1=81=D1=82=D1=8B=20=D0=BD?= =?UTF-8?q?=D0=B0=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 40 ++++++++++++++++++- conftest.py | 6 +++ data.py | 7 ++++ main.py | 11 +----- tests.py | 112 ++++++++++++++++++++++++++++++++++++++++++++-------- 5 files changed, 149 insertions(+), 27 deletions(-) create mode 100644 conftest.py create mode 100644 data.py diff --git a/README.md b/README.md index 1cc701d..208bd3e 100644 --- a/README.md +++ b/README.md @@ -1 +1,39 @@ -# qa_python \ No newline at end of file +# qa_python +Спринт 4 +Улугбек Шарипов + +Реализованные тесты по BooksCollector: + 1. add_new_book_success: + • Тест для добавления новой книги в коллекцию. + 2. add_multiple_books: + • Тест для добавления нескольких книг в коллекцию. + 3. set_book_genre_success_book_is_added: + • Тест для установки жанра добавленной книги. + 4. set_book_genre_book_not_in_genre: + • Тест для проверки, что для несуществующей книги не будет установлено жанра. + 5. get_books_for_children: + • Тест, проверяющий, что книги с возрастным рейтингом не попадают в список книг для детей. + 6. add_book_in_favorites: + • Тест для добавления книги в избранное. + 7. add_book_duplicate_not_in_favorites: + • Тест, проверяющий, что одна и та же книга не может быть добавлена в избранное несколько раз. + 8. delete_book_from_favorites: + • Тест для удаления книги из избранного. + 9. get_books_with_specific_genre: + • Тест для получения книг с определённым жанром. + 10. get_books_genre: + • Тест для получения всех книг и их жанров. + 11. get_one_book_genre: + • Тест для получения жанра одной книги. + + +Test Coverage Report +# tests.py ............... [100%] + +---------- coverage: platform darwin, python 3.12.3-final-0 ---------- +Name Stmts Miss Cover +----------------------------- +main.py 38 0 100% +----------------------------- +TOTAL 38 0 100% + diff --git a/conftest.py b/conftest.py new file mode 100644 index 0000000..77e5aef --- /dev/null +++ b/conftest.py @@ -0,0 +1,6 @@ +import pytest +from main import BooksCollector + +@pytest.fixture +def collector(): + return BooksCollector() \ No newline at end of file diff --git a/data.py b/data.py new file mode 100644 index 0000000..714b3d7 --- /dev/null +++ b/data.py @@ -0,0 +1,7 @@ +BOOKS = [ + "Эго - Твой Враг", + "Мирный Воин" +] + +GENRES = ['Фантастика', 'Ужасы', 'Детективы', 'Мультфильмы', 'Комедии'] +GENRES_AGE_RATING = ['Ужасы', 'Детективы'] diff --git a/main.py b/main.py index d3e0a17..29c18a9 100644 --- a/main.py +++ b/main.py @@ -6,21 +6,17 @@ def __init__(self): self.genre = ['Фантастика', 'Ужасы', 'Детективы', 'Мультфильмы', 'Комедии'] self.genre_age_rating = ['Ужасы', 'Детективы'] - # добавляем новую книгу def add_new_book(self, name): if not self.books_genre.get(name) and 0 < len(name) < 41: self.books_genre[name] = '' - # устанавливаем книге жанр def set_book_genre(self, name, genre): if name in self.books_genre and genre in self.genre: self.books_genre[name] = genre - # получаем жанр книги по её имени def get_book_genre(self, name): return self.books_genre.get(name) - # выводим список книг с определённым жанром def get_books_with_specific_genre(self, genre): books_with_specific_genre = [] if self.books_genre and genre in self.genre: @@ -29,11 +25,9 @@ def get_books_with_specific_genre(self, genre): books_with_specific_genre.append(name) return books_with_specific_genre - # получаем словарь books_genre def get_books_genre(self): return self.books_genre - # возвращаем книги, подходящие детям def get_books_for_children(self): books_for_children = [] for name, genre in self.books_genre.items(): @@ -41,17 +35,14 @@ def get_books_for_children(self): books_for_children.append(name) return books_for_children - # добавляем книгу в Избранное def add_book_in_favorites(self, name): if name in self.books_genre: if name not in self.favorites: self.favorites.append(name) - # удаляем книгу из Избранного def delete_book_from_favorites(self, name): if name in self.favorites: self.favorites.remove(name) - # получаем список Избранных книг def get_list_of_favorites_books(self): - return self.favorites + return self.favorites \ No newline at end of file diff --git a/tests.py b/tests.py index 383385e..039c3a9 100644 --- a/tests.py +++ b/tests.py @@ -1,24 +1,104 @@ +import pytest from main import BooksCollector +from data import * + -# класс TestBooksCollector объединяет набор тестов, которыми мы покрываем наше приложение BooksCollector -# обязательно указывать префикс Test class TestBooksCollector: - # пример теста: - # обязательно указывать префикс test_ - # дальше идет название метода, который тестируем add_new_book_ - # затем, что тестируем add_two_books - добавление двух книг - def test_add_new_book_add_two_books(self): - # создаем экземпляр (объект) класса BooksCollector + @pytest.mark.parametrize('book_name', BOOKS) + def test_add_new_book_success(self, collector, book_name): + collector.add_new_book(book_name) + + assert book_name in collector.get_books_genre() + + def test_add_multiple_books(self, collector): + for book_name in BOOKS: + collector.add_new_book(book_name) + + assert book_name in collector.get_books_genre() + + def test_set_book_genre_success_book_is_added(self, collector): + book_name = '1984' + genre = 'Детективы' + + collector.add_new_book(book_name) + collector.set_book_genre(book_name, genre) + + assert collector.get_book_genre(book_name) == genre + + def test_set_book_genre_book_not_in_genre(self, collector): + book_name = "Неизвестная книга" + genre = "Фантастика" + + collector.set_book_genre(book_name, genre) + + assert collector.get_book_genre(book_name) is None + + def test_get_books_for_children(self): collector = BooksCollector() - # добавляем две книги - collector.add_new_book('Гордость и предубеждение и зомби') - collector.add_new_book('Что делать, если ваш кот хочет вас убить') + book_name_for_kids = 'Смешарики' + book_name_for_adults = 'Астрал' + + collector.add_new_book(book_name_for_kids) + collector.set_book_genre(book_name_for_kids, 'Мультфильмы') + + collector.add_new_book(book_name_for_adults) + collector.set_book_genre(book_name_for_adults, 'Ужасы') + + books_for_children = collector.get_books_for_children() + + assert book_name_for_kids in books_for_children + assert book_name_for_adults not in books_for_children + + def test_add_book_in_favorites(self, collector): + book_name = '1984' + + collector.add_new_book(book_name) + collector.add_book_in_favorites(book_name) + + assert book_name in collector.get_list_of_favorites_books() + + def test_add_book_duplicate_not_in_favorites(self, collector): + book_name = '1984' + + collector.add_new_book(book_name) + collector.add_book_in_favorites(book_name) + collector.add_book_in_favorites(book_name) + + assert collector.get_list_of_favorites_books().count(book_name) == 1 + + def test_delete_book_from_favorites(self, collector): + book_name = '1984' + + collector.add_new_book(book_name) + collector.add_book_in_favorites(book_name) + collector.delete_book_from_favorites(book_name) + + assert book_name not in collector.get_list_of_favorites_books() + + @pytest.mark.parametrize('book_name, genre', [ + ('Эго - Твой Враг', 'Фантастика'), + ('Мирный Воин', 'Детективы'), + ]) + def test_get_books_with_specific_genre(self, collector, book_name, genre): + collector.add_new_book(book_name) + collector.set_book_genre(book_name, genre) + books_with_genre = collector.get_books_with_specific_genre(genre) + assert book_name in books_with_genre - # проверяем, что добавилось именно две - # словарь books_rating, который нам возвращает метод get_books_rating, имеет длину 2 - assert len(collector.get_books_rating()) == 2 + @pytest.mark.parametrize('book_name', BOOKS) + def test_get_books_genre(self, collector, book_name): + collector.add_new_book(book_name) + books_genre = collector.get_books_genre() + assert book_name in books_genre - # напиши свои тесты ниже - # чтобы тесты были независимыми в каждом из них создавай отдельный экземпляр класса BooksCollector() \ No newline at end of file + @pytest.mark.parametrize('book_name, genre', [ + ('Эго - Твой Враг', 'Фантастика'), + ('Мирный Воин', 'Комедии'), + ]) + def test_get_one_book_genre(self, collector, book_name, genre): + collector.add_new_book(book_name) + collector.set_book_genre(book_name, genre) + book_genre = collector.get_book_genre(book_name) + assert book_genre == genre