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
40 changes: 39 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,39 @@
# qa_python
# 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%

6 changes: 6 additions & 0 deletions conftest.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import pytest
from main import BooksCollector

@pytest.fixture
def collector():
return BooksCollector()
7 changes: 7 additions & 0 deletions data.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
BOOKS = [
"Эго - Твой Враг",
"Мирный Воин"
]

GENRES = ['Фантастика', 'Ужасы', 'Детективы', 'Мультфильмы', 'Комедии']
GENRES_AGE_RATING = ['Ужасы', 'Детективы']
11 changes: 1 addition & 10 deletions main.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -29,29 +25,24 @@ 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():
if genre not in self.genre_age_rating and genre in self.genre:
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
1 change: 1 addition & 0 deletions test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# добавляю тестовый файл для того, чтобы убедиться, что все работает перед тем, как начать работать
112 changes: 96 additions & 16 deletions tests.py
Original file line number Diff line number Diff line change
@@ -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()
@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