From 27d97db989ca1c59406a9003d5a9694b1b9cdb2e Mon Sep 17 00:00:00 2001 From: Julia Bryukhanova Date: Fri, 24 Oct 2025 22:13:36 +0500 Subject: [PATCH 1/4] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20=D1=82=D0=B5=D1=81=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 15 ++++++- tests.py | 119 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 131 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 1cc701d..c9c2b96 100644 --- a/README.md +++ b/README.md @@ -1 +1,14 @@ -# qa_python \ No newline at end of file +# qa_python +тесты, которые удалось реализовать: +test_add_new_book - добавление книг +test_add_new_book_twice - добавление одной и той же книги дважды +test_add_new_book_name_length - добавление книги с наименованием более 41 символа +test_set_book_genre - установление жанра книге +test_set_book_genre_invalid_book - установление жанра неизвестной книге +test_set_book_genre_invalid_genre - установление книге неизвестного жанра +test_get_books_with_specific_genre - получение книг соответствующих жанру +test_get_books_genre - получение книг +test_get_books_genre_empty - получение пустого словаря книг +test_get_books_for_children - получение книг для детей +test_get_books_for_children_empty - получение пустого списка книг для детей когда таких нет +test_add_book_in_favorites - добавление книг в избранное, удаление из избранного, получение избранных книг \ No newline at end of file diff --git a/tests.py b/tests.py index 383385e..a1d5510 100644 --- a/tests.py +++ b/tests.py @@ -1,5 +1,15 @@ +import pytest from main import BooksCollector +@pytest.fixture +def collector(): + collector = BooksCollector() + for genre in collector.genre: + name = f"Книга - {genre}" + collector.add_new_book(name) + collector.set_book_genre(name, genre) + return collector + # класс TestBooksCollector объединяет набор тестов, которыми мы покрываем наше приложение BooksCollector # обязательно указывать префикс Test class TestBooksCollector: @@ -18,7 +28,112 @@ def test_add_new_book_add_two_books(self): # проверяем, что добавилось именно две # словарь books_rating, который нам возвращает метод get_books_rating, имеет длину 2 - assert len(collector.get_books_rating()) == 2 + assert len(collector.get_books_genre()) == 2 # напиши свои тесты ниже - # чтобы тесты были независимыми в каждом из них создавай отдельный экземпляр класса BooksCollector() \ No newline at end of file + # чтобы тесты были независимыми в каждом из них создавай отдельный экземпляр класса BooksCollector() + + @pytest.mark.parametrize( + "name, result", + [ + ['Книга', 1], + ['Книга' * 40, 0], + ] + ) + def test_add_new_book(self, name, result): + collector = BooksCollector() + collector.add_new_book(name) + assert len(collector.get_books_genre()) == result + + def test_add_new_book_twice(self): + collector = BooksCollector() + + collector.add_new_book('Гордость и предубеждение и зомби') + collector.add_new_book('Гордость и предубеждение и зомби') + + assert len(collector.get_books_genre()) == 1 + + def test_add_new_book_name_length(self): + collector = BooksCollector() + + collector.add_new_book('К' * 42) + + assert len(collector.get_books_genre()) == 0 + + def test_set_book_genre(self): + collector = BooksCollector() + + name = 'Книга' + collector.add_new_book(name) + assert collector.get_book_genre(name) == '' + genre = collector.genre[0] + + collector.set_book_genre(name, genre) + assert collector.get_book_genre(name) == genre + + def test_set_book_genre_invalid_book(self): + collector = BooksCollector() + + name = 'Книга' + genre = collector.genre[0] + + collector.set_book_genre(name, genre) + assert not collector.get_book_genre(name) + + def test_set_book_genre_invalid_genre(self): + collector = BooksCollector() + + name = 'Книга' + collector.add_new_book(name) + genre = 'Жанр' + + collector.set_book_genre(name, genre) + assert not collector.get_book_genre(name) + + def test_get_books_with_specific_genre(self, collector): + for genre in collector.genre: + books = collector.get_books_with_specific_genre(genre) + assert len(books) == 1 + assert books[0] == f"Книга - {genre}" + + def test_get_books_genre(self): + collector = BooksCollector() + name = 'Книга' + collector.add_new_book(name) + genre = collector.genre[0] + + collector.set_book_genre(name, genre) + books = collector.get_books_genre() + assert len(books.keys()) == 1 + assert books.get(name) == genre + + def test_get_books_genre_empty(self): + collector = BooksCollector() + assert not collector.get_books_genre() + + def test_get_books_for_children(self, collector): + books = collector.get_books_for_children() + + for name, genre in collector.books_genre.items(): + if genre in collector.genre_age_rating: + assert name not in books + else: + assert name in books + + def test_get_books_for_children_empty(self): + collector = BooksCollector() + assert not collector.get_books_for_children() + + def test_add_book_in_favorites(self, collector): + assert not collector.get_list_of_favorites_books() + + for name in collector.books_genre.keys(): + collector.add_book_in_favorites(name) + assert name in collector.get_list_of_favorites_books() + + collector.delete_book_from_favorites(name) + assert name not in collector.get_list_of_favorites_books() + + assert not collector.get_list_of_favorites_books() + collector.add_book_in_favorites("yandex") + assert not collector.get_list_of_favorites_books() From e421def7ef3f82fdd0bbabff9694c208e9afb2b5 Mon Sep 17 00:00:00 2001 From: Julia Bryukhanova Date: Tue, 28 Oct 2025 01:30:31 +0500 Subject: [PATCH 2/4] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BF=D0=BE=D1=81=D0=BB=D0=B5=20?= =?UTF-8?q?=D1=80=D0=B5=D0=B2=D1=8C=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/settings.json | 7 ++ README.md | 22 ++-- .../conftest.cpython-312-pytest-8.4.2.pyc | Bin 0 -> 1552 bytes __pycache__/main.cpython-312.pyc | Bin 0 -> 3543 bytes .../tests.cpython-312-pytest-8.4.2.pyc | Bin 0 -> 28198 bytes conftest.py | 27 +++++ tests.py | 110 +++++++++--------- 7 files changed, 99 insertions(+), 67 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 __pycache__/conftest.cpython-312-pytest-8.4.2.pyc create mode 100644 __pycache__/main.cpython-312.pyc create mode 100644 __pycache__/tests.cpython-312-pytest-8.4.2.pyc create mode 100644 conftest.py diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..3e99ede --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,7 @@ +{ + "python.testing.pytestArgs": [ + "." + ], + "python.testing.unittestEnabled": false, + "python.testing.pytestEnabled": true +} \ No newline at end of file diff --git a/README.md b/README.md index c9c2b96..f2f660c 100644 --- a/README.md +++ b/README.md @@ -3,12 +3,16 @@ test_add_new_book - добавление книг test_add_new_book_twice - добавление одной и той же книги дважды test_add_new_book_name_length - добавление книги с наименованием более 41 символа -test_set_book_genre - установление жанра книге -test_set_book_genre_invalid_book - установление жанра неизвестной книге -test_set_book_genre_invalid_genre - установление книге неизвестного жанра -test_get_books_with_specific_genre - получение книг соответствующих жанру -test_get_books_genre - получение книг -test_get_books_genre_empty - получение пустого словаря книг -test_get_books_for_children - получение книг для детей -test_get_books_for_children_empty - получение пустого списка книг для детей когда таких нет -test_add_book_in_favorites - добавление книг в избранное, удаление из избранного, получение избранных книг \ No newline at end of file +test_set_book_genre — установка жанра книге +test_set_book_genre_invalid_genre — установка книге несуществующего жанра +test_get_book_genre — получение жанра книги +test_get_book_genre_invalid_book — получение жанра несуществующей книги +test_get_books_with_specific_genre — получение списка книг определённого жанра +test_get_books_genre — получение книг +test_get_books_genre_empty — получение пустого словаря книг +test_get_books_for_children — получение книг для детей +test_get_books_for_children_empty — получение пустого списка книг для детей когда таких нет +test_add_book_in_favorites — добавление книги в избранное +test_delete_book_from_favorites — удаление книги из избранного +test_get_list_of_favorites_books — получение списка избранных книг +test_get_list_of_favorites_books_empty — получение пустого списка избранных книг \ No newline at end of file diff --git a/__pycache__/conftest.cpython-312-pytest-8.4.2.pyc b/__pycache__/conftest.cpython-312-pytest-8.4.2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6ed715a6063d70625425c1032f57e88dfc2c102f GIT binary patch literal 1552 zcmbVL&1>9N5TB=&v~u>NO5#luTGl$Ghb0gkC#H5Oq15i7g}UERmMvl}$+6bE()K;M z&cYg88mOT?v?oJLp{L^Di=mfX`WN(~#SI%?0yVTf1bWzHZ@IMdq?NK=>PrSR?_++N zH}jjBUkim(fO6-zf7bt&0R9k%MDQHR@F!gMzy_N%p-Q4vYGo{mKufMFB(|tkHL_%@ zSzM*2)|#qL5pc4N>5-qY#m?M*d|?Q2oDotOI`9k{2(Q0 z0$-n(p$i{CCA0ESL-b}2Rrp=_OL!;zIXpBf87f}k3axuL9GFoduEfS7bApJ(7>p$qPjOi|pl5N*M0$o{P%&t{G(mslgi&lO zcus)dMzsUS`o+FJ+tX+J`g~8HKhj@*43e_AD?iZB?G?T)gyp$@d7)QcIMNq)m3!KY zeeF_DyR^T2_|jc%VW1#(phDgV)NFD8jB?JkHG|1XYS$TitY QF?OFJ@%e&>1a@0FDm1j^r^{WV%wPRJkF$QCYB**XN3MZ%H`L?W|9V(zkrWr$3(g2|U1 zk54Ak*m@Bvi$o?vj6{Z5iJ2usCW!^)BoiPnae!qK54cY%12jwf0LvvaV1-l;Xpt%a ztHtTw*~+fiJ!!X2sNXOU@JFz1a|)g13j4& z5F)XXX@rFyTtP3>MBoMme$oLg^(!^5{-WJb7n_rS19dFY~L00Nh? zT*kACBXWq!sq$g(RG9iBvXbJB9=rY!y(6+ny%B$CWQ9p_iX0qP@R+Wry}n-0n~F>o z&ug#0`ttd67d->AG8PF>c&5D}NxtTppy2?psCce;#fj<2XgK5<_xeMf6VoZPDEdSG zh$u!6ZYR7mYe1TmBLMG`q_cjGdt^S8JnWp~=BrXQGw`TLHXT>H&Z(|}Ic~#TzXc zNT$+ni7|b!!nFPapFhUs9t!{|BADntte8gRNXitHLn|z`Vh0!Uj>`%j$mODy*kkod zk{FV&is-hevxv7sBML`(4gk2bRVQqXnyoQmYtd{iO9PK=!m{^XOI-S1c+`1z_3}pN z*<|a{xq*bWPP5kCxwvL+-ZYV}=NZ)|P#dh_E2IePI;rnK1xN*nm!frw(8d^uJy7Tn zn1KascHL$)w_zbsE6kw4>f}%e7)TWILJuNfhl2ZXWyz^hZ4POvpa}u-|7$M^{*?0_{eJ zg8K%cWu;c1<+T@?Kv7Vo^lBQoa8>Dnwvn535#>h;#}gF9pBWh)M~DiNq1Yq z-J`jC67F8j-MjAYOB1&8jAnN&a0`KCb^TJ!di9Z{<9Nc+qd9uw7dITen>>uzEF*Ss zbekdBTylcfVO_t+sJh)Go28U7D7C;)BlH{b$d*5uo++XYyPjOPH{pCtNdDqiU{AIvW$t4$aw-aCU3X?sex$&{Fw{o3G3bEVL$VjynU1x^Atm zd(GAzmscadMSqH}oq8#0Z%)_+%`PmvH|$-Yt@0D7t!5DH9^r5b-n(ax=-4%gFto08 z_9zuZ@`)LfF#e2SYNS?bhHdEd?~JH5m^INE@HHalK7gX`B5q5LI*!z0#0P4(w=PK=_6|s{_I3cPdk^N``Zwl~9T-zwN?nLzcCv{E zX-Sn)c|1HN?_{P{l7n(YHpm&K;qd}`gd%!&ABrhfK@Da&TI~O@U$ZnNt@hi4HwP2e zCe7Nk@gNyt>7n!9=>j0 zzj<9X*Xvsz6e{t97C+cTF;yXo<6&tsh;^$dUYYa;4GYECM=|14Cqg|!3j#7kA>R?& zj)2OdT>vXYUtbTm6vMR+NQ&|dz${5~9DklkSFwCsx`O39(iIHfo;H{9LV7>LyV7Q! zZ%*4y{IRqZhHQbg!B`O&8x$C0QS?&&MNiFr#{T;$1W-LwDEPg!X<``WPxds^kR|~7 Ggns}pCKA^G literal 0 HcmV?d00001 diff --git a/__pycache__/tests.cpython-312-pytest-8.4.2.pyc b/__pycache__/tests.cpython-312-pytest-8.4.2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3d06cee89ea42486578c37848a20b02335e741ef GIT binary patch literal 28198 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 Date: Tue, 28 Oct 2025 01:32:11 +0500 Subject: [PATCH 3/4] =?UTF-8?q?=D0=A3=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD=D1=8B?= =?UTF-8?q?=20=D1=84=D0=B0=D0=B9=D0=BB=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/settings.json | 7 ------- 1 file changed, 7 deletions(-) delete mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 3e99ede..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "python.testing.pytestArgs": [ - "." - ], - "python.testing.unittestEnabled": false, - "python.testing.pytestEnabled": true -} \ No newline at end of file From a47b1331f923e54157910c052150fb1ffd5d60ec Mon Sep 17 00:00:00 2001 From: Julia Bryukhanova Date: Tue, 28 Oct 2025 15:38:38 +0500 Subject: [PATCH 4/4] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=82=D0=B5=D1=81=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conftest.py | 23 +------- tests.py | 157 ++++++++++++++++++++++++++++++++-------------------- 2 files changed, 99 insertions(+), 81 deletions(-) diff --git a/conftest.py b/conftest.py index f117fef..c31a4fd 100644 --- a/conftest.py +++ b/conftest.py @@ -1,27 +1,8 @@ -import random import pytest from main import BooksCollector @pytest.fixture -def collector_with_books(): - collector = BooksCollector() - for i in range(8): - collector.add_new_book(f'Книга {i}') - return collector - - -@pytest.fixture -def collector_with_genres(collector_with_books): - for book in collector_with_books.books_genre.keys(): - genre = random.choice(collector_with_books.genre) - collector_with_books.set_book_genre(book, genre) - return collector_with_books - - -@pytest.fixture -def collector_with_favorites(collector_with_books): - for book in collector_with_books.books_genre.keys(): - collector_with_books.add_book_in_favorites(book) - return collector_with_books +def collector(): + return BooksCollector() diff --git a/tests.py b/tests.py index 9b29e26..38d8a57 100644 --- a/tests.py +++ b/tests.py @@ -26,16 +26,16 @@ def test_add_new_book_add_two_books(self): # чтобы тесты были независимыми в каждом из них создавай отдельный экземпляр класса BooksCollector() @pytest.mark.parametrize( - "name, result", + "name, expected", [ ['Книга', 1], ['Книга' * 40, 0], ] ) - def test_add_new_book(self, name, result): + def test_add_new_book(self, name, expected): collector = BooksCollector() collector.add_new_book(name) - assert len(collector.get_books_genre()) == result + assert len(collector.get_books_genre()) == expected def test_add_new_book_twice(self): collector = BooksCollector() @@ -52,82 +52,119 @@ def test_add_new_book_name_length(self): assert len(collector.get_books_genre()) == 0 - def test_set_book_genre(self, collector_with_books): - for book in collector_with_books.books_genre.keys(): - assert collector_with_books.get_book_genre(book) == '' - genre = random.choice(collector_with_books.genre) - - collector_with_books.set_book_genre(book, genre) - assert collector_with_books.get_book_genre(book) == genre - - def test_set_book_genre_invalid_genre(self, collector_with_books): + @pytest.mark.parametrize( + "book, genre", + [ + ['Книга', 'Фантастика'], + ['Книга', 'Детективы'], + ] + ) + def test_set_book_genre(self, collector, book, genre): + collector.add_new_book(book) + assert collector.books_genre[book] == '' + collector.set_book_genre(book, genre) + assert collector.books_genre[book] == genre + + def test_set_book_genre_invalid_genre(self, collector): + book = 'Книга' + collector.add_new_book(book) genre = 'Жанр' - for book in collector_with_books.books_genre.keys(): - assert collector_with_books.get_book_genre(book) == '' - - collector_with_books.set_book_genre(book, genre) - assert collector_with_books.get_book_genre(book) == '' + assert collector.books_genre[book] == '' + collector.set_book_genre(book, genre) + assert collector.books_genre[book] == '' - def test_get_book_genre(self, collector_with_genres): - for book, genre in collector_with_genres.books_genre.items(): - assert collector_with_genres.get_book_genre(book) == genre + @pytest.mark.parametrize( + "book, genre", + [ + ['Книга', 'Фантастика'], + ['Книга', 'Детективы'], + ] + ) + def test_get_book_genre(self, collector, book, genre): + collector.books_genre = {book: genre} + assert collector.get_book_genre(book) == genre - def test_get_book_genre_invalid_book(self): - collector = BooksCollector() + def test_get_book_genre_invalid_book(self, collector): assert not collector.get_book_genre('Книга') - def test_get_books_with_specific_genre(self, collector_with_genres): - for genre in collector_with_genres.genre: - books = collector_with_genres.get_books_with_specific_genre(genre) + def test_get_books_with_specific_genre(self, collector): + genre_count = {} + for i in range(8): + book = f'Книга {i}' + collector.add_new_book(book) + genre = random.choice(collector.genre) + collector.set_book_genre(book, genre) + if genre in genre_count: + genre_count[genre] += 1 + else: + genre_count[genre] = 1 + + for genre in collector.genre: + books = collector.get_books_with_specific_genre(genre) - assert all(collector_with_genres.books_genre[book] == genre for book in books) + assert all(collector.books_genre[book] == genre for book in books) books_with_genre = 0 - for value in collector_with_genres.books_genre.values(): - if value == genre: - books_with_genre += 1 + assert len(books) == genre_count.get(genre, 0) - assert len(books) == books_with_genre + def test_get_books_genre(self, collector): + for i in range(8): + book = f'Книга {i}' + collector.add_new_book(book) - def test_get_books_genre(self, collector_with_genres): - result = collector_with_genres.get_books_genre() + result = collector.get_books_genre() - assert result == collector_with_genres.books_genre - assert len(result) == len(collector_with_genres.books_genre) + assert result == collector.books_genre + assert len(result) == len(collector.books_genre) def test_get_books_genre_empty(self): collector = BooksCollector() assert not collector.get_books_genre() - def test_get_books_for_children(self, collector_with_genres): - books = collector_with_genres.get_books_for_children() - - for name, genre in collector_with_genres.books_genre.items(): - if genre in collector_with_genres.genre_age_rating: - assert name not in books - else: - assert name in books + @pytest.mark.parametrize( + "book, genre, expected", + [ + ['Книга', 'Ужасы', []], + ['Книга', 'Мультфильмы', ['Книга']], + ] + ) + def test_get_books_for_children(self, collector, book, genre, expected): + collector.add_new_book(book) + collector.set_book_genre(book, genre) + books = collector.get_books_for_children() + assert books == expected - def test_get_books_for_children_empty(self): - collector = BooksCollector() + def test_get_books_for_children_empty(self, collector): assert not collector.get_books_for_children() - def test_add_book_in_favorites(self, collector_with_genres): - assert not collector_with_genres.get_list_of_favorites_books() - for name in collector_with_genres.books_genre.keys(): - collector_with_genres.add_book_in_favorites(name) - assert name in collector_with_genres.favorites + def test_add_book_in_favorites(self, collector): + book = 'Книга' + collector.add_new_book(book) + assert len(collector.favorites) == 0 + collector.add_book_in_favorites(book) + assert book in collector.favorites - def test_delete_book_from_favorites(self, collector_with_favorites): - for name in collector_with_favorites.books_genre.keys(): - collector_with_favorites.delete_book_from_favorites(name) - assert name not in collector_with_favorites.favorites + def test_delete_book_from_favorites(self, collector): + book = 'Книга' + collector.add_new_book(book) + collector.favorites = [book] + assert book in collector.favorites + collector.delete_book_from_favorites(book) + assert book not in collector.favorites + + + @pytest.mark.parametrize( + "book, favorites, expected", + [ + ['Книга', ['Книга'], ['Книга']], + ['Книга', [], []], + ] + ) + def test_get_list_of_favorites_books(self, collector, book, favorites, expected): + collector.add_new_book(book) + collector.favorites = favorites - def test_get_list_of_favorites_books(self, collector_with_favorites): - favorites = collector_with_favorites.get_list_of_favorites_books() - assert len(favorites) == len(collector_with_favorites.favorites) + assert collector.get_list_of_favorites_books() == expected - def test_get_list_of_favorites_books_empty(self, collector_with_genres): - favorites = collector_with_genres.get_list_of_favorites_books() - assert len(favorites) == len(collector_with_genres.favorites) - assert len(favorites) == 0 + def test_get_list_of_favorites_books_empty(self, collector): + assert len(collector.get_list_of_favorites_books()) == 0