Ачааллж байна...
Энэ сургалтын эхнээс бид нэг уламжлал баримталсан: алдааны мессеж бүрийг айлгүйгээр, мөр мөрөөр нь монголоор уншдаг. Git-ийн “fatal: not a git repository”, merge-ийн conflict тэмдэглэгээ, push-ийн татгалзсан мессеж, Python-ий traceback бүгдийг ингэж уншсан. Одоо тэр уламжлалыг pytest-ийн хамгийн чухал гаралт буюу унасан тестийн тайланд хэрэглэх цаг ирлээ. Өмнөх хичээлд бид бутархай тооны тестийн уналтыг товч харсан. Энэ хичээлд уналтын гаралтын бүх хэсгийг бүрэн задалж уншина.
Энэ ур чадвар яагаад тийм чухал вэ? Харуул "асуудал байна" гэж хашгирах нь эхний алхам л. Жинхэнэ ажил бол "асуудал юу вэ, хаана байна вэ, хэн буруутай вэ: код уу, тест үү" гэдгийг ойлгох явдал. pytest энэ бүх асуултын хариултыг тайландаа аль хэдийн бичсэн байдаг, гагцхүү уншиж сурах хэрэгтэй. Энэ хичээлд бид prices.py-д зориуд алдаа оруулж, олон тест нэгэн зэрэг унахыг харна. Тэдгээрийн тайланг уншиж, бүгд нэг шалтгаантайг олж, засна. Дараа нь кодыг биш, тестийг буруу бичсэн нөхцөл, мөн код огт унасан нөхцөлийг харна. Эцэст нь уналттай ажиллах хоёр хэрэгтэй тохиргоог сурна.
Эмнэлэгт цусны шинжилгээ өгөхөд та хариугаа хуудсаар авдаг. Тэр хуудас эхлээд ерөнхий дүгнэлт өгдөг: бүх үзүүлэлт хэвийн эсвэл хэд нь хэвийн бус. Дараа нь хэвийн бус үзүүлэлт бүрийг тусад нь жагсаана: үзүүлэлтийн нэр, таны үр дүн, хэвийн хэмжээ. Туршлагатай эмч хуудсыг дээрээс доош уншдаггүй. Эхлээд ерөнхий дүгнэлтийг хараад, дараа нь хэвийн бус үзүүлэлтүүдийг нэг нэгээр нь харьцуулж, тэдгээрийн хооронд холбоо хайдаг. Хэрвээ дөрвөн үзүүлэлт хэвийн бус байгаа ч бүгд нэг эрхтэнтэй холбоотой бол эмч дөрвөн өвчин биш, нэг шалтгааныг хайна.
pytest-ийн уналтын тайлан яг ийм хуудас. Сүүлийн мөр нь ерөнхий дүгнэлт. “Short test summary info” хэсэг нь хэвийн бус үзүүлэлтүүдийн жагсаалт. “FAILURES” хэсэг нь тус бүрийн дэлгэрэнгүй: юу хүлээгдэж байсан, юу гарсан. Энэ хичээлийн гол санаа нь туршлагатай эмчийн арга: доороос нь эхэлж уншиж, уналтуудын хооронд нийтлэг шалтгааныг хайх.
Алхам 1: Алдаа оруулах
VS Code-д pytest-dadlaga фолдероо нээж, venv идэвхтэй эсэхийг шалгаарай. Эхлээд бүх тест давж байгааг батлъя.
Command:
pytestГаралт (сүүлийн мөр):
============================= 13 passed in 0.02s ==============================Одоо хэн нэгэн, магадгүй хэдэн сарын дараах та, prices.py-г засаж байгаад андуурч НӨАТ-ын хувийг өөрчилсөн гэж төсөөлье. add_vat функцийг дараах байдлаар өөрчилж хадгална уу.
python
def add_vat(amount):
return amount + amount * 12 // 10010-ын оронд 12. Ийм жижиг өөрчлөлтийг кодыг хараад анзаарахад амархан биш. Энэ бол яг 7.1 дүгээр хичээлд ярьсан regression-ийн нөхцөл. Харуулууд маань үүнийг олох уу?
Алхам 2: Тайлан
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 13 items
test_prices.py F.F.F..F..... [100%]
================================== FAILURES ===================================
________________________________ test_add_vat _________________________________
def test_add_vat():
> assert add_vat(1000) == 1100
E assert 1120 == 1100
E + where 1120 = add_vat(1000)
test_prices.py:7: AssertionError
__________________________ test_add_vat_rounds_down ___________________________
def test_add_vat_rounds_down():
> assert add_vat(99) == 108
E assert 110 == 108
E + where 110 = add_vat(99)
test_prices.py:15: AssertionError
____________________________ test_prices_with_vat _____________________________
def test_prices_with_vat():
> assert prices_with_vat([1000, 2000]) == [1100, 2200]
E AssertionError: assert [1120, 2240] == [1100, 2200]
E
E At index 0 diff: 1120 != 1100
E Use -v to get more diff
test_prices.py:23: AssertionError
___________________________ test_vat_price_in_list ____________________________
def test_vat_price_in_list():
> assert 1100 in prices_with_vat([1000, 500])
E assert 1100 in [1120, 560]
E + where [1120, 560] = prices_with_vat([1000, 500])
test_prices.py:35: AssertionError
=========================== short test summary info ===========================
FAILED test_prices.py::test_add_vat - assert 1120 == 1100
FAILED test_prices.py::test_add_vat_rounds_down - assert 110 == 108
FAILED test_prices.py::test_prices_with_vat - assert [1120, 2240] == [1100, 2200]
FAILED test_prices.py::test_vat_price_in_list - assert 1100 in [1120, 560]
========================= 4 failed, 9 passed in 0.05s =========================Урт тайлан. Эмчийн аргаар доороос нь эхэлж уншъя. Хэрвээ та өмнөх хичээлүүдийн "туршаад үзээрэй" хэсэгт нэмэлт тест бичсэн бол таны тоо, мөрийн дугаар өөр байна, бүтэц нь ижил.
Алхам 3: Доороос эхлэх: ерөнхий дүгнэлт
Хамгийн сүүлийн мөр “4 failed, 9 passed in 0.05s” нь улаан бөгөөд “4 унасан, 9 давсан” гэсэн утгатай. Энэ нэг мөрөөс хоёр зүйл мэдэгдэж байна: асуудал бий, гэхдээ бүх зүйл эвдрээгүй. Есөн тест хэвийн ажиллаж байгаа нь асуудлын хүрээг хязгаарлах эхний сэжүүр.
Алхам 4: Хэвийн бус үзүүлэлтүүдийн жагсаалт
Дээш нь “short test summary info” буюу "тестийн товч хураангуй" хэсэг. Унасан тест бүр нэг мөрөнд: “FAILED”, тестийн бүтэн нэр "файл::функц" хэлбэрээр, зураасны араас хамгийн чухал мэдээлэл. Энэ дөрвөн мөрийг уншаад л эмчийн хийдэг зүйлийг хийе: нийтлэг шинж хайх.
test_add_vat: 1120 гарсан, 1100 хүлээгдэж байсан. test_add_vat_rounds_down: 110 гарсан, 108 хүлээгдэж байсан. test_prices_with_vat: [1120, 2240] гарсан, [1100, 2200] хүлээгдэж байсан. test_vat_price_in_list: жагсаалтад 1100 байх ёстой байсан, жагсаалт нь [1120, 560].
Дөрвөн уналт, гэхдээ тэдгээр нь бүгд нэг зүйлтэй холбоотой: add_vat. Эхний хоёр нь add_vat-ийг шууд дууддаг. Сүүлийн хоёр нь prices_with_vat-ийг дууддаг бөгөөд тэр нь дотроо add_vat-ийг дууддаг. Мөн бүх утга хүлээгдэж буйгаасаа их: 1120 нь 1100-аас 20-иор, 2240 нь 2200-аас 40-өөр. Нэмэгдэл нь үнийн 2 хувьтай тэнцэж байна. Хариу бараг тодорхой: татвар хэт их тооцоологдож байна, 10 хувийн оронд 12 хувь. Бид кодыг нээж ч амжаагүй ч хураангуйгаас шалтгааныг олчихлоо.
Энэ бол уналтын тайлан уншихын хамгийн чухал сургамж: олон тест нэгэн зэрэг унах нь олон алдаа гэсэн үг биш. Ихэнхдээ нэг өөрчлөлт олон тестийг уналгадаг. Тиймээс уналт бүрийг тус тусад нь засаж эхлэхээсээ өмнө тэдгээрийн хооронд нийтлэг шалтгаан хайгаарай.
Алхам 5: Нэг уналтын бүрэн задлал
Одоо FAILURES хэсгийн эхний блокийг мөр мөрөөр нь уншъя.
________________________________ test_add_vat _________________________________Доогуур зураасаар хүрээлэгдсэн гарчиг: аль тест унасныг заана.
def test_add_vat():
> assert add_vat(1000) == 1100Тестийн код, яг таны бичсэнээр. Хоёр дахь мөрийн эхэнд “>” тэмдэг байгааг анзаараарай. Энэ нь "алдаа яг энэ мөрөнд гарсан" гэсэн заагч. Нэг мөртэй тестэд энэ нь ойлгомжтой, харин олон мөртэй тестэд “>” аль мөр унасныг яг онож заадаг.
E assert 1120 == 1100“E” үсгээр эхэлсэн мөрүүд pytest-ийн тайлбар, E нь error буюу алдаа гэсэн утгатай. Энэ мөр бол pytest-ийн хамгийн ухаалаг онцлогуудын нэг. Таны assert-д “add_vat(1000) == 1100” гэж бичигдсэн байсан, гэтэл энд “1120 == 1100” гэж байна. pytest функцийн дуудлагыг түүний бодит үр дүнгээр сольж харуулж байна. Өөрөөр хэлбэл "та 1100 хүлээж байсан, гэтэл 1120 гарсан" гэдгийг шууд хэлж байна. Зүүн талд бодит утга, баруун талд таны хүлээлт: энэ дараалал таны assert-ийн бичсэн дарааллыг дагадаг.
E + where 1120 = add_vat(1000)“where” буюу "үүнд" мөр 1120 хаанаас ирсэнийг тайлбарлана: “1120 бол add_vat(1000)-ийн үр дүн”. Нэг assert-д хэд хэдэн функц дуудагдсан бол where мөр бүр нэгийг нь тайлбарлана. Энэ нь print() нэмж, тест дахин ажиллуулахгүйгээр бүх завсрын утгыг харах боломж олгодог.
test_prices.py:7: AssertionErrorБлокийн сүүлийн мөр: файлын нэр, мөрийн дугаар, алдааны төрөл. “test_prices.py:7” нь “test_prices.py файлын 7 дугаар мөр”. VS Code-ийн terminal-д энэ бичиг дээр Ctrl товч дарж байгаад хулганаар дарвал файл яг тэр мөр дээр нээгдэнэ. “AssertionError” нь assert-ийн нөхцөл худал болсны улмаас үүссэн алдаа гэсэн утгатай. Энэ нь чухал ялгаа бөгөөд удахгүй өөр төрлийн алдааг харна.
Хоёр дахь блок, test_add_vat_rounds_down, яг ижил бүтэцтэй: 108 хүлээж байсан, add_vat(99) 110 буцаасан. Энэ нь бидний таамаглалыг баталж байна: 99-ийн 12 хувь нь 11.88, доош тайрвал 11, нийлбэр 110.
Алхам 6: Жагсаалтын уналт
Гурав дахь блок бага зэрэг өөр харагдаж байна.
E AssertionError: assert [1120, 2240] == [1100, 2200]
E
E At index 0 diff: 1120 != 1100
E Use -v to get more diffЭхний мөр танил: бодит жагсаалт, хүлээгдэж буй жагсаалт. “AssertionError:” гэсэн угтвар нэмэгдсэн нь pytest доор нэмэлт тайлбар бичих гэж байгааг илтгэдэг, таны pytest-ийн хувилбараас хамаараад энэ угтвар байхгүй ч байж болно. Харин доорх мөрүүд шинэ. “At index 0 diff: 1120 != 1100” нь “0 дугаар байрлалд ялгаа бий: 1120 тэнцүү биш 1100” гэсэн утгатай. Урт жагсаалтуудыг харьцуулахад энэ мөр маш тустай: хоёр жагсаалт яг хаана зөрж эхэлснийг заадаг тул та зуун элементийг нүдээрээ харьцуулах шаардлагагүй. “Use -v to get more diff” нь "илүү дэлгэрэнгүй ялгааг харахын тулд -v ашигла" гэсэн зөвлөгөө. pytest -v ажиллуулбал pytest хоёр жагсаалтыг бүтнээр нь, элемент бүрийн ялгаатай нь харуулна.
Алхам 7: in-ийн уналт
Дөрөв дэх блок 7.3 дугаар хичээлийн membership шалгалтын уналт.
E assert 1100 in [1120, 560]
E + where [1120, 560] = prices_with_vat([1000, 500])“1100 нь [1120, 560] жагсаалтад байх ёстой байсан”. where мөр тэр жагсаалт prices_with_vat([1000, 500])-ээс гарсныг тайлбарлана. Энд ч мөн 1000-ийн татвартай үнэ 1120 болсон нь харагдаж байна. Дөрвөн блок, дөрвөн өөр төрлийн assert, нэг шалтгаан.
Алхам 8: Шийдвэр гаргах: код уу, тест үү?
Уналтыг уншиж шалтгааныг олсны дараа нэг чухал асуулт үлддэг: хэн буруутай вэ, код уу, тест үү? Тест бол хүлээлт, код бол бодит байдал. Тэдгээр зөрвөл аль аль нь буруу байж болно. Энэ асуултад хариулахын тулд хүлээлтээ гараар дахин бод. Монгол Улсын нэмэгдсэн өртгийн албан татвар 10 хувь. Мянгын 10 хувь 100, нийлбэр 1100. Тест зөв, код буруу.
Энэ алхмыг хэзээ ч алгасаж болохгүй. Хамгийн аюултай дадал бол тест унах бүрт хүлээгдэж буй утгыг кодын гаргасан утгаар солих явдал: “1100 гэж бичсэн байсан, 1120 гарч байна, 1120 болгоод тест ногоон боллоо”. Ингэвэл харуул алдааг барьсан ч та харуулыг алдаагаа хамгаалахаар сургаж байна. Тест бол таны кодын хүлээлтийн бичигдсэн гэрээ. Гэрээг өөрчлөхөөсөө өмнө түүнийг яагаад анх ингэж бичсэнээ бод.
Кодыг засъя. prices.py-д add_vat-ийг анхны хэлбэрт нь буцаана уу.
python
def add_vat(amount):
return amount + amount * 10 // 100Command:
pytestГаралт (сүүлийн мөрүүд):
test_prices.py ............. [100%]
============================= 13 passed in 0.02s ==============================Арван гурван цэг, бүгд ногоон. Харуулууд regression-ийг барьж, бид тайланг уншиж шалтгааныг олж, засаад, засвар ажилласныг баталлаа. Хоёр тэмдэгтийн өөрчлөлтийг дөрвөн харуул бараг тэр дороо илрүүлсэн.
Тест буруу байх үе
Одоо эсрэг нөхцөлийг харцгаая. test_prices.py-ийн төгсгөлд шинэ тест нэмнэ үү. Бид монгол хэв маягаар мянгатыг хоосон зайгаар тусгаарлах ёстой гэж бодоод тест бичлээ гэж бодъё.
python
def test_format_price_million():
assert format_price(1000000) == "1 000 000₮"Command:
pytestГаралт (уналтын блок ба хураангуй):
__________________________ test_format_price_million __________________________
def test_format_price_million():
> assert format_price(1000000) == "1 000 000₮"
E AssertionError: assert '1,000,000₮' == '1 000 000₮'
E
E - 1 000 000₮
E ? ^ ^
E + 1,000,000₮
E ? ^ ^
test_prices.py:56: AssertionError
=========================== short test summary info ===========================
FAILED test_prices.py::test_format_price_million - AssertionError: assert '1,000,000₮' == '1 000 000₮'
========================= 1 failed, 13 passed in 0.04s ========================Текстийн уналт өөр хэлбэрийн тайлбартай. Эхний E мөр танил: функц “1,000,000₮” буцаасан, бид “1 000 000₮” хүлээсэн. Текстүүдийг хашилтанд харуулж байгаа нь зай, хоосон тэмдэгт гэх мэт нүдэнд харагдахгүй ялгааг ч анзаарахад тусална.
Доорх мөрүүд бол хоёр текстийн мөр бүрийн ялгаа. “-” тэмдэгтэй мөр нь таны хүлээсэн утга, “+” тэмдэгтэй мөр нь бодит утга. “?” тэмдэгтэй мөрүүд нь дээрх мөрийн доор “^” тэмдгээр яг ялгаатай тэмдэгтүүдийг заадаг. Энд “^” тэмдгүүд зай болон таслалын байрлалыг заажээ: ялгаа зөвхөн тусгаарлагчид. Хэрвээ “-” ба “+”-ийн аль нь аль вэ гэдэгт эргэлзвэл эхний “assert ‘1,000,000₮’ == ‘1 000 000₮’” мөр рүү буцаж хараарай: тэнд зүүн талд бодит, баруун талд хүлээгдэж буй утга үргэлж тодорхой.
Одоо шийдвэр гаргах асуулт: код уу, тест үү? Энэ удаад хариу өөр. format_price-ийг бид 6.3 дугаар хичээлийн format_amount-тай ижил, таслалтай байхаар зориуд бичсэн бөгөөд зарлагын бүртгэлийн README ч таслалтай гаралтыг харуулдаг. Тест бичихдээ бид функцийн жинхэнэ гэрээг буруу санасан. Энэ тохиолдолд тест буруу. Хүлээгдэж буй утгыг засна уу.
python
def test_format_price_million():
assert format_price(1000000) == "1,000,000₮"Энэ бол Алхам 8-ын дүрмийн нөгөө тал: тестийг өөрчлөх нь зөвхөн та гэрээг дахин бодоод, тест өөрөө буруу байсан гэдэгт итгэлтэй болсон үед л зөв. Энэ удаад бид "функц юу хийх ёстой вэ" гэсэн асуултад хариулж байж тестийг засварласан, "тест ногоон болтугай" гэж биш. pytest ажиллуулахад 14 тест бүгд давна.
Код огт унах үе
Гурав дахь төрлийн нөхцөл бий: assert-ийн нөхцөл худал болсон биш, код өөрөө алдаа гаргаж унасан үе. Тестийн төгсгөлд нэмнэ үү.
python
def test_format_price_text():
assert format_price("500") == "500₮"Энд бид format_price-д тоо биш, текст өгсөн. Ажиллуулъя.
Command:
pytestГаралт (уналтын блок):
___________________________ test_format_price_text ____________________________
def test_format_price_text():
> assert format_price("500") == "500₮"
test_prices.py:60:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
amount = '500'
def format_price(amount):
> return f"{amount:,}₮"
E ValueError: Cannot specify ',' with 's'.
prices.py:6: ValueErrorЭнэ блок өмнөхүүдээс илүү урт бөгөөд хоёр хэсэгтэй. Эхний хэсэг тестийн код, “>” тэмдэг assert мөрийг заасан, доор нь “test_prices.py:60:” гэсэн байршил. Харин тэр мөрийн ард “AssertionError” биш, юу ч байхгүй. Дараа нь “_ _ _ _” тасархай шугам гарч ирсэн: энэ нь "алдаа энд биш, цаашаа гүнд гарсан, дараагийн шатыг харуул" гэсэн утгатай.
Хоёр дахь хэсэг prices.py дотор. “amount = ‘500’” мөр онцгой тустай: pytest функц дуудагдах үед түүний параметрүүдэд ямар утга ирснийг харуулж байна. amount нь тоо биш, ‘500’ гэсэн текст байжээ. Доор нь format_price-ийн код, “>” тэмдэг return мөрийг заасан. “E ValueError: Cannot specify ‘,’ with ‘s’.” нь “‘,’ тэмдгийг ‘s’-тэй хамт заах боломжгүй” гэсэн утгатай, Python текстэд мянгатын таслал тавих боломжгүй гэж хэлж байна, учир нь “s” нь текстийн формат. Блокийн сүүлийн мөр “prices.py:6: ValueError”: алдаа prices.py-ийн 6 дугаар мөрөнд, ValueError төрлийнх.
Энэ бол 6.1 дүгээр хичээлд уншсан Python-ий traceback-тэй ижил санаа, pytest-ийн хэлбэрээр: дээрээс доош, тестээс эхэлж, алдаа гарсан газар хүртэлх замыг харуулна. Хамгийн чухал ялгаа нь сүүлийн мөрийн алдааны төрөл. AssertionError бол "код ажилласан, гэхдээ үр дүн буруу". Бусад ямар ч алдаа, ValueError, TypeError, KeyError, ZeroDivisionError, бол "код огт дуусаж чадаагүй". Энэ хоёр өөр төрлийн асуудал: эхнийх нь логикийн алдаа, хоёр дахь нь кодыг дуудаж буй арга эсвэл кодын хил дээрх тохиолдол.
Энэ тохиолдолд код уу, тест үү? format_price тоо хүлээдэг бөгөөд текст өгөх нь түүнийг буруу ашиглах явдал. Тиймээс энэ тест буруу асуулт асуусан. Харин "буруу оролт өгөхөд функц тодорхой алдаа гаргах ёстой" гэдгийг шалгах нь өөрөө үнэ цэнтэй тест бөгөөд үүнийг 8.4 дүгээр хичээлд pytest.raises-ээр зөв бичиж сурна. Одоохондоо энэ тестийг устгана уу.
Хоёр тустай тохиргоо: -x ба --lf
Олон тест унах үед бүх тайланг нэг дор унших нь дарамттай байж болно. pytest-ийн хоёр тохиргоо энэ ажлыг хөнгөвчилнө.
pytest -x нь эхний уналтын дараа зогсоно. “-x” нь exit first буюу "эхнийх дээр гар" гэсэн утгатай. Тайлан ганц уналтын блоктой, богино болно, сүүлийн мөрийн өмнө дараах мөр нэмэгдэнэ.
!!!!!!!!!!!!!!!!!!!!!!!!!! stopping after 1 failures !!!!!!!!!!!!!!!!!!!!!!!!!!!“1 уналтын дараа зогслоо” гэсэн утгатай. Олон тест нэг шалтгаанаар унаж байгаа үед эхнийх нь ихэвчлэн хангалттай сэжүүр өгдөг.
pytest --lf нь зөвхөн өмнөх удаа унасан тестүүдийг дахин ажиллуулна. “--lf” нь last failed буюу "сүүлд унасан" гэсэн утгатай. 7.2 дугаар хичээлд .pytest_cache фолдерын тухай ярьсныг санаарай: pytest аль тест унасныг яг тэнд тэмдэглэдэг. Засвар хийсний дараа эхлээд --lf-ээр унасан тестүүдээ хурдан шалгаж, дараа нь ердийн pytest-ээр бүгдийг ажиллуулж бусад нь эвдрээгүй эсэхийг батлах нь сайн дараалал.
Хүсвэл prices.py-д өөр өөр төрлийн алдаа зориуд оруулж, тайлан бүрийг уншиж үзээрэй. Жишээ нь format_price-ийн “₮” тэмдгийг устгах, prices_with_vat-ийн жагсаалтын comprehension-д add_vat-ийн оронд утгыг өөрчлөлгүй буцаах, эсвэл is_free-ийн “==” тэмдгийг “!=” болгох. Тайлан бүрийн өмнө аль тестүүд унах ёстойг урьдчилан таамаглаад, дараа нь pytest ажиллуулж таамаглалаа шалгаарай. Тайланг доороос нь уншиж, хураангуйгаас шалтгааныг олж, кодыг нээхээсээ өмнө юу эвдэрснийг хэлж чадаж байна уу гэж өөрийгөө шалгаарай. Дууссаны дараа бүх алдааг засаж, 14 тест ногоон болсон эсэхийг баталгаажуулаарай.
Тестийг кодонд тааруулж засах. Энэ бол энэ хичээлийн хамгийн чухал анхааруулга тул дахин хэлье. Тест унах үед хүлээгдэж буй утгыг кодын гаргасан утгаар солих нь хамгийн хялбар бөгөөд хамгийн аюултай үйлдэл. Тест солихоосоо өмнө хүлээлтээ гараар дахин бод. Хэрвээ тест зөв байсан бол кодыг засна. Хэрвээ тест буруу байсан, өөрөөр хэлбэл функцийн гэрээг буруу санаж бичсэн бол, тестийг засна. Энэ шийдвэрийг үргэлж ухамсартайгаар гарга.
Тайланг зөвхөн дээрээс нь унших. Урт тайлангийн эхний блокийг уншаад засвар хийж эхлэх нь түгээмэл. Гэтэл бусад уналтууд тань ижил шалтгаантай эсвэл огт өөр шалтгаантай байж болно. Эмчийн аргыг санаарай: доороос эхэлж, сүүлийн мөрөөс хэдэн тест унасныг, хураангуйгаас аль тестүүд, юу гэж унасныг хар, нийтлэг шинж хай. Дараа нь л дэлгэрэнгүй блокууд руу ор.
Бодит ба хүлээгдэж буй утгыг андуурах. “assert 1120 == 1100” мөрөнд аль нь бодит вэ? pytest таны assert-ийн бичсэн дарааллыг дагадаг: хэрвээ та assert add_vat(1000) == 1100 гэж бичсэн бол зүүн тал бодит, баруун тал хүлээлт. Хэрвээ та assert 1100 == add_vat(1000) гэж эсрэгээр бичсэн бол дараалал ч эсрэгээрээ. Тиймээс нэг дадлыг баримтал: assert-д эхлээд бодит үр дүн, дараа нь хүлээгдэж буй утга. Энэ сургалтын бүх жишээ энэ дарааллыг баримталдаг. Мөн “where” мөр бодит утга аль функцээс ирсэнийг үргэлж тодорхой хэлдэг.
Кирилл үсэг тайланд хачин харагдах. Хэрвээ pytest-ийн гаралтад кирилл текст эсвэл “₮” тэмдэг утгагүй тэмдэгт болон харагдвал terminal-ийн кодчилол UTF-8 биш байна. VS Code-ийн terminal ихэвчлэн зөв харуулдаг ч хуучин PowerShell цонхонд асуудал гарч болно. Ийм тохиолдолд VS Code-ийн terminal ашиглах нь хамгийн энгийн шийдэл. Энэ нь зөвхөн харагдах асуудал бөгөөд тестийн үр дүнд нөлөөлөхгүй.
AssertionError ба бусад алдааг андуурах. Хэрвээ уналтын блокийн сүүлийн мөр “AssertionError” биш, жишээ нь “TypeError”, “KeyError” гэж төгссөн бол таны assert ажиллаж ч амжаагүй, код түүнээс өмнө унасан. Ийм үед хүлээгдэж буй утгыг шалгах нь утгагүй, харин тасархай шугамын доорх хэсгийг, параметрүүдийн утга болон “>” тэмдгийн заасан мөрийг уншиж, код яагаад унасныг ол.
pytest-ийн уналтын тайланг эмчийн шинжилгээний хариу шиг доороос нь уншина: сүүлийн мөр хэдэн тест унасныг, “short test summary info” хэсэг аль тестүүд юу гэж унасныг харуулдаг, тэнд нийтлэг шинж хайна, учир нь олон уналт ихэвчлэн нэг шалтгаантай. FAILURES хэсгийн блок бүр гарчиг, “>” тэмдгээр заасан унасан мөр, “E” мөрүүд (pytest функцийн дуудлагыг бодит утгаар сольж харуулдаг), “where” мөр (завсрын утга хаанаас ирсэн), эцэст нь "файл:мөр: алдааны төрөл"-өөс бүрдэнэ. Жагсаалтын уналт ялгаатай анхны байрлалыг, текстийн уналт “-” хүлээгдэж буй, “+” бодит мөрүүдийг “?” ба “^” тэмдгээр ялгаатай газрыг нь заан харуулна. AssertionError бол үр дүн буруу, бусад алдаа бол код дуусаагүй гэсэн утгатай бөгөөд тасархай шугамын доор параметрүүдийн утга харагдана. Уналт бүрийн дараа "код уу, тест үү?" гэж асууж, хүлээлтээ гараар дахин бодно, тестийг кодонд тааруулж хэзээ ч бүү засаарай. pytest -x эхний уналт дээр зогсдог, pytest --lf зөвхөн сүүлд унасан тестүүдийг дахин ажиллуулдаг.
Ингээд Бүлэг 7 дууслаа. Та pytest-ийг суулгаж, тест бичиж, assert-ийн бүх хэлбэрийг ашиглаж, уналтыг уншиж чаддаг боллоо. Дараагийн Бүлэгт тестүүдээ мэргэжлийн хэмжээнд зохион байгуулна. Бүлэг 8-ын эхний хичээлд тестүүдийг tests фолдерт байрлуулж, модуль бүрт тусдаа тестийн файл үүсгэж, нэг файл эсвэл нэг тестийг тусад нь ажиллуулж сурна.
Бүртгэлтэй болсноор энэ сургалтын бүх хичээлд хандах эрх авна.