-
Notifications
You must be signed in to change notification settings - Fork 0
Sprint_4 #6
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Sprint_4 #6
Changes from all commits
4d96936
2c23a64
98fc773
253c84c
8901698
68cc2f1
efc3fc6
52214ce
7936315
1497b1a
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1 +1,58 @@ | ||
| # qa_python | ||
| Unit-тесты для приложения BooksCollector. Оно позволяет установить жанр книг и добавить их в избранное. | ||
|
|
||
| Класс BooksCollector содержит: | ||
| Словарь books_genre, куда можно добавить пару Название книги: Жанр книги. | ||
| Список favorites, который содержит избранные книги. | ||
| Список genre, который содержит доступные жанры. | ||
| Список genre_age_rating, который содержит жанры с возрастным рейтингом. | ||
|
|
||
| Набор методов для работы со словарем books_genre и списком favorites: | ||
|
|
||
| 1. add_new_book — добавляет новую книгу в словарь без указания жанра. Название книги может содержать максимум 40 символов. Одну и ту же книгу можно добавить только один раз. Покрыт тестами 1.1 Проверка добавления одной новой книги, 1.2 Проверка что нет двойного добавления одной книги и 1.3 Проверка добавления новой книги с названием в 0, 41 символ. Проверка добавления книги с допустимой длинной названия в тесте 1.1 и 1.4 Проверка ГЗ названий книг в 1 и 40 символов. | ||
|
|
||
| 2. set_book_genre — устанавливает жанр книги, если книга есть в books_genre и её жанр входит в список genre. Покрвыается тестами 2.1 Проверка валидного жанра если книга есть в словаре books_genre и её жанр входит в список genre и 2.2 Проверка невалидного жанра если книга есть в словаре books_genre и её жанр не входит в список genre. | ||
|
|
||
| 3. get_book_genre — выводит жанр книги по её имени. Покрыт тестом номер 3 Проверка получения жанра книги по её имени | ||
|
|
||
| 4. get_books_with_specific_genre — выводит список книг с определённым жанром. Покрыт тестом номер 4 Проверка вывода списка книг с определённым жанром | ||
|
|
||
| 5. get_books_for_children — возвращает книги, которые подходят детям. У жанра книги не должно быть возрастного рейтинга. Покрыт тестом 5 Проверка получения книг для детей | ||
|
|
||
| 6. add_book_in_favorites — добавляет книгу в избранное. Книга должна находиться в словаре books_genre. Повторно добавить книгу в избранное нельзя. | ||
| Метод покрыт тестами 6.1 Проверка добавления книги в Избранное и 6.2 Проверка двойного добавления книги в Избранное | ||
|
|
||
| 7. delete_book_from_favorites — удаляет книгу из избранного, если она там есть. Покрыт 9 Проверка удаления книги из Избранного | ||
|
|
||
| 8. get_list_of_favorites_books — получает список избранных книг. Покрыт 8 Проверка получения списка Избранных книг | ||
|
|
||
| Для тестов написаны две фикстуры. Они вынесены в отдельный файл conftest.py | ||
|
|
||
| Проведено 16 тестов: 16 passed in 0.11s | ||
| Все методы покрыты тестами. | ||
|
|
||
| platform win32 -- Python 3.12.10, pytest-8.4.2, pluggy-1.6.0 -- C:\Users\anna_\AppData\Local\Microsoft\WindowsApps\PythonSoftwareFoundation.Python.3.12_qbz5n2kfra8p0\python.exe | ||
| cachedir: .pytest_cache | ||
| rootdir: C:\my_first_vscode_project | ||
| collected 16 items | ||
|
|
||
| qa_python_4/qa_python/tests.py::TestBooksCollector::test_add_new_book_plus_one_book PASSED [ 6%] | ||
| qa_python_4/qa_python/tests.py::TestBooksCollector::test_add_new_book_add_one_book_two_times_not_possible PASSED [ 12%] | ||
| qa_python_4/qa_python/tests.py::TestBooksCollector::test_add_new_book_not_valid_book_name[] PASSED [ 18%] | ||
| qa_python_4/qa_python/tests.py::TestBooksCollector::test_add_new_book_not_valid_book_name[\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043d\u0438\u0433\u0438 \u0432 41 \u0441\u0438\u043c\u0432\u043e\u043b \u0441\u043e\u0432\u0441\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e] PASSED [ 25%] | ||
| qa_python_4/qa_python/tests.py::TestBooksCollector::test_add_new_book_valid_book_name[O] PASSED [ 31%] | ||
| qa_python_4/qa_python/tests.py::TestBooksCollector::test_add_new_book_valid_book_name[\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043d\u0438\u0433\u0438 \u0432 40 \u0441\u0438\u043c\u0432\u043e\u043b \u0441\u043e\u0432\u0441\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e] PASSED [ 37%] | ||
| qa_python_4/qa_python/tests.py::TestBooksCollector::test_set_book_genre_valid PASSED [ 43%] | ||
| qa_python_4/qa_python/tests.py::TestBooksCollector::test_set_book_genre_not_valid PASSED [ 50%] | ||
| qa_python_4/qa_python/tests.py::TestBooksCollector::test_set_book_genre_book_not_in_book_genre PASSED [ 56%] | ||
| qa_python_4/qa_python/tests.py::TestBooksCollector::test_get_book_genre_return_genre_set PASSED [ 62%] | ||
| qa_python_4/qa_python/tests.py::TestBooksCollector::test_get_books_with_specific_genre_get_book_by_genre PASSED [ 68%] | ||
| qa_python_4/qa_python/tests.py::TestBooksCollector::test_get_books_for_children_get_book_without_age_rating_possible PASSED [ 75%] | ||
| qa_python_4/qa_python/tests.py::TestBooksCollector::test_add_book_in_favorites_add_new_book_possible PASSED [ 81%] | ||
| qa_python_4/qa_python/tests.py::TestBooksCollector::test_add_book_in_favorites_add_one_book_two_times_not_possible PASSED [ 87%] | ||
| qa_python_4/qa_python/tests.py::TestBooksCollector::test_delete_book_from_favorites_delete_book_possible PASSED [ 93%] | ||
| qa_python_4/qa_python/tests.py::TestBooksCollector::test_get_list_of_favorites_books_get_list_of_favorites_books_successful PASSED | ||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,17 @@ | ||
| import pytest # импортируем библиотеку pytest | ||
| from main import BooksCollector # импортируем класс BooksCollector из файла main | ||
|
|
||
| @pytest.fixture # декаратор | ||
| def books_collection(): | ||
| books_collection=BooksCollector() # создает новый экземпляр BooksCollector когда тест запрашивает фикстуру с именем books_collection | ||
| return books_collection # имя фикстуры должно быть указано как параметр тестовой функции | ||
|
|
||
| @pytest.fixture | ||
| def random_book(books_collection): | ||
| random_book = books_collection | ||
| title = ['Тестовая книга фантастики', 'Тестовая книга ужасов', 'Тестовая книга с детективами', 'Тестовая книга про мультфильмы', 'Тестовая книга комедий'] | ||
| genre = ['Фантастика', 'Ужасы', 'Детективы', 'Мультфильмы', 'Комедии'] | ||
| for i in range(5): | ||
| random_book.add_new_book(title[i]) | ||
| random_book.set_book_genre(title[i], genre[i]) | ||
| return random_book |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,24 +1,126 @@ | ||
| from main import BooksCollector | ||
| import pytest | ||
| from main import BooksCollector # импортируем класс BooksCollector из файла main | ||
|
|
||
|
|
||
| # класс TestBooksCollector объединяет набор тестов, которыми мы покрываем наше приложение BooksCollector | ||
| # обязательно указывать префикс Test | ||
| class TestBooksCollector: | ||
|
|
||
| # 1 Проверка добавления новой книги (add_new_book) | ||
| # 1.1 Проверка добавления одной новой книги | ||
| def test_add_new_book_plus_one_book(self): # в имени функции test_ название тестируемого метода указание что тестируем | ||
| # self показывает, что этот метод является методом класса | ||
| collector = BooksCollector() # создаем объект класса BooksCollector | ||
| collector.add_new_book('Новая книга ужасов') # добавляем новую книгу | ||
| assert collector.get_books_genre() == {'Новая книга ужасов': ''} # проверяем, что добавилась одна книга | ||
|
|
||
| # 1.2 Проверка что нет двойного добавления одной книги | ||
|
|
||
| def test_add_new_book_add_one_book_two_times_not_possible(self): | ||
| collector = BooksCollector() # создаем объект класса BooksCollector | ||
| collector.add_new_book('Новая книга') | ||
| collector.add_new_book('Новая книга') | ||
| assert collector.get_books_genre() == {'Новая книга': ''} # проверяем, что добавилась одна книга | ||
|
|
||
| # 1.3 Проверка добавления новой книги с названием в 0, 41 символ | ||
|
|
||
| @pytest.mark.parametrize('book_name', ['', 'Название книги в 41 символ совсем просто']) | ||
| def test_add_new_book_not_valid_book_name(self, book_name, books_collection): | ||
| books_collection=BooksCollector() | ||
| books_collection.add_new_book(book_name) | ||
| assert len(books_collection.get_books_genre()) == 0 | ||
|
|
||
|
|
||
| # 1.4 Проверка ГЗ названий книг в 1 и 40 символов. | ||
|
|
||
| @pytest.mark.parametrize('book_name', ['O', 'Название книги в 40 символ совсем просто']) | ||
| def test_add_new_book_valid_book_name(self, book_name, books_collection): | ||
| books_collection.add_new_book(book_name) | ||
| assert book_name in books_collection.get_books_genre() | ||
|
|
||
| # 2 Проверка жанра книги | ||
| # 2.1 Проверка валидного жанра если книга есть в словаре books_genre и её жанр входит в список genre. | ||
|
|
||
| def test_set_book_genre_valid(self): | ||
| collector = BooksCollector() # создаем объект класса BooksCollector | ||
| collector.add_new_book('Новая книга фантастики') | ||
| collector.set_book_genre('Новая книга фантастики', 'Фантастика') | ||
| assert collector.get_books_genre() == {'Новая книга фантастики': 'Фантастика'} | ||
|
|
||
| # 2.2 Проверка невалидного жанра если книга есть в словаре books_genre и её жанр не входит в список genre. | ||
|
|
||
| def test_set_book_genre_not_valid(self): | ||
| collector = BooksCollector() # создаем объект класса BooksCollector | ||
| collector.add_new_book('Новая книга болтовни') | ||
| collector.set_book_genre('Новая книга болтовни', 'Болтовня') | ||
| assert collector.get_books_genre() == {'Новая книга болтовни': ''} | ||
|
|
||
| # 2.3 Проверка валидного жанра если книги нет в словаре books_genre. | ||
|
|
||
| def test_set_book_genre_book_not_in_book_genre(self): | ||
| collector = BooksCollector() # создаем объект класса BooksCollector | ||
| collector.set_book_genre('Новая книга с детективом', 'Детектив') | ||
| assert collector.get_books_genre() == {} | ||
|
|
||
| # 3 Проверка получения жанра книги по её имени | ||
|
|
||
| def test_get_book_genre_return_genre_set(self): | ||
| collector = BooksCollector() # создаем объект класса BooksCollector | ||
| collector.add_new_book('Новая книга фантастики') | ||
| collector.set_book_genre('Новая книга фантастики', 'Фантастика') | ||
| assert collector.get_book_genre('Новая книга фантастики') == 'Фантастика' | ||
| # здесь и далее замена создания объекта (экземпляра класса) на использование фикстуры collector через параметр | ||
This comment was marked as outdated.
Sorry, something went wrong. |
||
|
|
||
| # 4 Проверка вывода списка книг с определённым жанром | ||
|
|
||
| def test_get_books_with_specific_genre_get_book_by_genre(self): | ||
| collector = BooksCollector() # создаем объект класса BooksCollector | ||
| collector.add_new_book('Новая книга ужасов') | ||
| collector.set_book_genre('Новая книга ужасов','Ужасы') | ||
| collector.add_new_book('Новая книга ужасов 2') | ||
| collector.set_book_genre('Новая книга ужасов 2','Ужасы') | ||
| assert len(collector.get_books_with_specific_genre('Ужасы')) == 2 | ||
|
|
||
| # 5 Проверка получения книг для детей | ||
|
|
||
| def test_get_books_for_children_get_book_without_age_rating_possible(self, random_book): | ||
| assert len(random_book.get_books_for_children()) == 3 | ||
|
|
||
| # 6 Проверка добавления книги в Избранное | ||
| # 6.1 Проверка добавления книги в Избранное | ||
|
|
||
| def test_add_book_in_favorites_add_new_book_possible(self): | ||
| collector = BooksCollector() # создаем объект класса BooksCollector | ||
| collector.add_new_book('Новая книга ужасов') | ||
| collector.set_book_genre('Новая книга ужасов','Ужасы') | ||
| collector.add_book_in_favorites('Новая книга ужасов') | ||
This comment was marked as outdated.
Sorry, something went wrong. |
||
| assert len(collector.get_list_of_favorites_books()) == 1 | ||
This comment was marked as outdated.
Sorry, something went wrong. |
||
|
|
||
| # 6.2 Проверка двойного добавления книги в Избранное | ||
|
|
||
| def test_add_book_in_favorites_add_one_book_two_times_not_possible(self): | ||
| collector = BooksCollector() # создаем объект класса BooksCollector | ||
| collector.add_new_book('Новая книга ужасов') | ||
| collector.set_book_genre('Новая книга ужасов','Ужасы') | ||
| collector.add_book_in_favorites('Новая книга ужасов') | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. в этом тесте не хватает шагов |
||
| collector.add_book_in_favorites('Новая книга ужасов') | ||
| assert len(collector.get_list_of_favorites_books()) == 1 | ||
|
|
||
| # пример теста: | ||
| # обязательно указывать префикс test_ | ||
| # дальше идет название метода, который тестируем add_new_book_ | ||
| # затем, что тестируем add_two_books - добавление двух книг | ||
| def test_add_new_book_add_two_books(self): | ||
| # создаем экземпляр (объект) класса BooksCollector | ||
| collector = BooksCollector() | ||
| # 7 Проверка удаления книги из Избранного | ||
|
|
||
| # добавляем две книги | ||
| collector.add_new_book('Гордость и предубеждение и зомби') | ||
| collector.add_new_book('Что делать, если ваш кот хочет вас убить') | ||
| def test_delete_book_from_favorites_delete_book_possible(self): | ||
| collector = BooksCollector() # создаем объект класса BooksCollector | ||
This comment was marked as outdated.
Sorry, something went wrong. |
||
| collector.add_book_in_favorites('Новая книга ужасов') | ||
| collector.set_book_genre('Новая книга ужасов','Ужасы') | ||
| collector.delete_book_from_favorites('Новая книга ужасов') | ||
| favorites = collector.get_list_of_favorites_books() | ||
| assert 'Новая книга ужасов' not in favorites | ||
|
|
||
| # проверяем, что добавилось именно две | ||
| # словарь books_rating, который нам возвращает метод get_books_rating, имеет длину 2 | ||
| assert len(collector.get_books_rating()) == 2 | ||
| # 8 Проверка получения списка Избранных книг | ||
|
|
||
| # напиши свои тесты ниже | ||
| # чтобы тесты были независимыми в каждом из них создавай отдельный экземпляр класса BooksCollector() | ||
| def test_get_list_of_favorites_books_get_list_of_favorites_books_successful(self): | ||
| collector = BooksCollector() # создаем объект класса BooksCollector | ||
This comment was marked as outdated.
Sorry, something went wrong. |
||
| collector.add_new_book('Новая книга ужасов') | ||
| collector.set_book_genre('Новая книга ужасов','Ужасы') | ||
| collector.add_book_in_favorites('Новая книга ужасов') | ||
| assert len(collector.get_list_of_favorites_books()) == 1 | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
оптимально было бы сделать фикстуру для создания экземпляра класса и использовать во всех тестах