Sinov paytida istisnolardan foydalanmang

Python misollari bilan test kodida Try Catch bloklaridan foydalanishdan saqlaning

Istisnolar

Istisnolar ish vaqtida yuzaga keladigan xatolardir.

Menimcha, dasturda istisnolarni hal qilishning ikkita asosiy sababi bor.

  1. Dasturning ishdan chiqishiga yo'l qo'ymaslik uchun.
  2. Xato natijasida qandaydir chora ko'rish.

Certa rashingbu kitobda muhokama qilingan qonuniy ishonchlilik strategiyasidirPragmatik dasturchiDevid Tomas va Endryu Hunt.

Ammo barcha xatolar halokatli bo'lishi shart emas.

Sinov

Dasturiy ta'minotni sinovdan o'tkazayotganda siz dasturiy ta'minotni ishlatish (ishlash) va uning bir qator kutishlar (talablar) bilan ishlashini tekshirishni maqsad qilgansiz. Ko'p texnika va usullar va har xil turdagi testlar mavjud. Lekin bu gapning mazmuni.

Avtomatlashtirilgan birlik yoki funktsional testlarni bajarayotganda, siz boshqa dasturni tekshirish uchun texnik dastur yozasiz. Shu sababli, siz o'zingizning testingiz ishonchli bo'lishi uchun test dasturingiz sinov paytida ishlamay qolmasligiga ishonch hosil qilishingiz va shuning uchun xatolarni boshqarish kodini qo'shishingiz kerak deb o'ylashingiz mumkin.

Biroq, sinovdan o'tuvchi dastur allaqachon o'rnatilgan istisnolar bilan ishlashga ega ekanligini tushunish juda muhim! Ya'ni, agar test usuli qo'lga olinmagan istisnoni tashlasa, butun dastur buzilmaydi. Usul shunchaki muvaffaqiyatsiz sinov deb hisoblanadi. Boshqa barcha usullar hali ham ishlaydi va natijalarini hisobot qiladi.

Umuman olganda, siz sinov paytida istisnolar bilan shug'ullanishingiz kerak bo'lgan yagona vaqt - bu xato stsenariylarini maxsus sinovdan o'tkazayotgan joyingiz va dasturingiz kutilgan tarzda javob berishini ikki marta tekshirishni xohlaysiz.

Misollar

Misollar Python unittest-dan foydalanadi, ammo bu umumiy maslahat.

Men 2 ta kirish argumentini bo'lish natijasini qaytaradigan funktsiyani belgilaydigan modul yarataman.

Bu juda oddiy misol, lekin siz tasavvur qilishingiz kerakki, bu juda murakkab dastur bo'lib, siz birliklarni sinovdan o'tkazayotgan yoki avtomatlashtirilgan funktsional testlarni yozasiz.

Yomon misol

FAIL: test_divide_unexpected_fail (__main__.TestDivide)
We know this will throw a Runtime Error. But imagine we didn't.
----------------------------------------------------------------------
Traceback (most recent call last):
  File "test_divide_bad.py", line 24, in test_divide_unexpected_fail
    self.assertEqual(divide.divide(10, 0), 3)
ZeroDivisionError: division by zero
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
  File "test_divide_bad.py", line 26, in test_divide_unexpected_fail
    assert False
AssertionError
----------------------------------------------------------------------
Ran 4 tests in 0.001s
FAILED (failures=1)

Sinov kodi batafsil va keyingi misolda ko'rib turganingizdek, qo'shimcha qiymat olinmaydi. Bunday holda, biz disk raskadrovka maqsadlarida xato izini ko'rishimiz mumkin, ammo men yovvoyi tabiatda xatolarni qayta ishlash haqiqiy xatoni yashirganini ko'rdim.

Yaxshi namuna

ERROR: test_divide_unexpected_fail (__main__.TestDivide)
We know this will throw a Runtime Error. But imagine we didn't.
----------------------------------------------------------------------
Traceback (most recent call last):
  File "test_divide_good.py", line 17, in test_divide_unexpected_fail
    self.assertEqual(divide.divide(10, 0), 3)
  File "a/b/c/divide.py", line 2, in divide
    return a/b
ZeroDivisionError: division by zero
----------------------------------------------------------------------
Ran 4 tests in 0.001s
FAILED (errors=1)

Agar test istisnoga sabab bo'lsa, u xato bilan muvaffaqiyatsiz bo'ladi. Bu ancha toza va usul bilan bog'langan xato izi chiqishi qaysi muammo yuzaga kelganligini aniq ko'rsatadi.

Nihoyat

Ehtimol, testlarda o'rnatilgan xatolarni qayta ishlash mavjudligini tushunishning eng yaxshi yo'li, muvaffaqiyatsiz tasdiq istisnoga olib kelishini tushunishdir! Assertion Error.

Shunday qilib, quyidagi test o'tadi:

Umid qilamanki, siz buni o'qib, biror narsa o'rgandingiz va biron bir joyda bir yoki ikkita testni tozalashingiz mumkin.