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
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
__pycache__/
*.py[cod]
.pytest_cache/
venv/
.venv/
13 changes: 12 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,12 @@
# qa_python
## Описание тестов

- `test_add_new_book_add_one_book` — проверка успешного добавления одной книги.
- `test_add_new_book_invalid_name_length_not_added` — проверка, что книги с некорректной длиной названия (0 или 41+ символов) не добавляются.
- `test_set_book_genre_existing_genre` — проверка установки жанра из списка разрешённых.
- `test_set_book_genre_not_in_list_not_set` — проверка, что жанр не устанавливается, если его нет в списке `genre`.
- `test_get_books_with_specific_genre_is_correct` — проверка фильтрации книг по выбранному жанру.
- `test_get_books_genre_returns_dict` — проверка корректного возврата всего словаря книг.
- `test_get_books_for_children_excludes_age_rating_genres` — проверка, что книги с жанрами из `genre_age_rating` не попадают в детский список.
- `test_add_book_in_favorites_added_successfully` — проверка успешного добавления книги в список избранного.
- `test_add_book_in_favorites_book_not_in_collector_not_added` — проверка запрета на добавление в избранное книг, отсутствующих в коллекции.
- `test_delete_book_from_favorites_removed_successfully` — проверка удаления книги из списка избранного.
Binary file removed __pycache__/main.cpython-38.pyc
Binary file not shown.
Binary file removed __pycache__/test.cpython-38-pytest-7.1.2.pyc
Binary file not shown.
83 changes: 63 additions & 20 deletions tests.py
Original file line number Diff line number Diff line change
@@ -1,24 +1,67 @@
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):
# создаем экземпляр (объект) класса BooksCollector

def test_add_new_book_add_one_book(self):
collector = BooksCollector()

# добавляем две книги
collector.add_new_book('Гордость и предубеждение и зомби')
collector.add_new_book('Что делать, если ваш кот хочет вас убить')

# проверяем, что добавилось именно две
# словарь books_rating, который нам возвращает метод get_books_rating, имеет длину 2
assert len(collector.get_books_rating()) == 2

# напиши свои тесты ниже
# чтобы тесты были независимыми в каждом из них создавай отдельный экземпляр класса BooksCollector()
collector.add_new_book('Гордость и предубеждение')
assert 'Гордость и предубеждение' in collector.get_books_genre()

@pytest.mark.parametrize('name', ['', 'Название книги, которое длиннее сорока одного символа'])

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Отлично: удачное применение параметризации, протестированы разные граничные значения для длины имени

def test_add_new_book_invalid_name_length_not_added(self, name):
collector = BooksCollector()
collector.add_new_book(name)
assert name not in collector.get_books_genre()

def test_set_book_genre_existing_genre(self):
collector = BooksCollector()

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Отлично: в каждом тесте создается собственный экземпляр BooksCollector, но можно лучше - перенести создание экземпляра в фикстуры в отдельный файл conftest, а не повторять это предусловие в каждом тесте

collector.add_new_book('Дюна')
collector.set_book_genre('Дюна', 'Фантастика')
assert collector.get_book_genre('Дюна') == 'Фантастика'

def test_set_book_genre_not_in_list_not_set(self):
collector = BooksCollector()
collector.add_new_book('Дюна')
collector.set_book_genre('Дюна', 'Киберпанк')
assert collector.get_book_genre('Дюна') == ''

def test_get_books_with_specific_genre_is_correct(self):
collector = BooksCollector()
collector.add_new_book('Дракула')
collector.set_book_genre('Дракула', 'Ужасы')
assert 'Дракула' in collector.get_books_with_specific_genre('Ужасы')

def test_get_books_genre_returns_dict(self):
collector = BooksCollector()
collector.add_new_book('Оно')
assert isinstance(collector.get_books_genre(), dict)
assert 'Оно' in collector.get_books_genre()

def test_get_books_for_children_excludes_age_rating_genres(self):
collector = BooksCollector()
collector.add_new_book('Шрек')
collector.set_book_genre('Шрек', 'Мультфильмы')
collector.add_new_book('Сияние')
collector.set_book_genre('Сияние', 'Ужасы')

children_books = collector.get_books_for_children()
assert 'Шрек' in children_books and 'Сияние' not in children_books

def test_add_book_in_favorites_added_successfully(self):
collector = BooksCollector()
collector.add_new_book('Ведьмак')
collector.add_book_in_favorites('Ведьмак')
assert 'Ведьмак' in collector.get_list_of_favorites_books()

def test_add_book_in_favorites_book_not_in_collector_not_added(self):
collector = BooksCollector()
collector.add_book_in_favorites('Неизвестная книга')
assert len(collector.get_list_of_favorites_books()) == 0

def test_delete_book_from_favorites_removed_successfully(self):
collector = BooksCollector()
collector.add_new_book('Гарри Поттер')
collector.add_book_in_favorites('Гарри Поттер')
collector.delete_book_from_favorites('Гарри Поттер')
assert 'Гарри Поттер' not in collector.get_list_of_favorites_books()