Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 58 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,58 @@
# qa_python
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





Binary file added __pycache__/conftest.cpython-312-pytest-8.4.2.pyc
Binary file not shown.
Binary file added __pycache__/main.cpython-312.pyc
Binary file not shown.
Binary file added __pycache__/tests.cpython-312-pytest-8.4.2.pyc
Binary file not shown.
17 changes: 17 additions & 0 deletions conftest.py
Original file line number Diff line number Diff line change
@@ -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
134 changes: 118 additions & 16 deletions tests.py
Original file line number Diff line number Diff line change
@@ -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
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

оптимально было бы сделать фикстуру для создания экземпляра класса и использовать во всех тестах

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 через параметр

This comment was marked as outdated.


# 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('Новая книга ужасов')

This comment was marked as outdated.

assert len(collector.get_list_of_favorites_books()) == 1

This comment was marked as outdated.


# 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('Новая книга ужасов')
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

в этом тесте не хватает шагов

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

This comment was marked as outdated.

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()
def test_get_list_of_favorites_books_get_list_of_favorites_books_successful(self):
collector = BooksCollector() # создаем объект класса BooksCollector

This comment was marked as outdated.

collector.add_new_book('Новая книга ужасов')
collector.set_book_genre('Новая книга ужасов','Ужасы')
collector.add_book_in_favorites('Новая книга ужасов')
assert len(collector.get_list_of_favorites_books()) == 1