Ачааллж байна...
Өмнөх хичээлд тест бол хэзээ ч унтдаггүй харуул гэдгийг ойлгож, түүний ашиг болон хязгаарыг шударгаар ярьсан. Одоо тэр харуулыг ажилд авах цаг ирлээ. Энэ хичээлд бид pytest-ийг суулгаж, pytest тестүүдийг хэрхэн олдог, нэрлэх дүрмийг сурч, жижиг бодит функцэд анхны тестээ бичнэ. Дараа нь pytest-ийг ажиллуулж, амжилттай тестийн гаралтыг мөр мөрөөр нь уншина. Тэр гаралтад нэг жижиг ногоон цэг гарч ирэх бөгөөд энэ бол таны анхны харуул анхны хаалгаа шалгаад "зүгээр" гэж хэлсэн мөч юм.
Түвшин 1-ийн нэгэн адил бид шинэ хэрэгслийг эхлээд дадлагын фолдерт туршина. Бүлэг 7, 8-ын туршид pytest-dadlaga нэртэй тусдаа фолдерт жижиг үнийн тооцооны модуль дээр ажиллаж, pytest-ийн бүх үндсэн боломжийг айхгүйгээр туршина. Дараа нь Бүлэг 9-ийн удирдлагатай бүтээлд сурсан бүх зүйлээ зарлагын бүртгэлдээ хэрэглэж, жинхэнэ тестийн цуглуулга бичнэ.
Харуул хөлсөлсний дараа түүнд хоёр зүйл хэлэх хэрэгтэй: юуг шалгах вэ, юуг хүлээх вэ. "Гурав дахь давхрын зүүн хаалга" гэсэн байршил, "түгжээтэй байх ёстой" гэсэн хүлээлт. Харуул байршлыг олж, бодит байдлыг хүлээлттэй харьцуулаад, тохирвол чимээгүй цааш явна, тохирохгүй бол дуу гаргана.
Тест яг ийм хоёр хэсэгтэй. Эхний хэсэг нь таны функцийг тодорхой оролтоор дуудаж, бодит үр дүнг гаргана. Хоёр дахь хэсэг нь assert бөгөөд тэр бодит үр дүнг хүлээгдэж буй утгатай харьцуулна. pytest бол харуулын даргатай адил: тэр бүх харуулыг, өөрөөр хэлбэл бүх тестийг олж, тус бүрийг ажиллуулж, эцэст нь хэд нь "зүгээр", хэд нь "асуудалтай" гэж нэгтгэн тайлагнана. Харин pytest харуулуудаа хэрхэн олдог вэ? Нэрээр нь. Энэ хичээлийн гол дүрмийг доор үзнэ.
Алхам 1: Дадлагын фолдер ба venv
VS Code-д шинэ terminal нээж, хэрэглэгчийн фолдертоо шинэ фолдер үүсгэнэ үү. 4.3 дугаар хичээлээс санаж байгаачлан ямар ч repository-ийн дотор биш, хэрэглэгчийн фолдерын шууд доор үүсгэнэ.
Command:
cd ~
mkdir pytest-dadlaga
cd pytest-dadlaga
code .Шинэ VS Code цонх нээгдэнэ. Тэр цонхны terminal-д venv үүсгэж, идэвхжүүлнэ.
Command:
python -m venv venv
.\venv\Scripts\Activate.ps1Гаралт:
(venv) PS C:\Users\Bat\pytest-dadlaga>Terminal-ын мөрийн эхэнд “(venv)” гарч ирсэн нь venv идэвхтэй байгааг заана.
Сануулга: venv. pytest бол гадны package тул түүнийг заавал venv дотор суулгана. Хэрвээ мөрийн эхэнд “(venv)” харагдахгүй бол pip package-ийг таны компьютерийн ерөнхий Python-д суулгана. Энэ нь төслүүдийн хооронд хувилбарын зөрчил үүсгэдэг бөгөөд өмнөх сургалтын venv-ийн хичээлд яг энэ асуудлаас сэргийлэхийг сурсан. pip install бичихээсээ өмнө “(venv)” байгаа эсэхийг үргэлж шалгаарай. Хэрвээ Activate.ps1 ажиллуулахад “running scripts is disabled” гэсэн алдаа гарвал 5.2 дугаар хичээлийн шийдлийг ашиглана уу.
Алхам 2: pytest суулгах
Command:
pip install pytestГаралт:
Collecting pytest
Downloading pytest-9.1.1-py3-none-any.whl.metadata (7.6 kB)
Collecting colorama>=0.4 (from pytest)
Downloading colorama-0.4.6-py2.py3-none-any.whl.metadata (17 kB)
Collecting iniconfig>=1.0.1 (from pytest)
...
Collecting pluggy<2,>=1.5 (from pytest)
...
Collecting pygments>=2.7.2 (from pytest)
...
Installing collected packages: pygments, pluggy, packaging, iniconfig, colorama, pytest
Successfully installed colorama-0.4.6 iniconfig-2.1.0 packaging-25.0 pluggy-1.6.0 pygments-2.19.2 pytest-9.1.1Гаралтыг уншъя. “Collecting pytest” нь pip pytest-ийг хайж эхэлснийг, “Downloading” нь татаж байгааг заана. Дараагийн “Collecting ... (from pytest)” мөрүүд сонирхолтой: pytest өөрөө бусад хэдэн package-ийг шаарддаг тул pip тэдгээрийг ч бас авч байна. Жишээ нь colorama нь Windows terminal-д өнгө харуулах, pygments нь кодыг өнгөөр ялгах, pluggy нь pytest-ийн өргөтгөлүүдийг удирдах үүрэгтэй. Эдгээрийг dependency буюу хамаарал гэдэг. Таны дэлгэцэнд “...” хэсгийн оронд “Downloading” мөрүүд байна. “Installing collected packages” мөр бүх package-ийг суулгаж байгааг, сүүлийн “Successfully installed” мөр амжилттай суусныг, хувилбар бүрийн хамт харуулна. Таны хувилбарууд илүү шинэ байж болох нь хэвийн.
Command:
pytest --versionГаралт:
pytest 9.1.1pytest суулаа.
Шалгах цэг: “Successfully installed ... pytest-...” гарсан, pytest --version хувилбар харуулж байна.
Алхам 3: Тестлэх функц
Тестлэх зүйл хэрэгтэй. VS Code-д prices.py нэртэй файл үүсгэж, дараах функцийг бичнэ үү.
python
def add_vat(amount):
return amount + amount * 10 // 100Энэ функц дүнд 10 хувийн нэмэгдсэн өртгийн албан татвар буюу НӨАТ нэмдэг. “//” бол өмнөх сургалтаас мэдэх бүхэл хуваалт: үр дүнг бүхэл тоо болгож доош нь тайрдаг. Ингэснээр функц үргэлж бүхэл төгрөг буцаана. Жишээ нь 1000 төгрөгт 100 төгрөгийн татвар нэмж 1100 болно.
Алхам 4: Анхны тест бичих
Одоо prices.py-тэй нэг фолдерт test_prices.py нэртэй шинэ файл үүсгэж, дараахыг бичнэ үү.
python
from prices import add_vat
def test_add_vat():
assert add_vat(1000) == 1100Гурван мөр. Мөр бүрийг уншъя. Эхний мөр тестлэх функцийг prices модулиас import хийнэ, яг программд хэрэглэдэгтэй адил. Хоосон хоёр мөрийн дараа test_add_vat нэртэй функц тодорхойлогдсон. Түүний цорын ганц мөр assert: “add_vat(1000) нь 1100-тэй тэнцүү байх ёстой” гэсэн мэдэгдэл. Хэрвээ тэнцүү бол assert юу ч хийхгүй, тест давна. Тэнцүү биш бол assert алдаа өгч, тест унана.
1100-ийг хэрхэн мэдсэнийг анхаараарай. Бид кодыг ажиллуулж үр дүнг нь хуулж аваагүй. Өмнөх хичээлд хэлсэнчлэн хүлээгдэж буй утгыг толгойдоо бие даан бодсон: мянгын арван хувь нь зуу, нийлбэр нь мянга нэг зуу. Хэрвээ кодын хариуг хуулж тестэд бичвэл код буруу байсан ч тест давах байсан.
Нэрлэх дүрэм: pytest тестүүдийг хэрхэн олдог вэ
pytest-ийг ажиллуулахаас өмнө түүний хамгийн чухал дүрмийг ойлгоё. pytest тестүүдийг нэрээр нь олдог. Тиймээс тест олдохын тулд хоёр нөхцөл заавал биелэх ёстой. Нэгдүгээрт, файлын нэр “test_”-ээр эхэлсэн байх, жишээ нь test_prices.py. (“test”-ээр төгссөн нэр ч ажилладаг ч энэ сургалтад “test”-ээр эхэлсэн хэлбэрийг ашиглана.) Хоёрдугаарт, тест функцийн нэр “test”-ээр эхэлсэн байх, жишээ нь test_add_vat. pytest одоогийн фолдер болон доорх фолдеруудыг хайж, эдгээр дүрэмд нийцсэн файлуудыг нээж, дотор нь эдгээр дүрэмд нийцсэн функцуудыг ажиллуулна.
Энэ дүрмийн давуу тал нь ямар ч тохиргоо шаардахгүй: pytest-д "энэ миний тест" гэж хэлэх шаардлагагүй, нэр л хангалттай. Сул тал нь нэгэн: нэрээ буруу өгвөл pytest таны тестийг чимээгүй алгасна. Энэ нь хамгийн түгээмэл анхлан суралцагчийн алдаа бөгөөд Түгээмэл алдаанууд хэсэгт түүний шинжийг харуулна. Тест функцийн нэр “test”-ийн араас юуг шалгаж байгааг тодорхой хэлэх ёстой, яг commit message шиг. test_add_vat сайн, test1 муу.
Алхам 5: pytest ажиллуулах
Terminal-д “(venv)” байгаа эсэхийг шалгаад, pytest-dadlaga фолдерт байхдаа бичнэ үү.
Command:
pytestГаралт:
============================= test session starts =============================
platform win32 -- Python 3.13.7, pytest-9.1.1, pluggy-1.6.0
rootdir: C:\Users\Bat\pytest-dadlaga
collected 1 item
test_prices.py . [100%]
============================== 1 passed in 0.01s ==============================Энэ бол таны анхны pytest-ийн гаралт. Мөр мөрөөр нь уншъя, учир нь энэ бүтэц Түвшин 3-ын туршид дахин дахин гарч ирнэ.
“============ test session starts ============” нь "тестийн хуралдаан эхэллээ" гэсэн утгатай. Тэнцүүгийн тэмдгүүд нь зүгээр л хэсгийг тусгаарладаг шугам бөгөөд урт нь таны terminal-ын өргөнөөс хамаарна.
“platform win32 -- Python 3.13.7, pytest-9.1.1, pluggy-1.6.0” нь орчны мэдээлэл: Windows систем, Python-ий хувилбар, pytest болон pluggy-ийн хувилбар. “win32” гэдэг нь 64 бит компьютер дээр ч Windows-ийн уламжлалт нэр. Энэ мөр асуудал гарах үед "ямар орчинд ажиллуулсан бэ" гэдгийг хэлж өгдөг.
“rootdir: C:\Users\Bat\pytest-dadlaga” нь pytest аль фолдерыг төслийн үндэс гэж үзсэнийг заана. Хэрвээ энэ мөр таны хүлээснээс өөр фолдер харуулж байвал та буруу газар pytest ажиллуулсан байж магадгүй.
“collected 1 item” нь “1 зүйл цуглууллаа”, өөрөөр хэлбэл pytest нэрлэх дүрмийн дагуу нэг тест олсон гэсэн утгатай. Энэ мөр маш чухал: хэрвээ та гурван тест бичсэн хэрнээ “collected 1 item” гэж байвал хоёрынх нь нэр буруу байна гэсэн дохио.
“test_prices.py .” бол гол мөр. Файлын нэрийн араас тест бүрийн үр дүн нэг тэмдэгтээр харагдана. Цэг “.” нь "давлаа" гэсэн утгатай бөгөөд ихэнх terminal-д ногоон өнгөтэй. Энэ бол харуулын "зүгээр" гэсэн хариу. Мөрийн баруун төгсгөлийн “[100%]” нь бүх тестийн хэдэн хувь нь ажилласныг харуулна.
Сүүлийн мөр “1 passed in 0.01s” нь нэгтгэсэн дүн: “0.01 секундэд 1 тест давлаа”. Бүх тест давсан үед энэ мөр ногоон өнгөтэй, ямар нэг тест унасан үед улаан өнгөтэй байна. Тиймээс урт гаралтыг уншихгүйгээр ч эхлээд сүүлийн мөрийн өнгийг харахад дүр зураг шууд тодорхой болно.
Баяр хүргэе, энэ бол таны анхны автомат тест. Таны харуул анхны хаалгаа шалгаж, "зүгээр" гэж хэллээ.
Шалгах цэг: “collected 1 item”, “test_prices.py .”, “1 passed” гарсан.
Дэлгэрэнгүй гаралт: pytest -v
Цэг товч боловч аль тест давсныг нэрээр нь харуулдаггүй. “-v” нэмбэл дэлгэрэнгүй болно.
Command:
pytest -vГаралт:
============================= test session starts =============================
platform win32 -- Python 3.13.7, pytest-9.1.1, pluggy-1.6.0 -- C:\Users\Bat\pytest-dadlaga\venv\Scripts\python.exe
cachedir: .pytest_cache
rootdir: C:\Users\Bat\pytest-dadlaga
collected 1 item
test_prices.py::test_add_vat PASSED [100%]
============================== 1 passed in 0.01s ==============================“-v” нь verbose буюу дэлгэрэнгүй гэсэн утгатай, 4.2 дугаар хичээлийн git remote -v-тэй ижил санаа. Платформын мөрөнд Python-ий бүтэн зам нэмэгдсэн: энэ нь pytest яг таны venv дотрх Python-ийг ашиглаж байгааг баталдаг тул хэрэгтэй шалгалт. “cachedir: .pytest_cache” нь pytest өөрийн тэмдэглэлийг хадгалах фолдер, түүнийг доор ярина. Гол өөрчлөлт нь үр дүнгийн мөр: цэгийн оронд “test_prices.py::test_add_vat PASSED” гэж байна. “::” тэмдэг нь файл болон түүн доторх тестийг холбодог. Энэ хэлбэр тест бүрийг нэрээр нь харуулдаг тул тест олон болоход хаана юу болсныг харахад тустай.
Хэд хэдэн тест
Нэг функцэд нэг тест ховор хангалттай байдаг. Өмнөх хичээлийн хил дээрх тохиолдлуудыг санацгаая. add_vat-д ямар хил бий вэ? Тэг дүн. Мөн “//”-ийн доош тайрах зан төлөв: 99 төгрөгийн арван хувь нь 9.9, доош тайрвал 9, тиймээс нийлбэр нь 108 байх ёстой. test_prices.py-д хоёр тест нэмнэ үү.
python
from prices import add_vat
def test_add_vat():
assert add_vat(1000) == 1100
def test_add_vat_zero():
assert add_vat(0) == 0
def test_add_vat_rounds_down():
assert add_vat(99) == 108Тест бүр тусдаа функц бөгөөд нэр нь юуг шалгаж байгааг хэлж байна. Сүүлийн тест сонирхолтой: энэ нь функцийн доош тайрдаг зан төлөвийг баримтжуулж байна. Хэрвээ хэн нэгэн хожим функцийг дээш тойруулдаг болгож өөрчилбөл энэ тест унаж, тэр өөрчлөлт санаатай эсэхийг асуухад хүргэнэ. 7.1 дүгээр хичээлд "тест кодын зан төлөвийг баримтжуулдаг" гэсний жинхэнэ жишээ энэ.
Command:
pytestГаралт:
============================= test session starts =============================
platform win32 -- Python 3.13.7, pytest-9.1.1, pluggy-1.6.0
rootdir: C:\Users\Bat\pytest-dadlaga
collected 3 items
test_prices.py ... [100%]
============================== 3 passed in 0.01s ==============================“collected 3 items” гурван тест олдсоныг, “...” гурван цэг гурвуулаа давсныг харуулна. Тест хэд ч болсон хугацаа бараг өөрчлөгдөхгүй: 0.01 секунд. Энэ бол харуулын хүч: хаалгын тоо өссөн ч шалгах хугацаа өсөхгүй.
pytest юу үүсгэсэн бэ
VS Code-ийн Explorer хэсгийг хараарай. Хоёр шинэ фолдер гарч ирсэн: pycache болон .pytest_cache. Эхнийх нь 2.4 дүгээр хичээлээс таньж байгаа Python-ий түр файлууд, prices.py болон test_prices.py-ийн хөрвүүлсэн хувилбарууд. Хоёр дахь нь pytest-ийн өөрийн тэмдэглэл, жишээ нь өмнө нь аль тест унасныг санахад ашигладаг. Аль аль нь автоматаар үүсдэг хог тул цомогт орох ёсгүй. Бүлэг 9-д зарлагын бүртгэлдээ тест нэмэхдээ .gitignore-д “.pytest_cache/” мөр нэмнэ. Харин тестийн файлууд өөрсдөө, test_prices.py шиг, кодын нэг хэсэг тул заавал commit хийгддэг.
Хүсвэл prices.py-д remove_vat(amount_with_vat) гэсэн шинэ функц нэмж үзээрэй: НӨАТ-тай дүнгээс татваргүй дүнг буцаадаг, жишээ нь 1100-аас 1000. Бүхэл хуваалт ашиглавал amount_with_vat * 100 // 110 гэж бичиж болно. Дараа нь test_prices.py-д түүний хоёр гурван тест бичээрэй: ердийн тохиолдол, тэг, магадгүй add_vat-ийн үр дүнг буцааж remove_vat-д өгөхөд анхны дүн гарах эсэх. Хүлээгдэж буй утгуудыг кодыг ажиллуулалгүй, толгойдоо бодож бичээд pytest ажиллуулаарай.
pytest танигдахгүй байх.
pytest : The term 'pytest' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.Энэ мессежийг 1.3 дугаар хичээлийн git-ийн алдаанаас таньж байгаа: PowerShell pytest гэдэг программыг олсонгүй. Хамгийн түгээмэл шалтгаан нь venv идэвхгүй: мөрийн эхэнд “(venv)” байхгүй. .\venv\Scripts\Activate.ps1 ажиллуулаад дахин оролдоно уу. Хэрвээ venv идэвхтэй байгаа ч алдаа гарсаар байвал pytest энэ venv-д суугаагүй байна, Алхам 2-ыг давтана уу. Мөн python -m pytest гэж бичиж болно: энэ нь venv-ийн Python-оор pytest-ийг шууд ажиллуулдаг тул PATH-ийн асуудлыг тойрдог.
Тест олдохгүй байх.
============================= test session starts =============================
platform win32 -- Python 3.13.7, pytest-9.1.1, pluggy-1.6.0
rootdir: C:\Users\Bat\pytest-dadlaga
collected 0 items
============================ no tests ran in 0.01s ============================“collected 0 items” нь “0 зүйл цуглуулсан”, сүүлийн мөр “no tests ran” нь "ямар ч тест ажиллаагүй" гэсэн утгатай. Энэ бол алдааны мессеж биш, харин pytest нэрлэх дүрэмд нийцсэн юу ч олсонгүй гэсэн мэдээ. Шалгах гурван зүйл бий. Файлын нэр “test_”-ээр эхэлсэн үү: “prices_test.py” ажиллана, харин “tests_prices.py” эсвэл “testprices.py” ажиллахгүй. Функцийн нэр “test”-ээр эхэлсэн үү: “check_add_vat” олдохгүй. Та зөв фолдерт pytest ажиллуулсан уу: rootdir мөрийг хараарай. Хэрвээ файл нь зөв нэртэй ч зарим функц нь буруу нэртэй бол pytest зөв нэртэйг нь л олж, “collected” тоо таны бичсэнээс бага байна.
Модуль олдохгүй байх.
ImportError while importing test module 'C:\Users\Bat\pytest-dadlaga\test_prices.py'.
...
E ModuleNotFoundError: No module named 'prices'Тестийн файл prices модулийг import хийх гэтэл олсонгүй. Энэ хичээлийн бүтцэд prices.py болон test_prices.py нэг фолдерт байх ёстой. Explorer хэсэгт хоёр файл зэрэгцэн байгаа эсэхийг, prices.py-ийн нэр зөв эсэхийг шалгаарай: “price.py” эсвэл “prices.py.py” зэрэг алдаа түгээмэл. Тестүүдийг тусдаа фолдерт байрлуулах аргыг 8.1 дүгээр хичээлд сурна.
pip install-ийг venv-ээс гадуур хийх. Хэрвээ “(venv)” байхгүй үед pytest суулгасан бол тэр нь таны ерөнхий Python-д суусан. Энэ нь яг одоо асуудал үүсгэхгүй байж магадгүй ч хожим төслүүдийн хооронд хувилбарын зөрчил, "аль pytest ажиллаж байна вэ" гэсэн төөрөгдөл үүсгэнэ. pytest -v-ийн платформын мөрөнд Python-ий зам “venv”-ээр дамжиж байгаа эсэхийг шалгаарай. Хэрвээ дамжихгүй бол venv-ээ идэвхжүүлээд pytest-ийг venv дотор дахин суулгана уу.
pytest бол Python-ий хамгийн өргөн хэрэглэгддэг test runner бөгөөд түүнийг төслийн venv дотор pip install pytest-ээр суулгадаг, “(venv)” тэмдгийг үргэлж шалгана. pytest өөрийн хамаарлуудыг, жишээ нь colorama, pluggy, pygments-ийг хамт суулгадаг. Тест бол функцийг тодорхой оролтоор дуудаж, assert-ээр бодит үр дүнг хүлээгдэж буй утгатай харьцуулдаг функц бөгөөд хүлээгдэж буй утгыг бие даан бодож бичнэ. pytest тестүүдийг нэрээр нь олдог: файл “test_”-ээр эхэлсэн, функц “test”-ээр эхэлсэн байх ёстой, эс бөгөөс чимээгүй алгасна. pytest гаралт нь хуралдааны толгой, платформ, rootdir, “collected N items”, файл бүрийн үр дүнгийн тэмдэгт (“.” бол давсан), эцсийн дүн гэсэн бүтэцтэй бөгөөд сүүлийн мөрийн өнгө нэг харцаар нөхцөл байдлыг хэлдэг. pytest -v тест бүрийг нэрээр нь “PASSED” гэж харуулна. “collected 0 items” нь нэрлэх дүрэм зөрчигдсөний шинж. pytest-ийн үүсгэдэг .pytest_cache фолдер цомогт орох ёсгүй.
Дараагийн хичээлд assert-ийг гүнзгий сурна. Тэнцүү эсэхээс гадна жагсаалтад байгаа эсэх, их бага эсэхийг шалгаж, бутархай тоонуудын тухай нэг сонирхолтой, чухал үнэнтэй танилцаж, түүнийг pytest.approx-оор шударгаар шийднэ.
Бүртгэлтэй болсноор энэ сургалтын бүх хичээлд хандах эрх авна.