Программаны тестілеу
Программаң іске қосылды, ЕШҚАНДАЙ қате хабарламасы жоқ, «Process finished with exit code 0» деп жазды. ТАМАША, солай ма? ЖОҚ! Бір мысал көрсетейік: while (i == n): деп жазсаң, программа ЕШТЕҢЕ ІСТЕМЕЙ, «сәтті» аяқталады — БІРАҚ нәтиже МҮЛДЕМ ҚАТЕ. Қате хабарламасының ЖОҚТЫҒЫ — программаның ДҰРЫС екенін БІЛДІРМЕЙДІ! Бұл — V бөлімнің СОҢҒЫ, ЕҢ МАҢЫЗДЫ кезеңі: программаны тестілеу.
Дәрігер жаңа дәрі шығарғанда, оны БІР адамға ғана емес, МЫҢДАҒАН адамға сынайды. Программа да солай: БІР рет іске қосып, «жұмыс істеді» деп мәлімдеу ЖЕТКІЛІКСІЗ.
Программаны тестілеу — программада анықталған қателерді табу мақсатында, арнайы дайындалған деректер жиынтығымен (ТЕСТ) программаны орындау процесі.
Тестілеудің үш кезеңі бар — ӘРБІРІН МІНДЕТТІ ТҮРДЕ өткізу керек: 1) Қалыпты жағдай — программаның ӘДЕТТЕГІ, «күнделікті» жұмыс жағдайын тексереді. 2) Экстремалды жағдай — айнымалының ШЕКТІ мәндерін тексереді: ЕҢ КІШІ мүмкін мән, ЕҢ ҮЛКЕН мүмкін мән. 3) Ерекше жағдай — рұқсат етілген АРАЛЫҚТАН ТЫС мәндерді тексереді.
n = 6 f = 1 i = 1 while (i <= n): f = f * i print('i=', i, 'f=', f) i = i + 1
| Кезең | Тестілік мән | Нәтиже |
|---|---|---|
| Қалыпты (i≤n) | i=2 | f=1×2=2 |
| Экстремалды (i=n) | i=6 | f=720 |
| Ерекше (i>n) | i=7 | Цикл тоқтайды, f=720 (өзгермейді) |
Қорытынды: программа шекарада (i=n) ДЕ, шекарадан тыс (i=7) та ДҰРЫС тоқтайды — тест ӨТТІ.
Ал енді МАҢЫЗДЫ мысалды толық қарайық:
n = 6 f = 1 i = 1 while (i == n): f = f * i i = i + 1 print('f=', f)
Мұқият қара: while ШАРТЫНДА «==» (ТЕҢ) тұр, «<=» (КІШІ НЕМЕСЕ ТЕҢ) емес! i БАСТАПҚЫ мәні — 1, n — 6. Бірінші тексеруде: 1==6 → ЖАЛҒАН. Демек, ЦИКЛ ДЕНЕСІ БІРДЕ ДЕ ОРЫНДАЛМАЙДЫ! Программа ЕШҚАНДАЙ қате хабарламасын шығармайды, БІРАҚ f МӘНІ 1 БОЛЫП ҚАЛАДЫ (720 болу керек еді)!
Циклдік алгоритмдерде ЖИІ кездесетін, БІРАҚ интерпретатор көрмейтін қателер: цикл параметрінің бастапқы мәнін дұрыс көрсетпеу; циклдің аяқталу шартын дұрыс жазбау (== орнына <=); циклдің қайталану санын дұрыс есептемеу; шексіз цикл.
| Қате түрі | Кім табады | Қашан |
|---|---|---|
| Синтаксистік | Python интерпретаторы | Дереу (код жазылған кезде) |
| Орындалу уақыты (терістеу) | Python интерпретаторы | Программа сол жолға жеткенде |
| Алгоритмдік (логикалық) | ТЕК СЕН, тестілеу арқылы | Тек мұқият тестілегенде |
Есіңе түсірейік — Python-дағы негізгі терістеу (exception) түрлері: NameError, ValueError, TypeError, ZeroDivisionError. Бұлар — Python АНЫҚТАЙДЫ ЖӘНЕ ХАБАРЛАЙДЫ. Ал ЛОГИКАЛЫҚ қате — Python ешқашан ХАБАРЛАМАЙДЫ, тек СЕНІҢ ТЕСТІЛЕУІҢ табады.
Толық тест жоспарын қалай құрамыз? Мысал: a, b екі бүтін сан, a<b болса — өсу ретімен, әйтпесе кему ретімен шығару.
a = int(input()) b = int(input()) if a < b: for i in range(a, b+1): print(i) else: for i in range(a, b-1, -1): print(i)
Есепте ҮШ жағдай бар: a<b, a>b, ЖӘНЕ ЕСКЕРІЛУІ КЕРЕК ТӨРТІНШІ — a=b (шекті жағдай!). Егер a=b болса, кодтың if a<b тармағы ЖАЛҒАН болады, демек else тармағы іске қосылады — БҰНЫ ТЕСТІЛЕУДЕ ТЕКСЕРУ керек: тек БІР ғана сан шығуы керек пе, тексерейік.
Тест жоспары: (1) a<b — қалыпты; (2) a>b — қалыпты (қарама-қарсы бағыт); (3) a=b — ЭКСТРЕМАЛДЫ (шекті жағдай, назардан тыс қалуы оңай!). Мысалы, a=b=7 болса → тек «7» шығады.
Тест жоспарын құрғанда есептің БАРЛЫҚ «тармақтарын» (if/else, шектерін) қарап шық — КОДТЫҢ ӘРБІР ЖОЛЫ КЕМ ДЕГЕНДЕ БІР РЕТ ІСКЕ ҚОСЫЛАТЫНДАЙ тест таңда.
- Программаны ҚАЛЫПТЫ, ЭКСТРЕМАЛДЫ және ЕРЕКШЕ жағдайлармен тексеру керек.
- Қате хабарламасының болмауы программаның ДҰРЫС екенін дәлелдемейді.
- Алгоритмдік (логикалық) қателерді ТЕК МҰҚИЯТ ТЕСТІЛЕУ таба алады.
- == мен <= сияқты салыстыру операторларын шатастыру — ЕҢ ЖИІ, БІРАҚ ЕҢ КӨРІНБЕЙТІН қате.
- Осымен V бөлім — есептің қойылуынан бастап тестілеуге дейінгі толық цикл — аяқталды.