From 65432e2f3ab6f4c136074612f0784039299d8e39 Mon Sep 17 00:00:00 2001 From: Leonov Eduard Date: Fri, 26 Sep 2025 00:41:12 +0700 Subject: [PATCH 1/5] =?UTF-8?q?=D0=92=D1=8B=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=BE=20=D0=B7=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=20sprint=204?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __pycache__/main.cpython-312.pyc | Bin 0 -> 3515 bytes __pycache__/main.cpython-38.pyc | Bin 2030 -> 0 bytes __pycache__/test.cpython-38-pytest-7.1.2.pyc | Bin 8183 -> 0 bytes ...oks_collector.cpython-312-pytest-8.4.2.pyc | Bin 0 -> 22498 bytes .../tests.cpython-312-pytest-8.4.2.pyc | Bin 0 -> 22483 bytes tests.py | 114 +++++++++++++++--- 6 files changed, 99 insertions(+), 15 deletions(-) create mode 100644 __pycache__/main.cpython-312.pyc delete mode 100644 __pycache__/main.cpython-38.pyc delete mode 100644 __pycache__/test.cpython-38-pytest-7.1.2.pyc create mode 100644 __pycache__/test_books_collector.cpython-312-pytest-8.4.2.pyc create mode 100644 __pycache__/tests.cpython-312-pytest-8.4.2.pyc diff --git a/__pycache__/main.cpython-312.pyc b/__pycache__/main.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..018c83c9d9e187cfefcce73f8d22962ebf625543 GIT binary patch literal 3515 zcmbVO&rcgi6rNr05@Q=|1(P4x1_O4&LIOf@qm)vbHdJX=HN{}ls0g%c1W zv63mwLJzK>mpLMEBLY9;gqHe^npS_)Zm4PPBft&yp_+b>}F znCKy_n8I=*XNt~bbjLFwTbW+k)#apEjWum+S0NmM| zGWIsj-j=a)3d8_w))_-zwIAe2bHuv32o3@T^6X|=E zQSAb?!y2JVimER1kD6T4xDuOM$c}D;)weuz<~>+l=NetR!lk84*~W917t9 zi9%lJQ3UKza39_xIgN^((1|g`oAgxCv)hd4QqBMXL00>6Ak);T!JoBrjZZs&Zu!1N z>v}2c@2+M=7*wsD1}T*XE0J;zR{VcTdz;V}m|Q$C1^|lJc$WYgK_ds9akm-QP>uuC z5W!=+pqdNrtvpHT&ZJ@93JH^WbRyKN3%#hjzH)A12)Osf+H)pLH>teZy+U=Eyyqrl z4Az@B&2uR(#a!uv?K4ZZ6g!C*q^hJ$#XHK7rB;rl*dl{mSu!~ug4dLis|!v~%P~pd z4F#cia>wx!DdM$AVnS4=e{rrR{1sOcP;BJn)giB*Ol=FG+!X&8_;|MPkn=$!@JBaPiC7u ztIdy_PGp^@GtPkK45Tk@IS00R;(vL&jyS-_U4~jqSqR>Qb^QvX;Pz8%kxj;6(+We4 z7;l6kd-+g$N=UZuduZL>j`K11RA^B(x9#0rNr2z#n*#yv6Jcrv?g}vl3SwgCO(_h@ zxNcRMWk6odx)rluRhdQc`BKazs->!=*b4ET1@SROx_E=GHkd#$2= z=x#ht#n40~Dp5$a<&cKkEDP;OndQpyN&miNR}S;TTFNB=;M~)unp?82wv4MsbM<6g z{hF))sq4(mw-$$&{aL&7?r_H4uetj-?fq$aBk@P_m*nQzH?xk8j6={I!kTZ((Fd|} z2T)cWAkzba;4HlIz|7FIZ|GpCyLQf~6*|i47*j9)j1X!hRBDE8=*;hpqs^Er(GTzq zB9=aKlD;ZhYmPdNtYVx8R(E9%NVInYUk-gXq}he6!@1IUr!nL3YYzXawB_i5lQ zf>FalG3?P}2rdKA>va~%IVlW%1C zuDpfid-4{B@6Ma+cp-n7;k|h?&v)bY}F5GA=Qc`dI$>NrlLq-jwYMHQgYy$FmT3DBD^PA)W9_a&t`k^T zpOPOEAN7~^nq1OrZ#{J$SBj*y9H1099CC-`n>RDm%kAw3qxSjlt5^3o82g0Da`R~N zgu2})@dr~(@ekDBi!M{*gtfdrt*&*HfPIY4lZ1)oHA$ z4HeK>SDUIq7jh68o5}G-cA6$~Y|_^Rs2%sB;-B@R_4r zWG>|I#aSJ*WwcYTV~}%Swn(%*2ib(A7d6vMhMJau-0WbfUdE^Dz^>Jq13!!3HrdX6 zX!6N}iVqdzn`s7$g&QZ#AP5FH4Q{xGf_Pp=ffBJUhSxDvOjj_}Xx~>VpVDN=E*)j& zIOiEh?KmQj9X4^rp0mH2e~L@*($D>zp9%AGEcf~n-LpmWx;b>z;C#qE|Nxns&x=o~kmG7eLRNArbM}w$8Bi2Qsy9I;!3aVl$mmbVLTYtbISzGYR zxX%yxJ`Z>(Ccjl8^zAdQl{b>zL3v#T{i%{X|CdX#IF2p3-(D zTq~9N%M3wTnG^_Ara0RmjYbLz)hl;Z>XK<55-?&Ab8`n`U3T3@={e$~M1Fmqj>z1? zZN@|1;FF^Y^0k|8hVLF0_n1(j9=iN;Ps}o8;eb*p>NtI?*J5odJ<^#j;SNk1F91IT zV0g*^w^f0A^S=KRbVua6px;B#M-jcy>0klL!L)4vn^o(>3aoEz>$F0=>v&eBEE-bA zsX8A)52bu_-W!!)%qAUgb|DTRZbN(zaTfx-oBI$yKrCv?X?T(ik{sRr^9CZQxt||2 c0zaq+HTS(k84sIv2Nc2M6525={-MtP1Ay7ZO8@`> 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 b2898a8a207c1ae4014c5ac436acbbfebcdd6cd4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8183 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 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..97db57d74e30fea5372c6dab19e6e846dd7729d0 GIT binary patch literal 22483 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 literal 0 HcmV?d00001 diff --git a/tests.py b/tests.py index 383385e..5c21fd5 100644 --- a/tests.py +++ b/tests.py @@ -1,24 +1,108 @@ +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() + collector.add_new_book('Гарри Поттер и философский камень') + collector.add_new_book('1984') + assert len(collector.get_books_genre()) == 2 + + @pytest.mark.parametrize("book_name, expected_count", [ + ("", 0), + ("a" * 41, 0), + ]) + def test_add_new_book_invalid_names(self, book_name, expected_count): + collector = BooksCollector() + collector.add_new_book(book_name) + assert len(collector.get_books_genre()) == expected_count + + @pytest.mark.parametrize("book_name", [ + "Властелин колец", + "Гарри Поттер", + "1984", + ]) + def test_add_new_book_duplicate(self, book_name): + collector = BooksCollector() + collector.add_new_book(book_name) + collector.add_new_book(book_name) + assert len(collector.get_books_genre()) == 1 + + def test_set_book_genre(self): + collector = BooksCollector() + collector.add_new_book('Дюна') + collector.set_book_genre('Дюна', 'Детективы') + assert collector.get_book_genre('Дюна') == 'Детективы' + + collector.set_book_genre('Дюна', 'Фантастика') + assert collector.get_book_genre('Дюна') == 'Фантастика' + + collector.set_book_genre('Дюна', 'Драма') + assert collector.get_book_genre('Дюна') == 'Фантастика' + + collector.set_book_genre('1984', 'Фантастика') + assert collector.get_book_genre('1984') is None + + def test_get_book_genre(self): + collector = BooksCollector() + collector.add_new_book('Пикник на обочине') + assert collector.get_book_genre('Пикник на обочине') == '' + + collector.set_book_genre('Пикник на обочине', 'Комедии') + assert collector.get_book_genre('Пикник на обочине') == 'Комедии' + + assert collector.get_book_genre('Скотный двор') is None + + def test_get_books_with_specific_genre(self): + collector = BooksCollector() + collector.add_new_book('Дракула') + collector.add_new_book('Горе от ума') + collector.set_book_genre('Дракула', 'Ужасы') + collector.set_book_genre('Горе от ума', 'Комедии') + books = collector.get_books_with_specific_genre('Ужасы') + assert 'Дракула' in books and 'Горе от ума' not in books + + assert collector.get_books_with_specific_genre('Драма') == [] - # добавляем две книги - collector.add_new_book('Гордость и предубеждение и зомби') - collector.add_new_book('Что делать, если ваш кот хочет вас убить') + def test_get_books_genre(self): + collector = BooksCollector() + collector.add_new_book('Ведьмак') + collector.set_book_genre('Ведьмак', 'Мультфильмы') + collector.add_new_book('451 градус по Фаренгейту') + assert collector.get_books_genre() == {'Ведьмак': 'Мультфильмы', '451 градус по Фаренгейту': ''} + + def test_get_books_for_children(self): + collector = BooksCollector() + collector.add_new_book('Приключения Паддингтона') + collector.set_book_genre('Приключения Паддингтона', 'Мультфильмы') + collector.add_new_book('Оно') + collector.set_book_genre('Оно', 'Ужасы') + child_books = collector.get_books_for_children() + assert 'Приключения Паддингтона' in child_books and 'Оно' not in child_books - # проверяем, что добавилось именно две - # словарь books_rating, который нам возвращает метод get_books_rating, имеет длину 2 - assert len(collector.get_books_rating()) == 2 + def test_add_book_in_favorites(self): + collector = BooksCollector() + collector.add_new_book('Шерлок Холмс') + collector.add_book_in_favorites('Шерлок Холмс') + collector.add_book_in_favorites('Шерлок Холмс') + assert collector.get_list_of_favorites_books().count('Шерлок Холмс') == 1 + + def test_delete_book_from_favorites(self): + collector = BooksCollector() + collector.add_new_book('Мастера и Маргарита') + collector.add_book_in_favorites('Мастера и Маргарита') + collector.delete_book_from_favorites('Мастера и Маргарита') + assert 'Мастера и Маргарита' not in collector.get_list_of_favorites_books() + + collector.delete_book_from_favorites('Нет такой книги') + assert collector.get_list_of_favorites_books() == [] + + def test_get_list_of_favorites_books(self): + collector = BooksCollector() + assert collector.get_list_of_favorites_books() == [] - # напиши свои тесты ниже - # чтобы тесты были независимыми в каждом из них создавай отдельный экземпляр класса BooksCollector() \ No newline at end of file + collector.add_new_book('Хоббит') + collector.add_book_in_favorites('Хоббит') + assert collector.get_list_of_favorites_books() == ['Хоббит'] \ No newline at end of file From 254decc93bb2904913c29919f3bb02d7519852ff Mon Sep 17 00:00:00 2001 From: Leonov Eduard Date: Fri, 26 Sep 2025 00:53:56 +0700 Subject: [PATCH 2/5] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20README?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 1cc701d..f5fb684 100644 --- a/README.md +++ b/README.md @@ -1 +1,33 @@ -# qa_python \ No newline at end of file +# qa_python +test_add_new_book_add_two_books +Проверка добавления двух книг и их наличия в жанровом списке + +test_add_new_book_invalid_names (с параметризацией) +Проверка корректного отсеивания названий книг, которые не проходят валидацию (пустое название и слишком длинное) + +test_add_new_book_duplicate (с параметризацией) +Проверка, что добавление дубликатов книг не увеличивает количество записей + +test_set_book_genre +Проверка установки жанра книги и поведения при смене жанра на допустимый и недопустимый + +test_get_book_genre +Проверка получения жанра для различных книг и обработки отсутствующих книг + +test_get_books_with_specific_genre +Проверка фильтрации книг по конкретному жанру + +test_get_books_genre +Проверка получения всех книг с их жанрами в виде словаря + +test_get_books_for_children +Проверка фильтрации книг для детей по жанрам + +test_add_book_in_favorites +Проверка добавления книг в избранное, включая повторное добавление + +test_delete_book_from_favorites +Проверка удаления книги из избранного, включая удаление несуществующей книги + +test_get_list_of_favorites_books +Проверка получения списка избранных книг, включая пустое состояние \ No newline at end of file From 1224b98e28d94314de0d8b4a80846b668469e7a7 Mon Sep 17 00:00:00 2001 From: Leonov Eduard Date: Sun, 28 Sep 2025 14:49:10 +0700 Subject: [PATCH 3/5] =?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=B2=D0=BD=D0=B5=D1=81=D0=B5=D0=BD?= =?UTF-8?q?=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 68 ++++++++++++------ .../tests.cpython-312-pytest-8.4.2.pyc | Bin 22483 -> 25241 bytes tests.py | 49 +++++++++---- 3 files changed, 81 insertions(+), 36 deletions(-) diff --git a/README.md b/README.md index f5fb684..4116871 100644 --- a/README.md +++ b/README.md @@ -1,33 +1,57 @@ # qa_python -test_add_new_book_add_two_books -Проверка добавления двух книг и их наличия в жанровом списке +test_add_two_books_count_is_two +Проверка, что добавление двух книг увеличивает количество книг до двух -test_add_new_book_invalid_names (с параметризацией) -Проверка корректного отсеивания названий книг, которые не проходят валидацию (пустое название и слишком длинное) +test_add_book_with_empty_name_not_added +Проверка, что книга с пустым названием не добавляется -test_add_new_book_duplicate (с параметризацией) -Проверка, что добавление дубликатов книг не увеличивает количество записей +test_add_duplicate_book_not_duplicate_count +Проверка, что при добавлении книги-дубликата количество книг не увеличивается -test_set_book_genre -Проверка установки жанра книги и поведения при смене жанра на допустимый и недопустимый +test_set_book_genre_first_set +Проверка успешного начального присвоения жанра -test_get_book_genre -Проверка получения жанра для различных книг и обработки отсутствующих книг +test_set_book_genre_change_to_another +Проверка изменения жанра на другой -test_get_books_with_specific_genre -Проверка фильтрации книг по конкретному жанру +test_set_book_genre_cannot_change_to_third +Проверка невозможности изменить жанр на третий -test_get_books_genre -Проверка получения всех книг с их жанрами в виде словаря +test_set_genre_for_nonexistent_book +Проверка, что жанр не устанавливается для несуществующей книги -test_get_books_for_children -Проверка фильтрации книг для детей по жанрам +test_get_book_genre_empty_initially +Проверка, что у новой книги жанр по умолчанию пуст -test_add_book_in_favorites -Проверка добавления книг в избранное, включая повторное добавление +test_get_book_genre_after_setting +Проверка корректного возвращения заданного жанра -test_delete_book_from_favorites -Проверка удаления книги из избранного, включая удаление несуществующей книги +test_get_book_genre_for_nonexistent_book +Проверка, что для отсутствующей книги жанр возвращается как None -test_get_list_of_favorites_books -Проверка получения списка избранных книг, включая пустое состояние \ No newline at end of file +test_get_books_with_specific_genre_contains_only_right_books +Проверка правильного поиска книг по жанру + +test_get_books_with_specific_genre_no_books +Проверка, что при отсутствии книг заданного жанра возвращается пустой список + +test_get_all_books_genres +Проверка получения словаря всех книг с их жанрами + +test_get_books_for_children_includes_and_excludes_correctly +Проверка фильтрации детских книг: включение мультфильмов, исключение ужасов + +test_add_book_in_favorites_only_once +Проверка, что книга добавляется в избранное только один раз + +test_delete_book_from_favorites_removes_book +Проверка удаления книги из избранного + +test_delete_book_from_favorites_with_nonexistent_book +Проверка удаления несуществующей книги из избранного без влияния + +test_get_list_of_favorites_initially_empty +Проверка, что список избранного пуст изначально + +test_get_list_of_favorites_after_adding +Проверка добавления книги в список избранного \ No newline at end of file diff --git a/__pycache__/tests.cpython-312-pytest-8.4.2.pyc b/__pycache__/tests.cpython-312-pytest-8.4.2.pyc index 97db57d74e30fea5372c6dab19e6e846dd7729d0..bf790a381bd6b3b50cbaa50ac0883ee810f4880b 100644 GIT binary patch delta 4097 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 delta 2263 zcmZvdeQZ-z6u^65U;Fyqt)KgD3v8n>*awUm*l;t<4Unxc#)lJ2$Ll^|>+p32H{JvZ z8e<}n9b=*>K?4dIghEyJhYzA&ZJ-<1R*hYoxnj>Fc7l*Qgj?^hOs`JF6d&8Xr1G~Zz zSq=~G9pEo<2uVc+&!3V|UHnf-hCQj{(g~g4HyDi%^4-(xdt-YdeZ6ux7U_?2RWnwe zno6Crrp2QCXBEha-F>|~B7@Q4#c;eM$3x#Xt$lhjb=P5G!ngsL-3#X`OH$>oLIFa# zxy%S>3Tv1#^_J@@;{wyu00|=Jp3hkV4&>)#Kcax*#DR1&{e3#ANN{m(gazS0&vzatcO@Pj%!IT%8dIXf zCFBD9?X^h(3f)x!&WAnV&$+`VUq&y!O@EUfPmjZ`@B@&LO-E6&+>zMjAH3rF<`Q!WR`z zfjd_KSLd6g3Y?4U$vHRNE0e$+Jc>>|EIW_9U6F({#YSOVNA9K0Ri4yB$mK28%FYqH zpi#A|eT?CLyhgIRH6z(-mYTh5KE63r2PAU?UYF{??6^tZC5(xgwK9gWaWz!fji44; zVSl5G#$t@B$Seuo32C}D&$==U&!+JF1lyl@<)!EDVn`^W> z$XxKR+3VE4$wusWXW{J_$sW=K^I%JL9czJ)tB(mv1FT$;2s|Cwplw#%C}InRK+%s2MIU+w-Ebn#OAgrG&MFYQi!^+>P)*?@|`v%)}h9*Uk}!tMQx_ zKu&G0w465mh$jP6G0qLs!xtf5zkoHuvHCi9 zGYR&-c3c+3tRFw&UT<;Vvbk4r(AzB;;^>1-G3VXsFTc??*ubW2{LZ z!&17etS7x22pbU-<{dq~eR8JjD4R&UncyUBA-qcHAiPG{Mi2O`Xhst zOSzG_8RfGMK_>TkaJD5+7+%DC%!L-WM5ih)Wo+JSu`{7coNg)QE_W&vddS;}gzdy> zHcV9l)4+j{*Jr?DG>oANx<-sxilS;%MP7;~)da~%++^2E z-7M9)^(0$vXi0)fsq0?<+ zlQx5{?tx1We?{8L-^Z;JVt=GJmdP_$`~hj7Ha20X?H`a6ebJQ)z^={$huFgyD%S7^ GU-v(kz+Dvp diff --git a/tests.py b/tests.py index 5c21fd5..e1c9b96 100644 --- a/tests.py +++ b/tests.py @@ -1,20 +1,20 @@ import pytest from main import BooksCollector -class TestBooksCollector: +class TestBooksCollector: - def test_add_new_book_add_two_books(self): + def test_add_two_books_count_is_two(self): collector = BooksCollector() collector.add_new_book('Гарри Поттер и философский камень') collector.add_new_book('1984') assert len(collector.get_books_genre()) == 2 @pytest.mark.parametrize("book_name, expected_count", [ - ("", 0), - ("a" * 41, 0), + ("", 0), + ("a" * 41, 0), ]) - def test_add_new_book_invalid_names(self, book_name, expected_count): + def test_add_book_with_empty_name_not_added(self, book_name, expected_count): collector = BooksCollector() collector.add_new_book(book_name) assert len(collector.get_books_genre()) == expected_count @@ -24,38 +24,53 @@ def test_add_new_book_invalid_names(self, book_name, expected_count): "Гарри Поттер", "1984", ]) - def test_add_new_book_duplicate(self, book_name): + def test_add_duplicate_book_not_duplicate_count(self, book_name): collector = BooksCollector() collector.add_new_book(book_name) collector.add_new_book(book_name) assert len(collector.get_books_genre()) == 1 - def test_set_book_genre(self): + def test_set_book_genre_first_set(self): collector = BooksCollector() collector.add_new_book('Дюна') collector.set_book_genre('Дюна', 'Детективы') assert collector.get_book_genre('Дюна') == 'Детективы' + def test_set_book_genre_change_to_another(self): + collector = BooksCollector() + collector.add_new_book('Дюна') + collector.set_book_genre('Дюна', 'Детективы') collector.set_book_genre('Дюна', 'Фантастика') assert collector.get_book_genre('Дюна') == 'Фантастика' + def test_set_book_genre_cannot_change_to_third(self): + collector = BooksCollector() + collector.add_new_book('Дюна') + collector.set_book_genre('Дюна', 'Фантастика') collector.set_book_genre('Дюна', 'Драма') assert collector.get_book_genre('Дюна') == 'Фантастика' + def test_set_genre_for_nonexistent_book(self): + collector = BooksCollector() collector.set_book_genre('1984', 'Фантастика') assert collector.get_book_genre('1984') is None - def test_get_book_genre(self): + def test_get_book_genre_empty_initially(self): collector = BooksCollector() collector.add_new_book('Пикник на обочине') assert collector.get_book_genre('Пикник на обочине') == '' + def test_get_book_genre_after_setting(self): + collector = BooksCollector() + collector.add_new_book('Пикник на обочине') collector.set_book_genre('Пикник на обочине', 'Комедии') assert collector.get_book_genre('Пикник на обочине') == 'Комедии' + def test_get_book_genre_for_nonexistent_book(self): + collector = BooksCollector() assert collector.get_book_genre('Скотный двор') is None - def test_get_books_with_specific_genre(self): + def test_get_books_with_specific_genre_contains_only_right_books(self): collector = BooksCollector() collector.add_new_book('Дракула') collector.add_new_book('Горе от ума') @@ -64,16 +79,18 @@ def test_get_books_with_specific_genre(self): books = collector.get_books_with_specific_genre('Ужасы') assert 'Дракула' in books and 'Горе от ума' not in books + def test_get_books_with_specific_genre_no_books(self): + collector = BooksCollector() assert collector.get_books_with_specific_genre('Драма') == [] - def test_get_books_genre(self): + def test_get_all_books_genres(self): collector = BooksCollector() collector.add_new_book('Ведьмак') collector.set_book_genre('Ведьмак', 'Мультфильмы') collector.add_new_book('451 градус по Фаренгейту') assert collector.get_books_genre() == {'Ведьмак': 'Мультфильмы', '451 градус по Фаренгейту': ''} - def test_get_books_for_children(self): + def test_get_books_for_children_includes_and_excludes_correctly(self): collector = BooksCollector() collector.add_new_book('Приключения Паддингтона') collector.set_book_genre('Приключения Паддингтона', 'Мультфильмы') @@ -82,27 +99,31 @@ def test_get_books_for_children(self): child_books = collector.get_books_for_children() assert 'Приключения Паддингтона' in child_books and 'Оно' not in child_books - def test_add_book_in_favorites(self): + def test_add_book_in_favorites_only_once(self): collector = BooksCollector() collector.add_new_book('Шерлок Холмс') collector.add_book_in_favorites('Шерлок Холмс') collector.add_book_in_favorites('Шерлок Холмс') assert collector.get_list_of_favorites_books().count('Шерлок Холмс') == 1 - def test_delete_book_from_favorites(self): + def test_delete_book_from_favorites_removes_book(self): collector = BooksCollector() collector.add_new_book('Мастера и Маргарита') collector.add_book_in_favorites('Мастера и Маргарита') collector.delete_book_from_favorites('Мастера и Маргарита') assert 'Мастера и Маргарита' not in collector.get_list_of_favorites_books() + def test_delete_book_from_favorites_with_nonexistent_book(self): + collector = BooksCollector() collector.delete_book_from_favorites('Нет такой книги') assert collector.get_list_of_favorites_books() == [] - def test_get_list_of_favorites_books(self): + def test_get_list_of_favorites_initially_empty(self): collector = BooksCollector() assert collector.get_list_of_favorites_books() == [] + def test_get_list_of_favorites_after_adding(self): + collector = BooksCollector() collector.add_new_book('Хоббит') collector.add_book_in_favorites('Хоббит') assert collector.get_list_of_favorites_books() == ['Хоббит'] \ No newline at end of file From c8a49400e8c98ceb2fe0cb92fd0f9ece557e044a Mon Sep 17 00:00:00 2001 From: Leonov Eduard Date: Tue, 30 Sep 2025 19:10:05 +0700 Subject: [PATCH 4/5] =?UTF-8?q?=D0=92=D0=B0=D1=88=20=D0=BA=D0=BE=D0=BC?= =?UTF-8?q?=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=D1=80=D0=B8=D0=B9=20=D0=BA=20?= =?UTF-8?q?=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 33 ++++----- .../tests.cpython-312-pytest-8.4.2.pyc | Bin 25241 -> 23984 bytes tests.py | 70 +++++++----------- 3 files changed, 40 insertions(+), 63 deletions(-) diff --git a/README.md b/README.md index 4116871..fc37f3c 100644 --- a/README.md +++ b/README.md @@ -3,55 +3,52 @@ test_add_two_books_count_is_two Проверка, что добавление двух книг увеличивает количество книг до двух test_add_book_with_empty_name_not_added -Проверка, что книга с пустым названием не добавляется +Проверка, что книга с пустым названием или длиной больше 40 символов не добавляется test_add_duplicate_book_not_duplicate_count Проверка, что при добавлении книги-дубликата количество книг не увеличивается test_set_book_genre_first_set -Проверка успешного начального присвоения жанра +Проверка успешного начального присвоения жанра книге test_set_book_genre_change_to_another -Проверка изменения жанра на другой - -test_set_book_genre_cannot_change_to_third -Проверка невозможности изменить жанр на третий +Проверка изменения жанра книги на другой жанр test_set_genre_for_nonexistent_book Проверка, что жанр не устанавливается для несуществующей книги test_get_book_genre_empty_initially -Проверка, что у новой книги жанр по умолчанию пуст +Проверка, что у ново добавленной книги жанр по умолчанию пустой test_get_book_genre_after_setting -Проверка корректного возвращения заданного жанра +Проверка, что возвращается корректный жанр после установки test_get_book_genre_for_nonexistent_book -Проверка, что для отсутствующей книги жанр возвращается как None +Проверка, что для отсутствующей в коллекции книги жанр возвращается None test_get_books_with_specific_genre_contains_only_right_books -Проверка правильного поиска книг по жанру +Проверка корректного поиска и возврата книг с указанием конкретного жанра test_get_books_with_specific_genre_no_books -Проверка, что при отсутствии книг заданного жанра возвращается пустой список +Проверка, что при отсутствии книг с заданным жанром возвращается пустой список test_get_all_books_genres -Проверка получения словаря всех книг с их жанрами +Проверка корректного возврата полного словаря всех книг и их жанров test_get_books_for_children_includes_and_excludes_correctly -Проверка фильтрации детских книг: включение мультфильмов, исключение ужасов - +Проверка фильтрации детских книг: включение неимеющих возрастного рейтинга жанров и исключение с возрастным рейтингом + test_add_book_in_favorites_only_once Проверка, что книга добавляется в избранное только один раз test_delete_book_from_favorites_removes_book -Проверка удаления книги из избранного +Проверка успешного удаления книги из списка избранных test_delete_book_from_favorites_with_nonexistent_book -Проверка удаления несуществующей книги из избранного без влияния +Проверка, что удаление несуществующей книги из фаворитов не вызывает ошибок и не влияет на список test_get_list_of_favorites_initially_empty -Проверка, что список избранного пуст изначально +Проверка, что список избранных книг пуст изначально test_get_list_of_favorites_after_adding -Проверка добавления книги в список избранного \ No newline at end of file +Проверка, что книга корректно добавляется в список избранных \ No newline at end of file diff --git a/__pycache__/tests.cpython-312-pytest-8.4.2.pyc b/__pycache__/tests.cpython-312-pytest-8.4.2.pyc index bf790a381bd6b3b50cbaa50ac0883ee810f4880b..5a1c994e4349df3ace13d7334828e21ab73506a0 100644 GIT binary patch delta 5665 zcmd5=dr(~E6~FiHz5BSAWeF_o65fx%Zh-JgcvLpQJd6QC$WtXUn}uBx2(Ny-*pQ+S zlQwaDOyaSkotB!m)?zvhoy=5i)avwMXS5cYKWsPJ#F_k|Gi_%B?Kq>3_MC4YYyu?q zpH45s@1E~`-~INS^PShd&;CxFz9=TXZ8oa{UhCeveCWriXAk14qWPrNGCPiEywqt*+mT+t21GGuck{67@$(iObf{2-xP#%Vwhqy0R9<-lVm)uQW`&PDX}>SE%56(dLi8FEw`z}`u?Qe}dUVh5}% z#$8va;4Nwbi)@0Iit_mVoR$TXI3LoSq6Jna1S*qJH*ShxqVLEMx`WT_?iw5(2sri3 zN^_|MX#_R`JN!B!w=xq+r^jKE2R!{gR!vM)QD9Dj)dZ!GWG)wt&}crC zv;rCa4-v+NkSdsx;SKX;Jvkbyg|ms9MKio(OpkY+m~BOfk!0oqQGst+!k+Vv#f}DW zdw+{i?1S}sS?OkpC<>osW86I zuCl6kEs8IA!DR*8>Le)Mn+oq{618>YaXmbW;jH z=b&zAq>5lIK@D4r%h@`D8iXm0Wr1QVOv)inE_G=^YtMl%J5(5H&xXPFN;rb! z^CkIks(hEp)XK~xKpVVN(3!b}d>DdTX~Es#aioZJ7n73Dml7S<1PkD7g%$qlu)wsVPOCze ze;NU;{+Z)^ydDSQEgsh6#&|%UHBIjoDX=a)WW6N9s?zk9TML>H7Bp;V5=Wz4=XW3U z4KN>DA|UL`Dw4+)d7^ZaMnUD@BXT9Km98EO34&>xG~;Lr6SJ0Lq%T>T!^1y}ytl(U zyTgm4Zt-sEx*)WP+oZ@dd=ZV2owQB*gzpr_e}{LCt%#qyfga-vaRU_M)JXgk_6v)6 z|B7r|9KUcb%ycv@!L&3lW}@^YbajgnWtvQXQpRfotfsz)+rwCf~zeyxLl9} z<9DoC#yf{@S1r_rA&n}Ze-Z(`^YMo7NA)M~Y>4U~>*}LjN2I&I=t{)?qX7QyN{5cU z*-)^4p{@7mjIo;B22~r<;Ya&g;n@ubk}L4XoDzEoZ)}{v0$Ss~I*PC14Y=zcBJ1>d0`YB_aV{o5nrX{NhS_mE>pf1Hvt`Kcdm=O$j zwrIR6Rfk=n`_8JEE08IEvM5lOFvSb5RA|{`!9Y#H!f%8JHvNAGY9$2jsv5(RAPnmf zW+rD|n|YmikYt?%UWB05b*QJ$>*l49brbs_0i6pwM9@ocn4piKp8y?4U;_k$2+sIe zPdn%fgm-gy4>ETbT-j!1UHsd};ap*3;S!97gj&&)qp@{I#XSV@F#e_YJyZaLA*& zUOj(TbT>J$C(MTDo9q{!U7aIB{|X1#gLe#^!PZXg9$fAJ5&=`lwbn1coY~E^4qWDc1p)1qw&&$|dxbFl-1s3S`uPM7+*b+T+#CN|@khA2 zGaX)OZ-wjo3h^~R?ViZX!!eR$K~0rCMT{pF%0bF;65*yC_?LT5XkEmA1_4DIymumA zw0EPTQ8l#E7abJo=89;AC-1Y}t{2lS-;1emwtaB}_V&J_LPKl#J!67Y;l6y6mZsY( zIJkd6qvYj(B&=X)|EYKdt;_o=6}hyI)C(PZC&Y#Xe0t{jnb&82fqyU0K71RwB6aF< zk~{7QvX(dkToNqip9dgsdm2o-6JWsIp!Fi(e+~f;SLqNyRzDw{u z0xAu>7w4ZZm_|ba%7gxk2q%O&S*NTEsj$|QKPD*~#d(uXZwMKQ3>gJ|!pZ%|_P?iO z&MKMD?4J|l68*d&>kZdcd}>}pDn!&ALW?-3%1Wy^mmn#1bGX4San7hywn=lUs5Fan zdcCq!oJ$JRva(&8OVBF=$dQ!}d`MP&PX4TG&L}FbdA$xF3d>FsI}?J&&f%WEK+k}m z<$>H;J;vkxIh-Tg^$akXNJDqek-#v%^Km!h3g2jips}HU&^z4cThFHO0SpYmPu~(k vI#Cp_kVTH0KM-<4dOanjnHMHI~VXjiIEc_ delta 6313 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 Date: Tue, 30 Sep 2025 19:49:31 +0700 Subject: [PATCH 5/5] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D1=82=D0=B5=D1=81=D1=82=D1=8B,=20=D0=B4=D0=BE=D0=B1?= =?UTF-8?q?=D0=B0=D0=B2=D0=B8=D0=BB=20=D1=84=D0=B8=D0=BA=D1=81=D1=82=D1=83?= =?UTF-8?q?=D1=80=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 36 ++++++++++++++++++------------------ tests.py | 13 ++++++------- 2 files changed, 24 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index fc37f3c..de7a963 100644 --- a/README.md +++ b/README.md @@ -1,54 +1,54 @@ # qa_python test_add_two_books_count_is_two -Проверка, что добавление двух книг увеличивает количество книг до двух +Проверяет, что после добавления двух книг их количество становится ровно два test_add_book_with_empty_name_not_added -Проверка, что книга с пустым названием или длиной больше 40 символов не добавляется +Проверяет, что книга с пустым названием или слишком длинным названием не добавляется test_add_duplicate_book_not_duplicate_count -Проверка, что при добавлении книги-дубликата количество книг не увеличивается +Проверяет, что нельзя добавить одну и ту же книгу дважды test_set_book_genre_first_set -Проверка успешного начального присвоения жанра книге +Проверяет, что можно успешно установить жанр для книги в первый раз test_set_book_genre_change_to_another -Проверка изменения жанра книги на другой жанр +Проверяет, что жанр книги можно изменить на другой test_set_genre_for_nonexistent_book -Проверка, что жанр не устанавливается для несуществующей книги +Проверяет, что жанр не устанавливается для книги, которой нет в списке test_get_book_genre_empty_initially -Проверка, что у ново добавленной книги жанр по умолчанию пустой +Проверяет, что у новой книги жанр по умолчанию пустой test_get_book_genre_after_setting -Проверка, что возвращается корректный жанр после установки +Проверяет, что метод возвращает правильный жанр после установки test_get_book_genre_for_nonexistent_book -Проверка, что для отсутствующей в коллекции книги жанр возвращается None +Проверяет, что для несуществующей книги жанр не найден (возвращается None) test_get_books_with_specific_genre_contains_only_right_books -Проверка корректного поиска и возврата книг с указанием конкретного жанра +Проверяет, что возвращаются только книги с указанным жанром test_get_books_with_specific_genre_no_books -Проверка, что при отсутствии книг с заданным жанром возвращается пустой список +Проверяет, что если книг с указанным жанром нет, возвращается пустой список test_get_all_books_genres -Проверка корректного возврата полного словаря всех книг и их жанров +Проверяет, что возвращается весь словарь книг с их жанрами test_get_books_for_children_includes_and_excludes_correctly -Проверка фильтрации детских книг: включение неимеющих возрастного рейтинга жанров и исключение с возрастным рейтингом +Проверяет, что книги с детским жанром включаются, а с возрастным ограничением исключаются test_add_book_in_favorites_only_once -Проверка, что книга добавляется в избранное только один раз +Проверяет, что книга добавляется в избранное только один раз test_delete_book_from_favorites_removes_book -Проверка успешного удаления книги из списка избранных +Проверяет, что книга успешно удаляется из избранного test_delete_book_from_favorites_with_nonexistent_book -Проверка, что удаление несуществующей книги из фаворитов не вызывает ошибок и не влияет на список +Проверяет, что попытка удалить отсутствующую книгу из избранного не вызывает ошибок test_get_list_of_favorites_initially_empty -Проверка, что список избранных книг пуст изначально +Проверяет, что список избранных книг пуст при старте test_get_list_of_favorites_after_adding -Проверка, что книга корректно добавляется в список избранных \ No newline at end of file +Проверяет, что добавленная книга появляется в списке избранных \ No newline at end of file diff --git a/tests.py b/tests.py index 8762c1c..2f1737f 100644 --- a/tests.py +++ b/tests.py @@ -35,26 +35,25 @@ def test_add_duplicate_book_not_duplicate_count(self, collector, book_name): def test_set_book_genre_first_set(self, collector): collector.add_new_book('Дюна') collector.set_book_genre('Дюна', 'Детективы') - assert collector.get_book_genre('Дюна') == 'Детективы' + assert collector.books_genre['Дюна'] == 'Детективы' def test_set_book_genre_change_to_another(self, collector): collector.add_new_book('Дюна') collector.set_book_genre('Дюна', 'Детективы') collector.set_book_genre('Дюна', 'Фантастика') - assert collector.get_book_genre('Дюна') == 'Фантастика' + assert collector.books_genre['Дюна'] == 'Фантастика' def test_set_genre_for_nonexistent_book(self, collector): collector.set_book_genre('1984', 'Фантастика') - assert collector.get_book_genre('1984') is None + assert '1984' not in collector.books_genre or collector.books_genre.get('1984') is None def test_get_book_genre_empty_initially(self, collector): collector.add_new_book('Пикник на обочине') assert collector.get_book_genre('Пикник на обочине') == '' def test_get_book_genre_after_setting(self, collector): - collector.add_new_book('Пикник на обочине') - collector.set_book_genre('Пикник на обочине', 'Комедии') - assert collector.get_book_genre('Пикник на обочине') == collector.books_genre['Пикник на обочине'] + collector.books_genre['Пикник на обочине'] = 'Комедии' + assert collector.get_book_genre('Пикник на обочине') == 'Комедии' def test_get_book_genre_for_nonexistent_book(self, collector): assert collector.get_book_genre('Скотный двор') is None @@ -106,4 +105,4 @@ def test_get_list_of_favorites_initially_empty(self, collector): def test_get_list_of_favorites_after_adding(self, collector): collector.add_new_book('Хоббит') collector.add_book_in_favorites('Хоббит') - assert collector.get_list_of_favorites_books() == ['Хоббит'] + assert collector.get_list_of_favorites_books() == ['Хоббит'] \ No newline at end of file