diff --git a/README.md b/README.md index 1cc701d..8b01540 100644 --- a/README.md +++ b/README.md @@ -1 +1,58 @@ -# qa_python \ No newline at end of file +Unit-тесты для приложения BooksCollector. Оно позволяет установить жанр книг и добавить их в избранное. + +Класс BooksCollector содержит: +Словарь books_genre, куда можно добавить пару Название книги: Жанр книги. +Список favorites, который содержит избранные книги. +Список genre, который содержит доступные жанры. +Список genre_age_rating, который содержит жанры с возрастным рейтингом. + +Набор методов для работы со словарем books_genre и списком favorites: + +1. add_new_book — добавляет новую книгу в словарь без указания жанра. Название книги может содержать максимум 40 символов. Одну и ту же книгу можно добавить только один раз. Покрыт тестами 1.1 Проверка добавления одной новой книги, 1.2 Проверка что нет двойного добавления одной книги и 1.3 Проверка добавления новой книги с названием в 0, 41 символ. Проверка добавления книги с допустимой длинной названия в тесте 1.1 и 1.4 Проверка ГЗ названий книг в 1 и 40 символов. + +2. set_book_genre — устанавливает жанр книги, если книга есть в books_genre и её жанр входит в список genre. Покрвыается тестами 2.1 Проверка валидного жанра если книга есть в словаре books_genre и её жанр входит в список genre и 2.2 Проверка невалидного жанра если книга есть в словаре books_genre и её жанр не входит в список genre. + +3. get_book_genre — выводит жанр книги по её имени. Покрыт тестом номер 3 Проверка получения жанра книги по её имени + +4. get_books_with_specific_genre — выводит список книг с определённым жанром. Покрыт тестом номер 4 Проверка вывода списка книг с определённым жанром + +5. get_books_for_children — возвращает книги, которые подходят детям. У жанра книги не должно быть возрастного рейтинга. Покрыт тестом 5 Проверка получения книг для детей + +6. add_book_in_favorites — добавляет книгу в избранное. Книга должна находиться в словаре books_genre. Повторно добавить книгу в избранное нельзя. +Метод покрыт тестами 6.1 Проверка добавления книги в Избранное и 6.2 Проверка двойного добавления книги в Избранное + +7. delete_book_from_favorites — удаляет книгу из избранного, если она там есть. Покрыт 9 Проверка удаления книги из Избранного + +8. get_list_of_favorites_books — получает список избранных книг. Покрыт 8 Проверка получения списка Избранных книг + +Для тестов написаны две фикстуры. Они вынесены в отдельный файл conftest.py + +Проведено 16 тестов: 16 passed in 0.11s +Все методы покрыты тестами. + +platform win32 -- Python 3.12.10, pytest-8.4.2, pluggy-1.6.0 -- C:\Users\anna_\AppData\Local\Microsoft\WindowsApps\PythonSoftwareFoundation.Python.3.12_qbz5n2kfra8p0\python.exe +cachedir: .pytest_cache +rootdir: C:\my_first_vscode_project +collected 16 items + +qa_python_4/qa_python/tests.py::TestBooksCollector::test_add_new_book_plus_one_book PASSED [ 6%] +qa_python_4/qa_python/tests.py::TestBooksCollector::test_add_new_book_add_one_book_two_times_not_possible PASSED [ 12%] +qa_python_4/qa_python/tests.py::TestBooksCollector::test_add_new_book_not_valid_book_name[] PASSED [ 18%] +qa_python_4/qa_python/tests.py::TestBooksCollector::test_add_new_book_not_valid_book_name[\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043d\u0438\u0433\u0438 \u0432 41 \u0441\u0438\u043c\u0432\u043e\u043b \u0441\u043e\u0432\u0441\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e] PASSED [ 25%] +qa_python_4/qa_python/tests.py::TestBooksCollector::test_add_new_book_valid_book_name[O] PASSED [ 31%] +qa_python_4/qa_python/tests.py::TestBooksCollector::test_add_new_book_valid_book_name[\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043d\u0438\u0433\u0438 \u0432 40 \u0441\u0438\u043c\u0432\u043e\u043b \u0441\u043e\u0432\u0441\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e] PASSED [ 37%] +qa_python_4/qa_python/tests.py::TestBooksCollector::test_set_book_genre_valid PASSED [ 43%] +qa_python_4/qa_python/tests.py::TestBooksCollector::test_set_book_genre_not_valid PASSED [ 50%] +qa_python_4/qa_python/tests.py::TestBooksCollector::test_set_book_genre_book_not_in_book_genre PASSED [ 56%] +qa_python_4/qa_python/tests.py::TestBooksCollector::test_get_book_genre_return_genre_set PASSED [ 62%] +qa_python_4/qa_python/tests.py::TestBooksCollector::test_get_books_with_specific_genre_get_book_by_genre PASSED [ 68%] +qa_python_4/qa_python/tests.py::TestBooksCollector::test_get_books_for_children_get_book_without_age_rating_possible PASSED [ 75%] +qa_python_4/qa_python/tests.py::TestBooksCollector::test_add_book_in_favorites_add_new_book_possible PASSED [ 81%] +qa_python_4/qa_python/tests.py::TestBooksCollector::test_add_book_in_favorites_add_one_book_two_times_not_possible PASSED [ 87%] +qa_python_4/qa_python/tests.py::TestBooksCollector::test_delete_book_from_favorites_delete_book_possible PASSED [ 93%] +qa_python_4/qa_python/tests.py::TestBooksCollector::test_get_list_of_favorites_books_get_list_of_favorites_books_successful PASSED + + + + + diff --git a/__pycache__/conftest.cpython-312-pytest-8.4.2.pyc b/__pycache__/conftest.cpython-312-pytest-8.4.2.pyc new file mode 100644 index 0000000..804521c Binary files /dev/null and b/__pycache__/conftest.cpython-312-pytest-8.4.2.pyc differ diff --git a/__pycache__/main.cpython-312.pyc b/__pycache__/main.cpython-312.pyc new file mode 100644 index 0000000..f4f7308 Binary files /dev/null and b/__pycache__/main.cpython-312.pyc differ diff --git a/__pycache__/tests.cpython-312-pytest-8.4.2.pyc b/__pycache__/tests.cpython-312-pytest-8.4.2.pyc new file mode 100644 index 0000000..6f58b4e Binary files /dev/null and b/__pycache__/tests.cpython-312-pytest-8.4.2.pyc differ diff --git a/conftest.py b/conftest.py new file mode 100644 index 0000000..206d8ca --- /dev/null +++ b/conftest.py @@ -0,0 +1,17 @@ +import pytest # импортируем библиотеку pytest +from main import BooksCollector # импортируем класс BooksCollector из файла main + +@pytest.fixture # декаратор +def books_collection(): + books_collection=BooksCollector() # создает новый экземпляр BooksCollector когда тест запрашивает фикстуру с именем books_collection + return books_collection # имя фикстуры должно быть указано как параметр тестовой функции + +@pytest.fixture +def random_book(books_collection): + random_book = books_collection + title = ['Тестовая книга фантастики', 'Тестовая книга ужасов', 'Тестовая книга с детективами', 'Тестовая книга про мультфильмы', 'Тестовая книга комедий'] + genre = ['Фантастика', 'Ужасы', 'Детективы', 'Мультфильмы', 'Комедии'] + for i in range(5): + random_book.add_new_book(title[i]) + random_book.set_book_genre(title[i], genre[i]) + return random_book \ No newline at end of file diff --git a/tests.py b/tests.py index 383385e..2372650 100644 --- a/tests.py +++ b/tests.py @@ -1,24 +1,126 @@ -from main import BooksCollector +import pytest +from main import BooksCollector # импортируем класс BooksCollector из файла main + # класс TestBooksCollector объединяет набор тестов, которыми мы покрываем наше приложение BooksCollector # обязательно указывать префикс Test class TestBooksCollector: + +# 1 Проверка добавления новой книги (add_new_book) +# 1.1 Проверка добавления одной новой книги + def test_add_new_book_plus_one_book(self): # в имени функции test_ название тестируемого метода указание что тестируем +# self показывает, что этот метод является методом класса + collector = BooksCollector() # создаем объект класса BooksCollector + collector.add_new_book('Новая книга ужасов') # добавляем новую книгу + assert collector.get_books_genre() == {'Новая книга ужасов': ''} # проверяем, что добавилась одна книга + +# 1.2 Проверка что нет двойного добавления одной книги + + def test_add_new_book_add_one_book_two_times_not_possible(self): + collector = BooksCollector() # создаем объект класса BooksCollector + collector.add_new_book('Новая книга') + collector.add_new_book('Новая книга') + assert collector.get_books_genre() == {'Новая книга': ''} # проверяем, что добавилась одна книга + +# 1.3 Проверка добавления новой книги с названием в 0, 41 символ + + @pytest.mark.parametrize('book_name', ['', 'Название книги в 41 символ совсем просто']) + def test_add_new_book_not_valid_book_name(self, book_name, books_collection): + books_collection=BooksCollector() + books_collection.add_new_book(book_name) + assert len(books_collection.get_books_genre()) == 0 + + +# 1.4 Проверка ГЗ названий книг в 1 и 40 символов. + + @pytest.mark.parametrize('book_name', ['O', 'Название книги в 40 символ совсем просто']) + def test_add_new_book_valid_book_name(self, book_name, books_collection): + books_collection.add_new_book(book_name) + assert book_name in books_collection.get_books_genre() + +# 2 Проверка жанра книги +# 2.1 Проверка валидного жанра если книга есть в словаре books_genre и её жанр входит в список genre. + + def test_set_book_genre_valid(self): + collector = BooksCollector() # создаем объект класса BooksCollector + collector.add_new_book('Новая книга фантастики') + collector.set_book_genre('Новая книга фантастики', 'Фантастика') + assert collector.get_books_genre() == {'Новая книга фантастики': 'Фантастика'} + +# 2.2 Проверка невалидного жанра если книга есть в словаре books_genre и её жанр не входит в список genre. + + def test_set_book_genre_not_valid(self): + collector = BooksCollector() # создаем объект класса BooksCollector + collector.add_new_book('Новая книга болтовни') + collector.set_book_genre('Новая книга болтовни', 'Болтовня') + assert collector.get_books_genre() == {'Новая книга болтовни': ''} + +# 2.3 Проверка валидного жанра если книги нет в словаре books_genre. + + def test_set_book_genre_book_not_in_book_genre(self): + collector = BooksCollector() # создаем объект класса BooksCollector + collector.set_book_genre('Новая книга с детективом', 'Детектив') + assert collector.get_books_genre() == {} + +# 3 Проверка получения жанра книги по её имени + + def test_get_book_genre_return_genre_set(self): + collector = BooksCollector() # создаем объект класса BooksCollector + collector.add_new_book('Новая книга фантастики') + collector.set_book_genre('Новая книга фантастики', 'Фантастика') + assert collector.get_book_genre('Новая книга фантастики') == 'Фантастика' + # здесь и далее замена создания объекта (экземпляра класса) на использование фикстуры collector через параметр + +# 4 Проверка вывода списка книг с определённым жанром + + def test_get_books_with_specific_genre_get_book_by_genre(self): + collector = BooksCollector() # создаем объект класса BooksCollector + collector.add_new_book('Новая книга ужасов') + collector.set_book_genre('Новая книга ужасов','Ужасы') + collector.add_new_book('Новая книга ужасов 2') + collector.set_book_genre('Новая книга ужасов 2','Ужасы') + assert len(collector.get_books_with_specific_genre('Ужасы')) == 2 + +# 5 Проверка получения книг для детей + + def test_get_books_for_children_get_book_without_age_rating_possible(self, random_book): + assert len(random_book.get_books_for_children()) == 3 + +# 6 Проверка добавления книги в Избранное +# 6.1 Проверка добавления книги в Избранное + + def test_add_book_in_favorites_add_new_book_possible(self): + collector = BooksCollector() # создаем объект класса BooksCollector + collector.add_new_book('Новая книга ужасов') + collector.set_book_genre('Новая книга ужасов','Ужасы') + collector.add_book_in_favorites('Новая книга ужасов') + assert len(collector.get_list_of_favorites_books()) == 1 + +# 6.2 Проверка двойного добавления книги в Избранное + + def test_add_book_in_favorites_add_one_book_two_times_not_possible(self): + collector = BooksCollector() # создаем объект класса BooksCollector + collector.add_new_book('Новая книга ужасов') + collector.set_book_genre('Новая книга ужасов','Ужасы') + collector.add_book_in_favorites('Новая книга ужасов') + collector.add_book_in_favorites('Новая книга ужасов') + assert len(collector.get_list_of_favorites_books()) == 1 - # пример теста: - # обязательно указывать префикс test_ - # дальше идет название метода, который тестируем add_new_book_ - # затем, что тестируем add_two_books - добавление двух книг - def test_add_new_book_add_two_books(self): - # создаем экземпляр (объект) класса BooksCollector - collector = BooksCollector() +# 7 Проверка удаления книги из Избранного - # добавляем две книги - collector.add_new_book('Гордость и предубеждение и зомби') - collector.add_new_book('Что делать, если ваш кот хочет вас убить') + def test_delete_book_from_favorites_delete_book_possible(self): + collector = BooksCollector() # создаем объект класса BooksCollector + collector.add_book_in_favorites('Новая книга ужасов') + collector.set_book_genre('Новая книга ужасов','Ужасы') + collector.delete_book_from_favorites('Новая книга ужасов') + favorites = collector.get_list_of_favorites_books() + assert 'Новая книга ужасов' not in favorites - # проверяем, что добавилось именно две - # словарь books_rating, который нам возвращает метод get_books_rating, имеет длину 2 - assert len(collector.get_books_rating()) == 2 +# 8 Проверка получения списка Избранных книг - # напиши свои тесты ниже - # чтобы тесты были независимыми в каждом из них создавай отдельный экземпляр класса BooksCollector() \ No newline at end of file + def test_get_list_of_favorites_books_get_list_of_favorites_books_successful(self): + collector = BooksCollector() # создаем объект класса BooksCollector + collector.add_new_book('Новая книга ужасов') + collector.set_book_genre('Новая книга ужасов','Ужасы') + collector.add_book_in_favorites('Новая книга ужасов') + assert len(collector.get_list_of_favorites_books()) == 1 \ No newline at end of file