diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8657f7b --- /dev/null +++ b/.gitignore @@ -0,0 +1,163 @@ +### Python template +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so +.idea/ + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ + diff --git a/README.md b/README.md index 1cc701d..7365151 100644 --- a/README.md +++ b/README.md @@ -1 +1,14 @@ -# qa_python \ No newline at end of file +# В файле описаны все юнит тесты которые написаны в tests.py +1. Позитивный тест для метода __init__ +2. Позитивный тест для метода add_new_book +3. Первый негативный тест для метода add_new_book +4. Второй негативный тест для метода add_new_book +5. Позитивный тест для метода set_book_genre +6. Позитивный тест для метода get_book_genre (жанр есть) +7. Позитивный тест для метода get_book_genre (жанра нет) +8. Позитивный тест для метода get_books_with_specific_genre +9. Позитивный тест для метода get_books_genre +10. Позитивный тест для метода get_books_for_children +11. Позитивный тест для метода add_book_in_favorites +12. Позитивный тест для метода delete_book_from_favorites +13. Позитивный тест для метода get_list_of_favorites_books \ No newline at end of file diff --git a/tests.py b/tests.py index 383385e..4f028e4 100644 --- a/tests.py +++ b/tests.py @@ -1,24 +1,152 @@ +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() + # Позитивный тест для метода __init__ + def test_all_genres_true(self): + books_collector = BooksCollector() + assert books_collector.genre == ['Фантастика', 'Ужасы', 'Детективы', 'Мультфильмы', 'Комедии'] + + # Позитивный тест для метода add_new_book + def test_add_new_book_correct_dict(self): + books_collector = BooksCollector() + book_name = 'The Great Gatsby' + + books_collector.add_new_book(book_name) + + assert books_collector.books_genre[book_name] == '' + + # Первый негативный тест для метода add_new_book + @pytest.mark.parametrize('book_name', ['', 'hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh']) + def test_add_new_book_length_more_than40_or_equal_zero_empty_list(self, book_name): + books_collector = BooksCollector() + books_collector.add_new_book(book_name) + + assert len(books_collector.books_genre) == 0 + + # Второй негативный тест для метода add_new_book + @pytest.mark.parametrize('book_name', ['The Great Gatsby', 'In Search of Lost Time']) + def test_add_new_book_repeating_book_name_twice(self, book_name): + books_collector = BooksCollector() + books_collector.add_new_book(book_name) + books_collector.add_new_book(book_name) + + assert len(books_collector.books_genre) == 1 + + # Позитивный тест для метода set_book_genre + def test_set_book_genre_existing_book_name_and_existing_genre(self): + books_collector = BooksCollector() + book_name = 'Thornhedge' + book_genre = 'Фантастика' + + books_collector.add_new_book(book_name) + books_collector.set_book_genre(book_name, book_genre) + + assert books_collector.books_genre[book_name] == book_genre + + # Позитивный тест для метода get_book_genre (жанр есть) + def test_get_book_genre_genre_exist_correct(self): + books_collector = BooksCollector() + book_name = 'Thornhedge' + book_genre = 'Фантастика' + + books_collector.add_new_book(book_name) + books_collector.set_book_genre(book_name, book_genre) + + assert books_collector.get_book_genre(book_name) == book_genre + + # Позитивный тест для метода get_book_genre (жанра нет) + def test_get_book_genre_genre_do_not_exist_correct(self): + books_collector = BooksCollector() + book_name = 'Thornhedge' + + books_collector.add_new_book(book_name) + + assert books_collector.get_book_genre(book_name) == '' + + # Позитивный тест для метода get_books_with_specific_genre + def test_get_books_with_specific_genre_correct(self): + books_collector = BooksCollector() + book_name_1 = 'Thornhedge' + book_name_2 = 'Divine Rivals' + book_genre_1 = 'Фантастика' + book_name_3 = 'Frankenstein' + book_genre_2 = 'Ужасы' + + books_collector.add_new_book(book_name_1) + books_collector.add_new_book(book_name_2) + books_collector.set_book_genre(book_name_1, book_genre_1) + books_collector.set_book_genre(book_name_2, book_genre_1) + books_collector.set_book_genre(book_name_3, book_genre_2) + + assert books_collector.get_books_with_specific_genre(book_genre_1) == [book_name_1, book_name_2] + + # Позитивный тест для метода get_books_genre + def test_get_books_genre_correct(self): + books_collector = BooksCollector() + book_name_1 = 'Thornhedge' + book_genre_1 = 'Фантастика' + book_name_2 = 'Frankenstein' + + books_collector.add_new_book(book_name_1) + books_collector.add_new_book(book_name_2) + books_collector.set_book_genre(book_name_1, book_genre_1) + + assert books_collector.get_books_genre() == {book_name_1: book_genre_1, + book_name_2: ''} + + # Позитивный тест для метода get_books_for_children + def test_get_books_for_children_correct(self): + books_collector = BooksCollector() + book_name_1 = 'Thornhedge' + book_genre_1 = 'Фантастика' + book_name_2 = 'Frankenstein' + book_genre_2 = 'Ужасы' + + books_collector.add_new_book(book_name_1) + books_collector.add_new_book(book_name_2) + books_collector.set_book_genre(book_name_1, book_genre_1) + books_collector.set_book_genre(book_name_2, book_genre_2) + + assert books_collector.get_books_for_children() == [book_name_1] + + # Позитивный тест для метода add_book_in_favorites + def test_add_book_in_favorites_correct(self): + books_collector = BooksCollector() + book_name_1 = 'Thornhedge' + book_name_2 = 'Frankenstein' + + books_collector.add_new_book(book_name_1) + books_collector.add_new_book(book_name_2) + books_collector.add_book_in_favorites(book_name_2) + + assert books_collector.favorites == [book_name_2] + + # Позитивный тест для метода delete_book_from_favorites + def test_delete_book_from_favorites_correct(self): + books_collector = BooksCollector() + book_name_1 = 'Thornhedge' + book_name_2 = 'Frankenstein' + + books_collector.add_new_book(book_name_1) + books_collector.add_new_book(book_name_2) + books_collector.add_book_in_favorites(book_name_1) + books_collector.add_book_in_favorites(book_name_2) + books_collector.delete_book_from_favorites(book_name_2) + + assert books_collector.favorites == [book_name_1] - # добавляем две книги - collector.add_new_book('Гордость и предубеждение и зомби') - collector.add_new_book('Что делать, если ваш кот хочет вас убить') + # Позитивный тест для метода get_list_of_favorites_books + def test_get_list_of_favorites_books_correct(self): + books_collector = BooksCollector() + book_name_1 = 'Thornhedge' + book_name_2 = 'Frankenstein' - # проверяем, что добавилось именно две - # словарь books_rating, который нам возвращает метод get_books_rating, имеет длину 2 - assert len(collector.get_books_rating()) == 2 + books_collector.add_new_book(book_name_1) + books_collector.add_new_book(book_name_2) + books_collector.add_book_in_favorites(book_name_1) + books_collector.add_book_in_favorites(book_name_2) - # напиши свои тесты ниже - # чтобы тесты были независимыми в каждом из них создавай отдельный экземпляр класса BooksCollector() \ No newline at end of file + assert books_collector.get_list_of_favorites_books() == [book_name_1, book_name_2]