Табыстар:
- Қабылдау ережесіне тәуелсіз бірлік сынақтарында күтілетін мәнді есептеу арқылы жасанды интеллект қате мінез-құлықты «дұрыс» деп қабылдауына жол бермеу мүмкіндігі
- AAA және FIRST принциптерін қолдану және сыртқы тәуелділіктерді келемеждеу арқылы жылдам, тәуелсіз және қайталанатын сынақтарды басып шығару мүмкіндігі
- Мутациямен сынақтарды сынау (кодты бұзу) және сынақтан өту қиын кодты дизайн иісі ретінде тану мүмкіндігі
Тестілеу пирамидасының ең үлкен және ең жылдам қабаты бірлік тестілеу болып табылады — функцияны немесе кодтың кішкене бөлігін басқа нәрселерден оқшаулап тексеретін тестілеу. Мыңдаған бірлік сынақтары секундтарда орындалады және код әлі әзірлеушінің экранында болған кезде қатені ұстайды. Жасанды интеллект (AI) бірлік сынақтарын жасауда ең шебер болуы мүмкін: сіз оған функция бересіз, AI ондаған сынақтарды шығарады. Бірақ дәл осы ыңғайлылық ең үлкен тұзаққа әкеледі: AI «жасыл болып жанып тұратын, бірақ ештеңені тексермейтін» сынақтарды оңай шығарады немесе кодтың ағымдағы (мүмкін қате) әрекетін «дұрыс» деп қабылдайды. Бұл бөлімде сіз AI көмегімен шынымен қорғаныс блогының сынақтарын жазуды және сыналатын код пен AI арасындағы қатынасты үйренесіз.
Жақсы бірлік тестінің қасиеттері: БІРІНШІ
Жақсы бірлік сынақтары БІРІНШІ принциптерді ұстанады: Жылдам, Тәуелсіз (тесттер бір-біріне тәуелді болмауы керек), Қайталанатын (қайталанатын — кез келген ортада бірдей нәтиже), Өзін-өзі тексеру (айқын өту/сәтсіздік), Уақтылы (уақытында). Жасанды интеллект сынақтарын жасаған кезде осы принциптерді еске түсіріңіз; тесттің сыртқы әлемге (нақты дерекқор, желі, сағат) тәуелді емес, «тәуелсіз» және «қайталанатын» болуын сұраңыз.
AAA үлгісі және экспрессивті бекіту
Қатты бірлік сынағы AAA құрылымына сәйкес келеді: Орналасу (дайындау — енгізулер мен тәуелділіктерді орнату), Әрекет ету (орындау — тексерілетін функцияны шақыру), Бекіту (тексеру — нәтижені күтілетін мәнмен салыстыру). Ең маңыздысы - бекіту. AI ең көп тараған қатесі сынақтан өтіп жатқан кодтың шығысынан бекітуді шығару болып табылады — «код нені қайтарса да ақиқат» логикасы. Бұл сынақты мағынасыз етеді. Дұрыс жол - күтілетін мәнді дербес анықтау (қабылдау критерийлерінен оны қолмен есептеңіз).
Назар аударыңыз: AI-ға «осы функция үшін сынақ жазыңыз» десеңіз, AI функцияны іске қосып, оның нәтижесін «күтілген» деп жаза алады. Бұл сынақ функция жалған болса да өтеді. Оның орнына «күтілетін нәтижелерді осы ережелерге сәйкес есептейсіз, функцияның ағымдағы шығысына сілтеме жасамаңыз» деңіз.
Мазақтар, тырнақтар және тәуелділіктер
Бірлікті сынау оқшаулауды қажет етеді. Функцияңыз дерекқорға немесе API-ге тәуелді болса, тестілеу кезінде олар жалған нысандармен ауыстырылады (жалғау/stub — нақты тәуелділіктің басқарылатын, жалған алмастырғышы). Бұл сынақты жылдам, тәуелсіз және қайталанатын етеді. AI жалған орнатуды жасай алады; Бірақ шамадан тыс келекелеуден сақ болыңыз: егер сіз бәрін мазақ етсеңіз, сынақ нақты логиканы емес, тек «мазақ нені қайтаратынын» тексереді. Баланс: сыртқы әлемге еліктеңіз, сыналған нақты логиканы орындаңыз.
Тестілеу және AI
Қызықты кері байланыс бар: сынау қиын код көбінесе нашар жобаланған код болып табылады. Егер AI функцияға сынақ жазуда қиындықтар туындаса (тым көп тәуелділіктер, жасырын жаһандық күй, жанама әсерлер), бұл дизайн иісі. AI-дан «оны тексеруге болатын ету үшін осы кодты қалай қайта өңдейсіз» деп сұрау жақсы тестілеуге де, жақсырақ кодқа да әкеледі.
Параметрленген сынақтар және деректердің әртүрлілігі
Бір ережені әртүрлі енгізулермен тексеру үшін әр жолы бөлек сынақ жазу әрі жалықтырады, әрі қолдау қиын. Параметрленген тестілеу — кірістер мен күтілетін нәтижелер тізімінде бір сынақ логикасын қайталап орындайтын құрылым — бұл қайталауды болдырмайды: бір сынақ корпусы ондаған кіріс жұптарымен қоректенеді. Қабылдау ережелерін берген кезде AI осы кіріспен күтілетін нәтиже кестелерін жасауда өте тиімді; Атап айтқанда, ол жүйелі түрде шекті мәндер мен эквиваленттік сыныптарды кестелейді.
Бірақ мұнда да тұзақ бар: AI сыналатын кодтан жасалған кестеде күтілетін нәтижелерді алуға бейім. Бұл қате параметрленген тестілеуде одан да қауіпті, өйткені бір қате логика ондаған жолдарды жарамсыз етеді. Сондықтан күтілетін нәтиже бағанын әрқашан қабылдау ережесіне сәйкес тәуелсіз есептеңіз және кем дегенде бірнеше жолды қолмен растаңыз. Сондай-ақ «әр жол нені білдіреді» сипаттама бағанын сұраңыз; сондықтан жол үзілген кезде сіз қай күйдің бұзылғанын бірден көресіз.
Кеңес: Параметрленген сынақ кестесіне әдейі «тұзақ жолын» қосыңыз, яғни нәтижені біле тұра қате теріңіз. Егер сіз сынақты орындаған кезде бұл сызық қызыл түске айналмаса, сіздің тестіңіз бұл жағдайды растамайды. Бұл жылдам жалған тексеру.
Әлсіз шақыру / Күшті шақыру
Әлсіз: "Осы функция үшін бірлік сынамасын жазыңыз."
Күшті: "taxCalculate(сома, мөлшерлеме) функциясына арналған [language/framework] бірлік сынақтарын жазыңыз. Қабылдау ережесі: нәтиже = сома * мөлшерлеме, 2 ондыққа дөңгелектенеді; теріс сома немесе мөлшерлеме қате жібереді; егер мөлшерлеме 0 болса, 0 қайтарады. AAA құрылымын пайдаланыңыз. ОСЫ ережелерге сәйкес күтілетін мәндерді қолмен есептеңіз; ОСЫ ережелерге сәйкес күтілетін мәндерді қолмен есептеңіз Cover0, теріс жағдайларға сілтеме жасамаңыз. ондық сандарға дейін дөңгелектеу).
Күшті жеделдік; Ол қабылдау ережесін, тәуелсіз күтілетін мәнді күтуді, құрылымды және шеткі жағдайларды береді. Осылайша, сынақ кодтың айнасы емес, ереженің қамқоршысы болады.
Бірлік сынағы сапасының кестесі
симптом
Нашар сынақ (жалған сенім)
жақсы сынақ
бекіту
Жоқ немесе «нөл емес»
Күтілетін нақты мән
Күтілетін мән көзі
Функцияның шығысы
Қабылдау ережесі / қолмен есептеу
тәуелділік
Нақты ДҚ/желі/сағат
Жалған/тұжырыммен оқшауланған
шеткі корпус
Тек бақытты жол
шек, теріс, қате
Сіз кодты бұзған кезде
жасыл болып қалады
қызылға айналады
Аты
тест1, сынақ әдісі
бекітетін ережені сипаттайды
Көшірілетін төрт үлгі
1) Ережеге негізделген бірлік сынағы:
Сіздің рөліңіз: бағдарламалық қамтамасыз етуді сынақтан өткізу жөніндегі аға инженер. [Тіл/рамка] арқылы келесі функция бойынша бірлік сынамасын жазыңыз: [қолтаңба].Қабылдау ережелері: [ережелер].- AAA құрылымын пайдаланыңыз.- ОСЫ ережелерге сәйкес күтілетін мәндерді қолмен есептеңіз; Функцияның ағымдағы шығысына сілтеме жасамаңыз. - Жеке сынақтармен шектеуді, теріс, қатені және бақытты жолды жабыңыз. - Әрбір сынақ атауы тексеретін ережені сипаттасын. - сыртқы тәуелділіктерді мысқылдау; Нақты логиканы орындаңыз.
2) Мутацияға төзімділікті басқару:
Осы бірлік сынақтарын тексеріңіз. Сынақтағы кодқа жасауға болатын 5 кішігірім түзетулерді тізімдеңіз (+ орнына a -, > орнына >=, шекараны ауыстыру) және әрқайсысы үшін осы сынақтардың ҚАЙСЫСЫ қызылға айналатынын айтыңыз? Ешқайсысы қайтарылмаса, сынақ жеткіліксіз. Код + сынақтар: [қою]
3) Сынақ қабілеттілігін тексеру:
Бұл функция үшін бірлік сынамасын жазу неге қиын? Жасырын тәуелділік, жаһандық статус, жанама әсерлер, көптеген жауапкершіліктер бар ма? Оны сынауға болатын ету үшін ең аз рефакторингті ұсыныңыз; мінез-құлқын өзгертпеңіз. Код: [қою]
4) Аяқталмаған сценарий:
Келесі функция және қолжетімді сынақтар берілген. Қандай мінез-құлық/жиек ЕШҚАШАН сыналмағанын тізімдеңіз (ауқым аралығы) және әрқайсысына сынақ қосыңыз. Функция+тесттер: [қою]
үш шағын іс
1-жағдай — Кодты көшіруді сынау. Әзірлеуші AI дөңгелектеу функциясына тест жазуды тапсырды; 10 сынақ жасыл түсті. Шын мәнінде, функция дұрыс емес бағытта дөңгелектенді, бірақ AI функцияның шығысынан күтілетін мәндерді алды, сондықтан сынақтар қатені «шын» деп санады. Күтілетін мәндер «ережеге негізделген» шаблонмен қолмен есептелгенде, 4 сынақ қызылға айналды және нақты қате анықталды.
2-жағдай — Мутацияны басқарудың мәні. Бір команда 45 бірлік сынақтарына сүйенді. «Мутацияның беріктігін тексеру» арқылы кодқа 20 шағын түзетулер енгізілді; Сынақтар олардың тек 11-ін ғана ұстады. Қалған 9 үзіліс үнсіз өтті. Команда әлсіз сынақтарды күшейтті; Келесі шығарылымда осы жетілдірілген сынақтар нақты есептеу қатесін тапты.
3-жағдай — Тексерілмеуі – дизайн иісі. AI тапсырыс беру функциясына тест жаза алмады, оған үнемі нақты дерекқор қажет болды. «Тестілеуді тексеру» үлгісі функцияның дерекқорға кіру мүмкіндігін енгізетінін көрсетті. Тәуелділік инъекциясы жойылғанда, сынақтар жазылуы мүмкін және код таза болды.
Жалпы қателер
- Кодтан күтілетін мәнді шығару. AI функция шығысын «дұрыс» деп қабылдайды; қате кодты растайтын сынақ.
- Бекітусіз немесе тривиальды бекітумен сынау. «Қате жібермеді, өтті» логикасы; Бұл ештеңені растамайды.
- Төтенше мазақ. Барлығын мазақ ету және мазақ қайтарғанды ғана сынау; нақты логика тексерілмейді.
- Тек бақытты жол. Шекті айналып өту, теріс және қателік күйлері.
- Кодты бұзу арқылы сынамау. Мутацияны тексермей жасылға сену.
- Тексерілмейтінді елемеу. Қатты сынақтан өтудің орнына нашар дизайнды мойындамау және түзету.
Қысқаша айтқанда
Бірлік сынақтары тестілеу пирамидасының ең жылдам және ең үлкен қабаты болып табылады; Ол қателікті ең арзан сәтте ұстайды. AI бірлік сынақтарын жасауға өте қабілетті, бірақ оның ең үлкен қатесі кодтың өзінен күтілетін мәнді алу арқылы дұрыс емес әрекетті «дұрыс» деп есептейтін сынақтарды жазу болып табылады. Шешім: қабылдау ережелерін беріңіз, күтілетін мәндерді қолмен есептеңіз, AAA және FIRST принциптерін орындаңыз, сыртқы әлемді мазақ етіңіз және нақты логиканы іске қосыңыз және әрбір сынақты мутация арқылы тексеріңіз (кодты бұзу). Тексеру қиын код - түзетуді қажет ететін дизайн белгісі.
Қолданбалы тапсырма
Жеке жобаңыздан бизнес ережесін қамтитын функцияны таңдаңыз. Қабылдау ережелерін жазыңыз және AI тесттерін «ережеге негізделген бірлік сынағы» үлгісімен жазуға мүмкіндік беріңіз; Күтілетін мәндерді қолмен есептеңіз. Содан кейін «мутацияның беріктігін тексеруді» қолданыңыз: кодта кемінде 5 кішкене үзіліс жасаңыз және қанша сынақтың қызыл түске айналатынын өлшеңіз. Ұсталмаған сыбайлас жемқорлыққа арналған жаңа сынақты қосыңыз. Қанша бұзылу байқалғанын хабарлаңыз (мысалы, мутация көрсеткіші).
бақылау парағы
- [ ] Мен қабылдау ережелерін бердім және күтілетін мәндерді қолмен есептедім.
- [ ] Мен сынақтар кодтан күтілетін мәнді шығармағанына көз жеткіздім.
- [ ] Мен AAA және FIRST нұсқауларына сәйкес тәуелсіз тестілеуді орнаттым.
- [ ] Мен сыртқы тәуелділіктерді мазақ еттім және нақты логиканы орындадым.
- [ ] Мен шектеу, теріс және қате жағдайларын қарастырдым.
- [ ] Кодты бұзу (мутация) арқылы мен сынақтардың шынымен қорғайтынын дәлелдедім.