Добивки:
- Способност за производство на тестирање на единици, кутии на рабовите и анализа на јазот на покриеност со вештачка интелигенција
- Способност за печатење на очекувањата за тестирање врз основа на спецификацијата, а не тековното однесување на кодот
- Способност да се тестира дали тестот навистина штити со инјектирање грешки
Пишувањето тестови е една од задачите што произведуваат најмногу вредност што повеќето програмери ја одложуваат. Добар тест пакет е доказ дека кодот работи како што се очекува и спас за идните промени. Проблемот е што пишувањето тестови е повторливо и одзема многу време - токму онаква работа каде што вештачката интелигенција блеска. Но, постои финта: вештачката интелигенција често го тестира постојното однесување на кодот, а не однесувањето што треба да биде. Управувањето со оваа разлика е суштината на оваа единица.
Во оваа единица, ќе научите тестирање на единици (тестирање кое тестира функција самостојно, изолирано), тестови за рабови и генерирање тест податоци со вештачка интелигенција; затворање на празнините во покриеноста на тестовите; и зошто слепо верувањето на тестовите за вештачка интелигенција е опасно.
Двете страни на тестирањето: Поправање на однесувањето наспроти верификација
Тестот може да послужи за две различни цели. Првата е верификација: тестира дали кодот е точен, дали е во согласност со спецификацијата. Втората е заштита од регресија: го замрзнува однесувањето на кодот денес, па ако некој случајно го промени утре, тестот ќе се прекине и ќе извести.
ВИ е многу добра во второто; Го гледа кодот и генерира случаи кои тестираат „што прави во моментов“. Но, ако кодот е погрешен од самиот почеток, вештачката интелигенција може да го прикаже тоа погрешно однесување како „точно“. Затоа, мора да го прегледате тврдењето на секој тест што го произведува вештачката интелигенција: „Кодот враќа 42, а тестот очекува 42“ не значи дека 42 е точниот одговор.
Внимание: Ако вештачката интелигенција го помине тестот, тоа не значи дека кодот „работи“; тоа само значи „се однесува како што очекува вештачката интелигенција“. Одлучувате дали очекувањата се точни или не, гледајќи ја спецификацијата.
Чекор по чекор: Пишување робусни тестови со вештачка интелигенција
- Наведете ја спецификацијата, не само кодот. Ако ја додадете информацијата „Оваа функција треба да го направи ова“, вештачката интелигенција може да го напише точното очекување; Ќе го тестира моменталното однесување ако само го наведете кодот.
- Побарајте кутии за рабови. Празен, нула, нула, негативен, преголем, лош формат, истовременост - експлицитно тргнете од среќниот пат.
- Наведете ја рамката и стилот за тестирање. „користи pytest“, „Range-Act-Assert pattern“, „секој тест нека тестира една работа“ итн.
- Проверете ги очекувањата (тврдење). Споредете со спецификацијата што секое тврдење ја проверува за точната вредност.
- Затворете ги празнините во опсегот. Дајте постоечки тестови и прашајте "кои гранки и случаи не се тестирани?" ве натера да прашате; потоа проверете ги произведените дополнителни тестови.
Три мини футроли
Случај 1 — Покриеност од 52% до 85%. Покриеноста на тестот на еден сервисен модул беше 52%. Тимот ги нахрани постојните тестови на вештачката интелигенција, побара таа да ги наведе неиспитаните гранки и да генерира тестови за нив. Со човечки преглед, покриеноста се зголеми на 85%; Во тој процес, вештачката интелигенција откри вистинска грешка (патека која враќа погрешен код за грешка) во гранка на бубачки што никогаш претходно не била тестирана.
Случај 2 - Замка за фиксирање на лажни очекувања. Функцијата за заокружување пари всушност беше погрешна; Наместо да се заокружи 2,675 на 2,67, заокружи 2,67 наместо 2,68. Вештачката интелигенција го погледна кодот и напиша assert round_money(2.675) == 2.67 - замрзнувајќи ја грешката како „вистинита“. Кога развивачот ја прочитал спецификацијата, тој го поправил очекувањето и ја фатил вистинската грешка. Тестирањето на правилото, а не на кодот, ја направи разликата.
Случај 3 - Експлозија на рабната состојба. Кога барате од вештачката интелигенција само за „рабни случаи“ за функција за опсег на датуми; Произведе 8 случаи како почеток=крај, обратен интервал, престапна година 29 февруари, различни временски зони и нула интервал. Две од нив (обратно растојание и престапна година) всушност ја предизвикуваа грешката. Рачно разгледување на овие случаи често се прескокнува; Вештачката интелигенција овде стана партнер за „брејнсторминг“ за најсовремени случаи.
Четири шаблони за копирање
Генерирање тестови засновано на спецификации:
Улога: Програмер кој пишува тестови. Рамка: {{pytest/JUnit/Jest...}}.Што ТРЕБА ДА НАПРАВИ функцијата (спецификација): {{правило}}Напишете тестови за следнава функција. Напишете ги очекувањата според спецификацијата, НЕ тековниот излез на кодот. Среќна патека + додадете најмалку 4 рабови. Секој тест нека тестира една работа, користете описно име. {{функција}}
Размислување со рабови:
Наведете случаи на раб/неуспех што треба да се испробаат при тестирањето за оваа функција (нула, нула, точки на прекин, лош формат, истовременост, надворешна грешка). За секој случај: влез, очекувано однесување. Сè уште НЕ пишувајте код, само наведете.{{function}}
Анализа на јазот на покриеност:
Подолу се функциите и достапните тестови. Кои гранки, услови и случаи не се тестирани? Наведете ги недостатоците и напишете нови тестови само за недостатоците. Не ги повторувајте постоечките. Функција:{{function}}Тестови:{{existing_tests}}
Тест податоци / генерирање на лажни објекти:
Генерирајте реални податоци од тестот за тестовите за {{функција/услуга}}: валидни примероци, примероци од граници и неважечки примероци одделно. Предложете едноставно лажно однесување за надворешната зависност {{X}}. Користење на вистински доверливи податоци/ПИИ; Генерирајте лажни податоци.
Слаб промпт / Силен промпт
Слабо: „Напишете тест за оваа функција“.
Силно: "со pytest. Функција применува_попуст (вкупно, проценти) — правило: попустот мора да биде 0%–30%, надвор од границите треба да фрли ValueError, резултатот треба да се заокружи на 2 децимали. Напишете ги очекувањата според ова ПРАВИЛО (не по шифра). Happy path + овие случаи на рабови: 0%, 30%, [0%, 31%], вкупно негативно"
Го дава правилото за силно ослободување и вели „напиши го очекувањето според правилото, а не според кодот“; Оваа единствена реченица ја затвора стапицата на несоодветното однесување за поправање на вештачката интелигенција.
Тип на тест
Придонес за вештачка интелигенција
човечка контрола
Среќно тестирање на патната единица
брз скелет
Дали е точно очекувањето?
Куќишта за рабови
Широка бура на идеи
Елиминирајте го неважното
Пополнување на празнината на опсегот
Наоѓа прескокнати гранки
Потврдете го значењето
Тест податоци / потсмеваат
Произведува реален примерок
Нема PII, контрола на реализмот
Тестовите управуваат со квалитетот, а не го гарантираат
Високото покривање на тестот дава самодоверба, но исто така може да доведе до заблуда: 100 проценти покриеност значи „секоја линија е извршена“, а не „секој ред е точен“. Лесно е да се зголеми покриеноста со вештачка интелигенција; Вистинската вредност е во пишувањето значајни очекувања. Вредноста на тестот е неговата способност да скрши и да ве предупреди кога кодот е скршен. Затоа тестовите генерирани со вештачка интелигенција се засноваат на прашањето „дали кодот навистина се крши кога се менува? Тестирајте го со прашањето; Намерно кршење линија и гледање на тест пауза (идеја за мутација) е доказ дека тестот функционирал.
Совет: За да видите дали тестот што го пишува вештачката интелигенција функционира, креирајте мала грешка во кодот (на пр. сменете го + во -) и видете дали тестот се распаѓа. Ако не се скрши, тој тест не ве штити.
Вообичаени грешки
- Барање тест без да се даде правилото. Моделот го замрзнува тековното однесување; ја поправа грешката како „вистинита“.
- Прифаќање на очекувањата без да ги читате. Тестирањето е погрешно ако не проверите дали тврдењата ја проверуваат точната вредност.
- Само тестирање на среќниот пат. Вистинските грешки живеат на маргините; Побарајте рабови експлицитно.
- Грешка на опсегот за целта. Високиот процент не е гаранција за правилно однесување.
- Изработка на вистински/скриени податоци како тест податоци. Податоците или тајните на клиентите не треба да влегуваат во тестирањето и складирањето; Генерирајте синтетички податоци.
Сумирано
Вештачката интелигенција одзема голем дел од повторливиот товар од тестовите за пишување: произведува брзи скелети, големи списоци на рабови и анализи на јазот во покриеноста. Но, најкритичната точка се очекувањата: ВИ има тенденција да го тестира моменталното однесување на кодот, додека тестирањето треба да биде напишано според спецификацијата. Наведете го правилото, проверете ги очекувањата, наметнете ги рабовите и тестирајте дали тестовите навистина штитат со вбризгување на бубачка. Покриеноста на тестот е алатка, а не цел.
Задача за апликација
Изберете функција и прво испечатете тест на вештачката интелигенција со едноставно давање на нејзиниот код; Забележете ги очекувањата. Потоа повторно испечатете го тестот, давајќи ја спецификацијата (потребно однесување) за истата функција. Споредете ги очекувањата од двата тест сета: дали има некои различни, кој открива вистинска грешка? Конечно, потврдете дека еден од генерираните тестови функционирал со додавање на намерна грешка во кодот и гледање на паузата за тестирање.
листа за проверка
- [ ] Разликам дали тестот треба да го поправи или потврди однесувањето.
- [ ] Кога барам тест, го давам правилото (спецификацијата) што треба да постои, а не кодот.
- [ ] Го споредувам секое генерирано тврдење со спецификацијата.
- [ ] Јас експлицитно барам случаи на работ и дефекти.
- [ ] Процентуалната покриеност ја гледам како алатка, а не како цел.
- [ ] Тестувам дали тестот навистина штити со вбризгување грешки.