Табыстар:
- Жалған сенімнің үш қырын тану (талапсыз, өзін-өзі растау, тривиальды бекіту) және антидоттарды қолдану мүмкіндігі
- Құралмен немесе қолмен қамту пайызына қарағанда сапаның дәл өлшемі ретінде мутация сынағы мен мутация көрсеткішін пайдалану мүмкіндігі
- AI-ны тестілеуге қарсы қызыл команда ретінде орналастыру және мақтау тұзағына түспестен кемшіліктерді сынау мүмкіндігі
Бұл модульдің негізінде қайталанатын ескерту бар: жасыл жарқыраған сынақ тақтасы сапаның дәлелі емес. Егер сіздің сынақтарыңыз сізге сенімділік берсе, сіз бұл сенімділіктің шынайы немесе жалған екенін білуіңіз керек. Жасанды интеллект (AI) дәуірінде бұл сұрақ бұрынғыдан да маңызды, өйткені AI сұйық, тегіс көрінетін, бірақ қуыс сынақтарды шығаруға шебер. Жалған сенімділік — бағдарламалық жасақтаманың дұрыс екеніне сену, өйткені сынақтар жасыл, ал шын мәнінде сынақтар ештеңені растамайды — QA тобында болуы мүмкін ең қауіпті нәрсе; себебі ол қателер жоқ екенін емес, қателерді көре алмайтыныңызды жасырады. Бұл блок бүкіл модульдің валидация философиясын бір пәнге біріктіреді: тесттеріңізді сынау.
Сынақ сапасын өлшеудің алтын стандарты: мутация сынағы
Тесттің шын мәнінде қорғайтынын немесе қорғамайтынын түсінудің ең күшті жолы - мутация тесті (мутация тесті – бастапқы кодта әдейі кішігірім бұрмаланулар/мутациялар жасайтын және сынақтардың осы бұрмалануларды анықтайтынын өлшейтін әдіс). Логика қарапайым: егер сіз кодты әдейі бұзсаңыз (+-ны -ға, а >-ді >=-ге, ақиқатты жалғанға айналдырсаңыз), жақсы сынақ жинағы бұл бүлінуді ұстап, қызылға айналуы керек. Олай болмаса, бұл бұзылу аман қалған мутант болып табылады, сондықтан сіздің сынақтарыңыз іс жүзінде бұл мінез-құлықты сақтамайды.
Мутация көрсеткіші = өлген мутация / жалпы мутация. 90% желі қамтуы бар пакетте мутация көрсеткіші 40% болуы мүмкін; Бұл сызықтардың жұмыс істеп тұрғанын, бірақ әрекеттің тексерілмегенін көрсетеді. Мутация көрсеткіші пайыздық қамтуға қарағанда сапаның әлдеқайда шынайы өлшемі болып табылады.
Кеңес: Автоматты мутация құралдары бар (Java үшін PIT/Pitest, JavaScript/TypeScript үшін Stryker, .NET үшін Stryker.NET, Python үшін mutmut). Олар автоматты түрде жүздеген мутацияларды жасайды және тексереді. Егер сізде құрал болмаса, тіпті қолмен жасалған «кодты тексеруді бұзу» әдісі маңызды функциялар үшін баға жетпес.
Псевдосенімнің үш қыры және оның антидоты
Псевдосенім формасы
симптом
антидот
Бекітусіз сынақ
Код жұмыс істейді, ештеңе расталмаған
Әрбір сынақта шынайы бекіту; мутациямен сынау
өзін-өзі растайтын тест
Күтілетін = кодты шығару
Күтілетін мәнді дербес есептеңіз
Тривиальды бекіту
"нөл емес", "200 қайтарылды"
Бизнес ережесін/нақты нәтижені растаңыз
Ауқымды қателік
90% сызықтар, төмен қорғаныс
Мутация көрсеткішін қараңыз
Нәзік сынаққа төзімділік
«Тағы да кептелді, өтіңіз»
Түбірлік себеп + детерминирленген тестілеу
AI-ны «қызыл команда» ретінде пайдалану
AI жалған сенім тудыра алады және оны іздеуде күшті одақтас бола алады. AI-ді өз сынақтарыңызға қарсы қызыл команда ретінде пайдаланыңыз: «осы сынақтардан өтетін, бірақ қате кодты жазыңыз» немесе «осы сынақтарды алдайтын диверсияны табыңыз» деп сұраңыз. Егер AI сынақтарыңызда бос жерлерді тапса, бұл олқылықтар нақты тәуекелдер болып табылады.
Абайлаңыз: AI-дан «Менің сынақ сапасы жақсы ма?» деп сұрамаңыз. және «иә, тамаша» деген жауапты сенімділік ретінде қабылдаңыз. AI мейірімді болуға бейім. Оның орнына AI-ді нақты тапсырмаға шақырыңыз: «осы сынақтардан өтетін қатені жасаңыз». Егер ол оны шығарса, сіздің сынақтарыңыз бұл қатені көрмейді.
Эквивалентті мутациялар және балл шектері
Мутацияға тестілеу күшті, бірақ оның жақсы жағы бар: кейбір мутациялар кодтың әрекетін мүлде өзгертпейді. Бұл эквивалентті мутациялар деп аталады (эквивалентті мутант — бүлінген код, түпнұсқадағыдай нәтиже беретін мутация). Мысалы, ешқашан пайдаланылмайтын айнымалының бастапқы мәнін өзгерту шығысқа әсер етпейді; Ешбір сынақ мұны ұстай алмайды және ұстамауы керек. Сондықтан 100% мутация көрсеткіші тәжірибеде жиі қолжетімсіз және мақсат емес. Эквивалентті мутацияларды қолмен жою еңбекті қажет етеді; Сондықтан мутация ұпайын абсолютті емтихан ұпайы ретінде оқымаңыз, бірақ «менің сынақтарым шынымен қорғайды ма?» деген шынайы көрсеткіш ретінде.
Практикалық тәсіл мынада: мутация тестін бүкіл кодтық базада үнемі іске қосудың орнына, оны ең жоғары тәуекелді және ең күрделі бизнес ережелерін қамтитын модульдерде іске қосыңыз. Осы модульдердегі аман қалған мутацияларды бір-бірлеп қарастырыңыз; Егер бұл нақты бос орын болса, сынақты қосыңыз; егер ол эквивалентті мутация болса, оны негіздеу арқылы белгілеп, өту. AI аман қалған мутацияның эквиваленттілігін бағалау үшін бастапқы скринингті жүргізе алады; бірақ соңғы шешімді кодтың не істейтінін білетін сіз қабылдайсыз.
Абайлаңыз: Мутацияға сынау есептеу үшін қымбат (барлық тиісті сынақтар әрбір мутация үшін қайта орындалады). Сондықтан жалпы және ақылға қонымды стратегия - оны әрбір біріктіру емес, маңызды модульдер үшін апта сайынғы немесе шығарылым алдындағы терең тексеру ретінде жоспарлау.
Әлсіз шақыру / Күшті шақыру
Әлсіз: «Менің сынақтарым жеткілікті ме?»
Күшті: "Осы функция мен сынақ жинағы үшін қызыл топ ретінде әрекет етіңіз. (1) Өлтіруге болатын кодта 8 мутация жасаңыз (операторды ауыстыру, шекараны ауыстыру, шартты инверсия, мәнді қайтару). (2) Әрбір мутация үшін бар сынақтардың қайсысы оны ұстайтынын және қайсысы ЕМЕС екенін көрсетіңіз. (3) Тірі қалған әрбір мутация үшін оны өлтіретін жаңа мысалды шығаратын кодты жазыңыз4) осы сынақтардың барлығы, бірақ код+тесттерін бұзады: [қою]».
Күшті жеделдік; Ол AI-ны мақтау машинасы емес, сынақтан өтетін емтихан алушы ретінде орналастырады.
Көшірілетін төрт үлгі
1) Мутацияны қолмен басқару:
Осы код үшін 8 маңызды мутация (кішігірім әдейі бұзылулар) жасаңыз: арифметикалық операторды ауыстыру, салыстыру шегі (> vs >=), логикалық инверсия, қайтару/тұрақты ауыстыру, шартты өткізіп жіберу. Әрбір мутация үшін қол жетімді сынақтардың қайсысы оны ұстайтынын немесе болмайтынын болжаңыз. Код+тесттер: [қою]
2) Тірі қалған мутацияны жою:
Келесі мутация сынағы есебі аман қалған (ұсталмаған) мутацияларды қамтиды: [тізім/есеп]. Әрқайсысы үшін осы мутацияны өлтіретін минималды сынақ жазыңыз (осылай бұзылған кезде код қызылға айналады). Тест қандай мінез-құлықты растайтыны туралы түсініктеме беріңіз.
3) Қызыл топ — қан анализі:
Келесі сынақтардың БАРЛЫҒЫНАН ӨТЕТІН, бірақ келесі бизнес ережесін бұзатын код жаза аласыз ба: [бизнес ережесі]. Егер солай болса, бұл сынақтардағы қандай олқылық бұған мүмкіндік береді? Бұл олқылықты жабатын сынақты қосыңыз. Тесттер: [қою]
4) Сынақ сапасын тексеру:
Сапа үшін осы сынақ жиынтығын тексеріңіз. Әрбір сынақ үшін құсбелгі қойыңыз:- Шынайы растау бар ма немесе ол тірек пе?- Күтілетін мән тәуелсіз, кодтан алынған ба?- Ол бизнес ережесін немесе тривиальды нәрсені тексере ме? Соңында болжалды «шынайы бекіту ұпайын» және ең әлсіз 3 сынақты беріңіз. Тесттер: [қою]
үш шағын іс
1-жағдай — Қамту 92%, мутация көрсеткіші 38%. Бір команда жоғары қамтуға сенді. Страйкер көмегімен мутация сынағы жүргізілгенде, балл 38% құрады: жасалған мутациялардың көпшілігі аман қалды. Бұл сынақтардың жолдарды орындамағанының және мінез-құлықты тексермейтінінің дәлелі болды. Команда тестілеу сапасына үш апта жұмсады; Мутация көрсеткіші 81%-ға дейін өсті және келесі шығарылымда осы күшейтілген сынақтар арқылы екі нақты есептеу қатесі анықталды.
2-жағдай – AI сынақты алдады. «Қызыл команда» үлгісімен сарапшы AI-дан бар сынақтардан өткен, бірақ жеңілдік ережесін бұзған кодты сұрады. AI әрқашан нөлдік жеңілдікті қайтаратын кодты жазды - және барлық сынақтар жасыл болып қалды, өйткені ешқандай сынақтар нақты жеңілдік мәнін тексермеді. Көрінген олқылық, нақты бекітулер қосылды.
3-жағдай - Мақтау тұзағы. Кіші сынақшы AI-дан: «Менің сынақтарым жақсы ма?» деп сұрады. «Өте жан-жақты» деген жауапты естіп, жеңілдеп қалды. Оның аға әріптесі «сынақ сапасы аудиті» үлгісін пайдаланып, дәл осындай сынақтарды тексерді; 20 сынақтың 12-сі декор (бекітусіз немесе керексіз) болып шықты. Дұрыс сұрақ дұрыс жауап берді.
Жалпы қателер
- Сапа үшін қателік ауқымы. Жоғары қатарды қамтуға сүйену және мутация көрсеткішіне мүлдем қарамау.
- AI-ның мақтауына сену. "Тесттерің жақсы ма?" және оң жауапты кепілдік ретінде қарастыру.
- Кодтан күтілетін мәнді шығару. Қате кодты растайтын өзін-өзі тексеру сынақтары.
- Болмашы тұжырымдарға қанағаттаныңыз. «Нөл емес», «200 қайтарылды» сияқты нақты ережені растамайтын тексерулер.
- Тірі қалған мутацияларды елемеу. Мутация туралы есепте ұсталмағанды елемеу.
- Тіпті сыни кодты қолмен мутациялауға тырыспайды. Құрал жоқ болса, «кодты бұзу және тексеру» қадамын өткізіп жіберу.
Қысқаша
Псевдосенім бағдарламалық жасақтаманың дұрыс екеніне сенеді, себебі сынақтар жасыл; ал сынақтар ештеңені растамауы мүмкін. Мұны өлшеудің алтын стандарты - мутация сынағы: кодты әдейі бұзу және сынақтардың оны ұстайтынын өлшеу. Мутация көрсеткіші пайыздық қамтуға қарағанда сапаның әлдеқайда шынайы өлшемі болып табылады. AI жалған сенім тудырады және оны іздеуде күшті қызыл командаға айналады - «осы сынақтардан өткен қатені шығарыңыз» деп сұраңыз. Тесттеріңізді тексеріңіз: шынайы бекіту, тәуелсіз күтілетін мән, бизнес ережесін тексеру және жойылған мутациялар.
Қолданбалы тапсырма
Жеке жобаңыздан бизнес ережесін және оның сынақтарын қамтитын функцияны импорттаңыз. Мүмкін болса, мутация құралын (Stryker/Pitest/mutmut) іске қосыңыз және мутация көрсеткішін өлшеңіз; Құрал жоқ болса, «мутацияны қолмен басқару» үлгісімен кемінде 8 мутация жасаңыз және оларды қолмен көріңіз. Әрбір аман қалған мутация үшін «тірі қалған мутацияны өлтіру» үлгісімен жаңа сынақ жазыңыз. Соңында, «қызыл команда» үлгісімен AI сынақтарыңызды алдайтын кодты шығара алатынын көріңіз. Мутацияның бастапқы және аяқталу көрсеткішін (немесе ұсталған/жалпы мутация жылдамдығы) хабарлаңыз.
бақылау парағы
- [ ] Мен сынақ сапасын қамту емес, мутация көрсеткіші бойынша бағаладым.
- [ ] Мен маңызды код үшін мутация сынамасын (құрал арқылы немесе қолмен) жүргіздім.
- [ ] Мен аман қалған әрбір мутация үшін жаңа сынақтар жаздым.
- [ ] Мен AI-ды қызыл команда ретінде қолдандым және сынақтарымда бос жерлерді іздедім.
- [ ] Жасанды интеллекттің «сынақтарың жақсы» деген мақтауын мен сенімділік ретінде қабылдаған жоқпын.
- [ ] Әрбір сынақ нақты бекітуді, тәуелсіз күтілетін мәнді және бизнес ережесін тексеретінін тексердім.