diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..dda4f8f --- /dev/null +++ b/.gitignore @@ -0,0 +1,164 @@ +### Python template +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# 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/latest/usage/project/#working-with-version-control +.pdm.toml +.pdm-python +.pdm-build/ + +# 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..fa14723 100644 --- a/README.md +++ b/README.md @@ -1 +1,14 @@ -# qa_python \ No newline at end of file +# qa_python +# Начинаю работать над проектом +1. Добавил тест test_add_new_book_add_one_book_book_added +проверка добавления новой книги. +2. Добавил тест test_set_book_genre_book_genre_genre_added проверки добавления жанра. +3. Добавил тест test_get_book_genre_book_genre_genre_get проверка получения жанра книги по ее названию. +4. Добавил тест test_get_books_with_specific_genre_book_genre_specific_books +проверка получения спискв книг с определённым жанром. +5. Добавил тест test_get_books_genre_collecor_books_genre +6. Добавил тест test_get_books_for_children_collecor_books_for_children +7. Добавил тест test_add_book_in_favorites_books_book_in_favorites +8. Добавил тест test_delete_book_from_favorites_books_book_not_in_favorites +9. Добавил тест test_get_list_of_favorites_books_collector_book_in_favorites +10. Добавил негативные тесты с помощью параметризациии test_add_new_book_add_negative_input_book_not_added \ No newline at end of file diff --git a/conftest.py b/conftest.py new file mode 100644 index 0000000..a6057ac --- /dev/null +++ b/conftest.py @@ -0,0 +1,19 @@ +import pytest + +# класс BooksCollector, в котором реализован конструктор и методы +from main import BooksCollector + +@pytest.fixture +# фикстура, которая создаёт коллекцию +def collector(): + collector = BooksCollector() + + return collector + +@pytest.fixture +# фикстура, которая создает набор коллекции книг +def collector_full(): + collector = BooksCollector() + collector.books_genre = {'The Fifth Element': 'Фантастика', 'Infinite': 'Фантастика', + 'Jurassic Park': 'Фантастика', 'A Quiet Place': 'Ужасы', 'The Skeleton Key': 'Ужасы'} + return collector \ No newline at end of file diff --git a/tests.py b/tests.py index 383385e..115950c 100644 --- a/tests.py +++ b/tests.py @@ -1,24 +1,82 @@ +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_add_one_book_book_added(self, collector): + #добавляем книгу + collector.add_new_book('The Shawshank Redemption') + # проверяем, что добавилось именно одна книга + assert len(collector.books_genre) == 1 + + def test_set_book_genre_book_genre_genre_added(self, collector): + #добавляем книгу + collector.add_new_book('The Shawshank Redemption') + #устанавливаем жанр + collector.set_book_genre('The Shawshank Redemption', 'Фантастика') + #проверяем, что добавился жанр + assert collector.books_genre['The Shawshank Redemption'] == 'Фантастика' + + def test_get_book_genre_book_genre_genre_get(self, collector): + #добавляем книгу + collector.add_new_book('The Shawshank Redemption') + #устанавливаем жанр + collector.set_book_genre('The Shawshank Redemption', 'Фантастика') + #проверяем, что добавился жанр + assert collector.books_genre.get('The Shawshank Redemption') == 'Фантастика' + + def test_get_books_with_specific_genre_book_genre_specific_books(self, collector_full): + + #заполнем коллекцию данными + books_fantasy = collector_full.get_books_with_specific_genre('Фантастика') + #проверяем, что выводятся книги нужного жанра + assert list(filter(lambda x: collector_full.books_genre[x] == 'Фантастика', books_fantasy)) != [] + + def test_get_books_genre_collecor_books_genre(self, collector_full): + #заполнем коллекцию данными + books_genre = collector_full.books_genre + #проверяем, что выводятся книги нужного жанра + assert collector_full.get_books_genre() == books_genre + + def test_get_books_for_children_collecor_books_for_children(self, collector_full): + #заполнем коллекцию данными + books_for_children = collector_full.get_books_for_children() + #проверяем, что выводятся книги нужного жанра + assert list(filter(lambda x: collector_full.books_genre[x] == 'Ужасы' or collector_full.books_genre[x] == 'Детективы', books_for_children)) == [] + + def test_add_book_in_favorites_books_book_in_favorites(self, collector): + #добавляем книгу + collector.add_new_book('The Shawshank Redemption') + #добавляем книгу в избранное + collector.add_book_in_favorites('The Shawshank Redemption') + + assert collector.favorites[0] == 'The Shawshank Redemption' + + def test_delete_book_from_favorites_books_book_not_in_favorites(self, collector): + #добавляем книгу + collector.add_new_book('The Shawshank Redemption') + # добавляем книгу в избранное + collector.add_book_in_favorites('The Shawshank Redemption') + # удаляем книгу из избранного + collector.delete_book_from_favorites('The Shawshank Redemption') + + assert collector.favorites == [] - # добавляем две книги - collector.add_new_book('Гордость и предубеждение и зомби') - collector.add_new_book('Что делать, если ваш кот хочет вас убить') + def test_get_list_of_favorites_books_collector_book_in_favorites(self, collector): + #добавляем книгу + collector.add_new_book('The Shawshank Redemption') + # добавляем книгу в избранное + collector.add_book_in_favorites('The Shawshank Redemption') - # проверяем, что добавилось именно две - # словарь books_rating, который нам возвращает метод get_books_rating, имеет длину 2 - assert len(collector.get_books_rating()) == 2 + assert collector.favorites == collector.get_list_of_favorites_books() - # напиши свои тесты ниже - # чтобы тесты были независимыми в каждом из них создавай отдельный экземпляр класса BooksCollector() \ No newline at end of file + @pytest.mark.parametrize('name', ['Ghjhjhjhdhdhdhfhfjfjjk kfkdkdkdkdkskskdkfgk', 'The Shawshank Redemption'] ) + def test_add_new_book_add_negative_input_book_not_added(self, name, collector): + #добавляем книгу + collector.add_new_book('The Shawshank Redemption') + collector.add_new_book(name) + # проверяем, что добавилось именно одна книга + assert len(collector.books_genre) == 1 \ No newline at end of file