From befd748cd384fa01f1e3e115143c3238a4c8533d Mon Sep 17 00:00:00 2001 From: Anastasia Nogovitcina Date: Fri, 6 Mar 2026 10:44:39 +0800 Subject: [PATCH 1/2] add tests --- .gitignore | 1 + README.md | 22 +++++++++++++- tests.py | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 106 insertions(+), 2 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bee8a64 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +__pycache__ diff --git a/README.md b/README.md index 1cc701d..e1a0dfb 100644 --- a/README.md +++ b/README.md @@ -1 +1,21 @@ -# qa_python \ No newline at end of file +# qa_python +1. add_new_book- добавляется книга с валидным названием и не указаным жанром + +2. add_new_book- не добавляет книгу, если длина имени невалидная (параметризация) + +3. add_new_book- не добавляет дубликат книгт + +4. set_book_genre- устанавливает жанр, если книга есть и жанр находится в списке + +5. set_book_genre- не меняет жанр, если жанр недопустимый + +6. get_book_genre- возвращает None для неизвестной книги + +7. get_books_with_specific_genre- возвращает только книги нужного жанра + +8. get_books_genre- выводит текущий словарь + +9. get_books_for_children- книги с возрастным рейтингом не попадают (параметризация) + +10. add_book_in_favorites/delete_book_from_favorites/get_list_of_favorites_books- +добавляет в избранное книгу только из словаря(повторно добавить книгу нельзя)/удаляет книгу из избранного, если она там есть/получает список избранных книг \ No newline at end of file diff --git a/tests.py b/tests.py index 383385e..73b81e1 100644 --- a/tests.py +++ b/tests.py @@ -1,3 +1,4 @@ +import pytest from main import BooksCollector # класс TestBooksCollector объединяет набор тестов, которыми мы покрываем наше приложение BooksCollector @@ -21,4 +22,86 @@ def test_add_new_book_add_two_books(self): assert len(collector.get_books_rating()) == 2 # напиши свои тесты ниже - # чтобы тесты были независимыми в каждом из них создавай отдельный экземпляр класса BooksCollector() \ No newline at end of file + # чтобы тесты были независимыми в каждом из них создавай отдельный экземпляр класса BooksCollector() + + +class TestBooksCollector: + + def test_add_new_book_add_two_books(self): + collector = BooksCollector() + collector.add_new_book('Старик и море') + collector.add_new_book('На Западном фронте без перемен') + assert len(collector.get_books_genre()) == 2 + + def test_add_new_book_adds_book_with_empty_genre(self): + collector = BooksCollector() + collector.add_new_book('Мастер и Маргарита') + assert collector.get_book_genre('Мастер и Маргарита') == '' + + @pytest.mark.parametrize('name', ['', 'a' * 41]) + def test_add_new_book_not_add_invalid_length_name(self, name): + collector = BooksCollector() + collector.add_new_book(name) + assert name not in collector.get_books_genre() + + def test_add_new_book_not_add_duplicate(self): + collector = BooksCollector() + collector.add_new_book('Заводной апельсин') + collector.add_new_book('Заводной апельсин') + assert list(collector.get_books_genre().keys()).count('Заводной апельсин') == 1 + + def test_set_book_genre_sets_genre_for_existing_book(self): + collector = BooksCollector() + collector.add_new_book('Война миров') + collector.set_book_genre('Война миров', 'Фантастика') + assert collector.get_book_genre('Война миров') == 'Фантастика' + + def test_set_book_genre_not_set_when_genre_invalid(self): + collector = BooksCollector() + collector.add_new_book('Грозовой перевал') + collector.set_book_genre('Грозовой перевал', 'Роман') + assert collector.get_book_genre('Грозовой перевал') == '' + + def test_get_book_genre_returns_none_for_unknown_book(self): + collector = BooksCollector() + assert collector.get_book_genre('Несуществующая') is None + + def test_get_books_with_specific_genre_returns_filtered_list(self): + collector = BooksCollector() + collector.add_new_book('Дюна') + collector.add_new_book('Оно') + collector.set_book_genre('Дюна', 'Фантастика') + collector.set_book_genre('Оно', 'Ужасы') + assert collector.get_books_with_specific_genre('Ужасы') == ['Оно'] + + def test_get_books_genre_returns_current_dict(self): + collector = BooksCollector() + collector.add_new_book('Дюна') + collector.set_book_genre('Дюна', 'Фантастика') + assert collector.get_books_genre() == {'Дюна': 'Фантастика'} + + @pytest.mark.parametrize('adult_genre', ['Ужасы', 'Детективы']) + def test_get_books_for_children_excludes_age_rated_genres(self, adult_genre): + collector = BooksCollector() + collector.add_new_book('Калигула 18+') + collector.set_book_genre('Калигула 18+', adult_genre) + + collector.add_new_book('Винни-Пух') + collector.set_book_genre('Винни-Пух', 'Мультфильмы') + + children = collector.get_books_for_children() + assert 'Винни-Пух' in children + assert 'Калигула 18+' not in children + + def test_favorites_add_no_duplicates_and_delete(self): + collector = BooksCollector() + collector.add_new_book('Дом в котором') + + collector.add_book_in_favorites('Дом в котором') + collector.add_book_in_favorites('Дом в котором') + collector.add_book_in_favorites('Такой книги нет') + + assert collector.get_list_of_favorites_books() == ['Дом в котором'] + + collector.delete_book_from_favorites('Дом в котором') + assert collector.get_list_of_favorites_books() == [] \ No newline at end of file From ee7762029e5239f910b8e5d88320a7ee196b6ed4 Mon Sep 17 00:00:00 2001 From: Anastasia Nogovitcina Date: Mon, 9 Mar 2026 03:12:55 +0100 Subject: [PATCH 2/2] fix --- tests.py | 42 ++++++++++++++++-------------------------- 1 file changed, 16 insertions(+), 26 deletions(-) diff --git a/tests.py b/tests.py index 73b81e1..219d06a 100644 --- a/tests.py +++ b/tests.py @@ -4,29 +4,6 @@ # класс TestBooksCollector объединяет набор тестов, которыми мы покрываем наше приложение BooksCollector # обязательно указывать префикс Test class TestBooksCollector: - - # пример теста: - # обязательно указывать префикс test_ - # дальше идет название метода, который тестируем add_new_book_ - # затем, что тестируем add_two_books - добавление двух книг - def test_add_new_book_add_two_books(self): - # создаем экземпляр (объект) класса BooksCollector - collector = BooksCollector() - - # добавляем две книги - collector.add_new_book('Гордость и предубеждение и зомби') - collector.add_new_book('Что делать, если ваш кот хочет вас убить') - - # проверяем, что добавилось именно две - # словарь books_rating, который нам возвращает метод get_books_rating, имеет длину 2 - assert len(collector.get_books_rating()) == 2 - - # напиши свои тесты ниже - # чтобы тесты были независимыми в каждом из них создавай отдельный экземпляр класса BooksCollector() - - -class TestBooksCollector: - def test_add_new_book_add_two_books(self): collector = BooksCollector() collector.add_new_book('Старик и море') @@ -93,15 +70,28 @@ def test_get_books_for_children_excludes_age_rated_genres(self, adult_genre): assert 'Винни-Пух' in children assert 'Калигула 18+' not in children - def test_favorites_add_no_duplicates_and_delete(self): + def test_favorites_add_no_duplicates(self): collector = BooksCollector() collector.add_new_book('Дом в котором') collector.add_book_in_favorites('Дом в котором') collector.add_book_in_favorites('Дом в котором') - collector.add_book_in_favorites('Такой книги нет') assert collector.get_list_of_favorites_books() == ['Дом в котором'] + def test_favorites_delete(self): + collector = BooksCollector() + collector.add_new_book('Дом в котором') + + collector.add_book_in_favorites('Дом в котором') + collector.delete_book_from_favorites('Дом в котором') - assert collector.get_list_of_favorites_books() == [] \ No newline at end of file + assert collector.get_list_of_favorites_books() == [] + + def test_favorites_add_not_existing(self): + collector = BooksCollector() + collector.add_new_book('Дом в котором') + + collector.add_book_in_favorites('Такой книги нет') + + assert collector.get_list_of_favorites_books() == [] \ No newline at end of file