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
7 changes: 7 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
__pycache__/
*.log
*.cache
.coverage
__pycache__/
.coverage
htmlcov/
31 changes: 30 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,30 @@
# qa_python

## Фикстуры
1. `collector` - чистый экземпляр BooksCollector
2. `collector_with_books` - подготовленный экземпляр с:
- 2 книгами разных жанров
- 1 книгой в избранном

## Группы тестов

### 1. Тесты добавления книг
- Добавление книги с валидным названием
- Попытка добавить книгу с слишком коротким названием
- Попытка добавить книгу с слишком длинным названием
- Попытка добавить дубликат книги
- Проверка, что у новой книги нет жанра

### 2. Тесты работы с жанрами
- Установка валидного жанра
- Попытка установки недопустимого жанра
- Попытка установки жанра несуществующей книге

### 3. Тесты с подготовленными данными
- Получение книг определенного жанра
- Получение книг для детей (проверка детских жанров)

### 4. Тесты работы с избранным
- Добавление книги в избранное
- Попытка повторного добавления в избранное
- Удаление книги из избранного
- Получение списка избранных книг
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.
101 changes: 84 additions & 17 deletions tests.py
Original file line number Diff line number Diff line change
@@ -1,24 +1,91 @@
import pytest
from main import BooksCollector

# класс TestBooksCollector объединяет набор тестов, которыми мы покрываем наше приложение BooksCollector
# обязательно указывать префикс Test
class TestBooksCollector:
@pytest.fixture
def collector(self):
return BooksCollector()

@pytest.fixture
def collector_with_books(self):
collector = BooksCollector()
collector.add_new_book("Книга 1")
collector.add_new_book("Книга 2")
collector.set_book_genre("Книга 1", "Фантастика")
collector.set_book_genre("Книга 2", "Комедии")
collector.add_book_in_favorites("Книга 1")
return collector

# пример теста:
# обязательно указывать префикс test_
# дальше идет название метода, который тестируем add_new_book_
# затем, что тестируем add_two_books - добавление двух книг
def test_add_new_book_add_two_books(self):
# создаем экземпляр (объект) класса BooksCollector
collector = BooksCollector()
def test_add_new_book_valid_name(self, collector):
collector.add_new_book('Том Сойер')
assert collector.get_book_genre('Том Сойер') is not None

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

# проверяем, что добавилось именно две
# словарь books_rating, который нам возвращает метод get_books_rating, имеет длину 2
assert len(collector.get_books_rating()) == 2
def test_add_new_book_invalid_name_too_long(self, collector):
long_name = 'x' * 41
collector.add_new_book(long_name)
assert collector.get_book_genre(long_name) is None

# напиши свои тесты ниже
# чтобы тесты были независимыми в каждом из них создавай отдельный экземпляр класса BooksCollector()
def test_add_new_book_duplicate(self, collector):
collector.add_new_book('Том Сойер')
collector.add_new_book('Том Сойер')
assert len(collector.get_books_genre()) == 1

def test_added_book_has_no_genre(self, collector):
collector.add_new_book('Том Сойер')
assert collector.get_book_genre('Том Сойер') == ''

def test_set_book_genre_valid(self, collector):
collector.add_new_book('Том Сойер')
collector.set_book_genre('Том Сойер', 'Фантастика')
assert collector.get_book_genre('Том Сойер') == 'Фантастика'

def test_set_book_genre_invalid_genre(self, collector):
collector.add_new_book('Том Сойер')
collector.set_book_genre('Том Сойер', 'Фэнтези')
assert collector.get_book_genre('Том Сойер') == ''

def test_set_book_genre_nonexistent_book(self, collector):
collector.set_book_genre('Несуществующая книга', 'Фантастика')
assert collector.get_book_genre('Несуществующая книга') is None

def test_get_book_genre_for_book_with_genre(self, collector_with_books):
assert collector_with_books.get_book_genre("Книга 1") == "Фантастика"

def test_get_book_genre_for_book_without_genre(self, collector):
collector.add_new_book("Книга без жанра")
assert collector.get_book_genre("Книга без жанра") == ""

def test_get_books_with_specific_genre(self, collector_with_books):
books = collector_with_books.get_books_with_specific_genre('Фантастика')
assert "Книга 1" in books
assert len(books) == 1

def test_get_books_for_children(self, collector_with_books):
children_books = collector_with_books.get_books_for_children()
assert "Книга 1" in children_books
assert "Книга 2" in children_books
assert len(children_books) == 2

def test_add_book_in_favorites(self, collector):
collector.add_new_book('Том Сойер')
collector.add_book_in_favorites('Том Сойер')
assert 'Том Сойер' in collector.get_list_of_favorites_books()

def test_add_book_in_favorites_twice(self, collector):
collector.add_new_book('Том Сойер')
collector.add_book_in_favorites('Том Сойер')
collector.add_book_in_favorites('Том Сойер')
assert len(collector.get_list_of_favorites_books()) == 1

def test_delete_book_from_favorites(self, collector_with_books):
collector_with_books.delete_book_from_favorites("Книга 1")
assert "Книга 1" not in collector_with_books.get_list_of_favorites_books()

def test_get_list_of_favorites_books(self, collector_with_books):
favorites = collector_with_books.get_list_of_favorites_books()
assert "Книга 1" in favorites
assert len(favorites) == 1