diff --git a/README.md b/README.md index 1cc701d..e24af0c 100644 --- a/README.md +++ b/README.md @@ -1 +1,40 @@ -# qa_python \ No newline at end of file +# qa_python + + +Тесты для BooksCollector + +add_new_book +test_add_new_book_added_successfully — книга добавляется успешно +test_add_new_book_parametrized — граничные значения (40 символов, 41 символ, обычное название, пустая строка) +test_add_new_book_duplicate_not_added_twice — дубликат не добавляется +test_add_new_book_default_genre_is_empty_string — жанр по умолчанию пустая строка + +set_book_genre +test_set_book_genre_sets_correctly — жанр устанавливается успешно +test_set_book_genre_not_set_if_book_missing — книги нет в словаре +test_set_book_genre_not_set_if_genre_not_in_list — жанр не из списка + +get_book_genre +test_get_book_genre_returns_genre — возвращает установленный жанр +test_get_book_genre_returns_empty_string_if_genre_not_set — возвращает пустую строку если жанр не задан + +get_books_with_specific_genre +test_get_books_with_specific_genre_returns_correct_books — возвращает правильные книги +test_get_books_with_specific_genre_returns_empty_list_if_no_books — возвращает пустой список + +get_books_for_children +test_get_books_for_children_returns_books_without_age_rating — книга без возрастного рейтинга попадает в список +test_get_books_for_children_excludes_books_with_age_rating — книга с возрастным рейтингом не попадает +test_get_books_for_children_excludes_books_without_genre — книга без жанра не попадает в список + +add_book_in_favorites +test_add_book_in_favorites_added_successfully — книга добавляется в избранное +test_add_book_in_favorites_not_added_if_book_not_in_books_genre — книги нет в словаре +test_add_book_in_favorites_not_added_twice — дубликат не добавляется + +delete_book_from_favorites +test_delete_book_from_favorites_deleted_successfully — книга удаляется из избранного +test_delete_book_from_favorites_no_error_if_book_not_in_favorites — нет ошибки если книги нет в избранном + +get_list_of_favorites_books +test_get_list_of_favorites_books_returns_correct_list — возвращает корректный список \ No newline at end of file diff --git a/__pycache__/main.cpython-38.pyc b/__pycache__/main.cpython-38.pyc deleted file mode 100644 index 5786eeb..0000000 Binary files a/__pycache__/main.cpython-38.pyc and /dev/null differ diff --git a/__pycache__/test.cpython-38-pytest-7.1.2.pyc b/__pycache__/test.cpython-38-pytest-7.1.2.pyc deleted file mode 100644 index b2898a8..0000000 Binary files a/__pycache__/test.cpython-38-pytest-7.1.2.pyc and /dev/null differ diff --git a/conftest.py b/conftest.py new file mode 100644 index 0000000..1da9604 --- /dev/null +++ b/conftest.py @@ -0,0 +1,8 @@ +import pytest + +from main import BooksCollector + +@pytest.fixture +def collector(): + return BooksCollector() + \ No newline at end of file diff --git a/tests.py b/tests.py index 383385e..97613bd 100644 --- a/tests.py +++ b/tests.py @@ -1,24 +1,114 @@ +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 - collector = BooksCollector() + def test_add_new_book_added_successfully(self, collector): + collector.add_new_book('Властелин колец') + assert 'Властелин колец' in collector.get_books_genre() + + @pytest.mark.parametrize('name, expected', [ + ('А' * 40, True), # граница — должна добавиться + ('А' * 41, False), # за границей — не должна + ('Властелин колец', True), # обычное название + ('', False), # пустое — не должна +]) + def test_add_new_book_parametrized(self, collector, name, expected): + collector.add_new_book(name) + assert (name in collector.get_books_genre()) == expected + + def test_add_new_book_empty_name_not_added(self, collector): + collector.add_new_book('') + assert '' not in collector.get_books_genre() + + def test_add_new_book_duplicate_not_added_twice(self, collector): + collector.add_new_book('Властелин колец') + collector.add_new_book('Властелин колец') + assert len(collector.get_books_genre()) == 1 + + def test_get_book_genre_returns_genre(self, collector): + collector.add_new_book('Властелин колец') + collector.set_book_genre('Властелин колец', 'Фантастика') + assert collector.get_book_genre('Властелин колец') == 'Фантастика' + + def test_add_new_book_default_genre_is_empty_string(self, collector): + collector.add_new_book('Властелин колец') + assert collector.get_book_genre('Властелин колец') == '' + + def test_set_book_genre_sets_correctly(self, collector): + collector.add_new_book('Властелин колец') + collector.set_book_genre('Властелин колец', 'Фантастика') + assert collector.get_book_genre('Властелин колец') == 'Фантастика' + + def test_set_book_genre_not_set_if_book_missing(self, collector): + collector.set_book_genre('Несуществующая книга', 'Фантастика') + assert collector.get_book_genre('Несуществующая книга') is None + + def test_set_book_genre_not_set_if_genre_not_in_list(self, collector): + collector.add_new_book('Властелин колец') + collector.set_book_genre('Властелин колец', 'Романтика') + assert collector.get_book_genre('Властелин колец') == '' + + def test_get_book_genre_returns_empty_string_if_genre_not_set(self, collector): + collector.add_new_book('Властелин колец') + assert collector.get_book_genre('Властелин колец') == '' + + def test_get_books_with_specific_genre_returns_correct_books(self, collector): + 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_with_specific_genre_returns_empty_list_if_no_books(self, collector): + collector.add_new_book('Властелин колец') + collector.set_book_genre('Властелин колец', 'Фантастика') + assert collector.get_books_with_specific_genre('Комедии') == [] + + def test_get_books_for_children_returns_books_without_age_rating(self, collector): + collector.add_new_book('Властелин колец') + collector.set_book_genre('Властелин колец', 'Фантастика') + assert 'Властелин колец' in collector.get_books_for_children() + + def test_get_books_for_children_excludes_books_with_age_rating(self, collector): + collector.add_new_book('Оно') + collector.set_book_genre('Оно', 'Ужасы') + assert 'Оно' not in collector.get_books_for_children() + + def test_get_books_for_children_excludes_books_without_genre(self, collector): + collector.add_new_book('Властелин колец') + assert 'Властелин колец' not in collector.get_books_for_children() + + def test_add_book_in_favorites_added_successfully(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_not_added_if_book_not_in_books_genre(self, collector): + collector.add_book_in_favorites('Властелин колец') + assert 'Властелин колец' not in collector.get_list_of_favorites_books() + + def test_add_book_in_favorites_not_added_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 - # добавляем две книги - collector.add_new_book('Гордость и предубеждение и зомби') - collector.add_new_book('Что делать, если ваш кот хочет вас убить') + def test_delete_book_from_favorites_deleted_successfully(self, collector): + collector.add_new_book('Властелин колец') + collector.add_book_in_favorites('Властелин колец') + collector.delete_book_from_favorites('Властелин колец') + assert 'Властелин колец' not in collector.get_list_of_favorites_books() - # проверяем, что добавилось именно две - # словарь books_rating, который нам возвращает метод get_books_rating, имеет длину 2 - assert len(collector.get_books_rating()) == 2 + def test_delete_book_from_favorites_no_error_if_book_not_in_favorites(self, collector): + collector.add_new_book('Властелин колец') + collector.delete_book_from_favorites('Властелин колец') + assert 'Властелин колец' not in collector.get_list_of_favorites_books() - # напиши свои тесты ниже - # чтобы тесты были независимыми в каждом из них создавай отдельный экземпляр класса BooksCollector() \ No newline at end of file + def test_get_list_of_favorites_books_returns_correct_list(self, collector): + collector.add_new_book('Властелин колец') + collector.add_new_book('Оно') + collector.add_book_in_favorites('Властелин колец') + collector.add_book_in_favorites('Оно') + assert collector.get_list_of_favorites_books() == ['Властелин колец', 'Оно']