единица 6 / 12

Автоматизация на тестовете и осигуряване на качеството

Печалби:

  • Способност за създаване на единици, интеграция и крайни тестове със смислено твърдение с AI
  • Възможност за систематично извличане на тестово покритие, гранични стойности и отрицателни сценарии с поддръжка на AI
  • Възможност да се провери дали тестовете, произведени от AI, действително проверяват поведението, а не просто повтарят съществуващ код

Тестването е механизмът, който доказва, че софтуерът действително се държи според обещанията. Един добър тестов пакет ви казва за секунди дали промяната нарушава нещо и дава на инженера свободата да действа с увереност. AI ускорява най-досадната и най-пропусканата част от писането на тестове: генериране на множество сценарии, точки на прекъсване и отрицателни случаи. Но тук има подъл капан: AI може да пише тестове, които проверяват текущото (може би грешно) поведение на кода, а не предполагаемото му поведение; или може да произведе празни тестове, които винаги преминават, без да проверяват нищо. Стойността на един тест не е в това дали преминава, а в това дали проверява за правилното нещо и светва червено, когато е грешно.

В този модул ще научите как да създавате тестове за единици, интеграция и крайни случаи със смислени твърдения; как систематично да извличате тестово покритие, точки на прекъсване и негативни сценарии; и ще видим как можете да проверите дали тестовете, които AI произвежда, действително валидират поведението.

Концепции: Единично тестване: Тества отделно една функция/клас. Интеграционно тестване: Тества дали множество части работят правилно заедно. Assert: Изявление, което проверява дали резултатът е равен на очакваното; Това е сърцето на теста. Покритие: каква част от кода се изпълнява от тестове; Високата покривност не гарантира качество.

Създаване на смислени тестове

Добрият тест прави три неща ясно: установява състояние, извършва действие, потвърждава резултата. Когато отпечатвате тестове към AI, посочете какво поведение искате да проверите и какви сценарии трябва да покрива; В противен случай той произвежда повърхностни тестове, които винаги преминават.

  1. Определете поведението, което ще се тества. „Какво се счита за правилно?“ Отговорете ясно на въпроса.
  2. Попитайте за типове сценарии. Нормално, гранично, отрицателно, състояние на грешка.
  3. Импортирайте смислено твърдение. Той не просто "даде грешка", той "върна правилната стойност".
  4. Проверете точността на теста. Тестът става ли червен, когато съзнателно разбиете кода?

Подкана за генериране на изчерпателен тест: "Напишете единични тестове за следната функция 'applydiscount(сума, купон)'. Имайте ПОНЕ един сценарий в следните категории: (1) нормален валиден купон, (2) точки на прекъсване (0 сума, 100% отстъпка), (3) отрицателен (невалиден купон, отрицателна сума), (4) случай на грешка (нулев купон). Потвърдете очакваната стойност CONCRETE в всеки тест (не само „работи“).

Подкана за извличане на гранична стойност: „Извършете анализ на гранична стойност за входовете на тази функция. За всеки параметър извлечете стойностите „точно на границата“, „точно под границата“, „точно над границата“ като таблица. След това избройте тестовите сценарии, които покриват тези граници. Все още не пишете код, само анализ и списък със сценарии. Функция: [подпис]“

Внимание: Високото покритие на теста (напр. 90%) не доказва, че кодът е правилен. Покритието измерва колко реда са били изпълнени; не че тези редове дават правилния резултат. Тест без смислено твърдение увеличава покритието, но не гарантира нищо. Съдържанието на твърдението определя качеството, а не броят на твърденията.

Тестване на самия тест: логиката на мутацията

Най-практичният начин да разберете дали генерираният от AI тест действително работи е умишлено да разбиете кода (логика за тестване на мутации). Обърнете условие, поставете знак + -; Ако нито един тест не стане червен, вашите тестове всъщност не поддържат това поведение.

Подкана за тестване на уязвимости: „Кажете ми кои потенциални грешки в този код МОЖЕ ДА НЕ уловят следните тестове. Предложете 5 малки мутации, които могат да бъдат направени в кода (напр. >= вместо >, - вместо +) и посочете за всяка дали съществуващите тестове биха го уловили. За тези, които не са уловени, предложете тестване, което трябва да се добави. Код: [код] Тестове: [тест]“

Слаба подкана / Силна подкана

СЛАБ: "Напишете тест за тази функция." (Резултат: обикновено един щастлив сценарий, слабо твърдение; пропуска грешки.) СИЛЕН: „Напишете тест за тази функция „passwordStrong“. Правило: изисква се поне 8 знака, 1 главна буква, 1 цифра. Покрийте следните сценарии като ОТДЕЛНИ тестове: точно 8 знака (ограничение), 7 знака (под ограничението), без главни букви, без цифри, празен низ, само интервали също long (1000 знака) Изрично заявете очакваната истинска/невярна стойност във всеки тест и именувайте теста според това, което проверява."

Мощната подкана дава правила и пълни гранични сценарии. Граничните двойки като "точно 8 / 7 знака" са най-честите места за допускане на грешки (объркване > с >=). Слабата подкана заобикаля тези граници и пренася грешката в производството.

Типове тестове и къде да се използват

Тип тест

Какво потвърждава?

Принос на AI

внимание

единица

Единична функция/клас

Генерира бързо множество сценарии

Изисква се смислено твърдение

интеграция

Части, работещи заедно

Сценарий и макетна чернова на данни

Истинско пристрастяващо поведение

край/приемам

Целият потребителски поток

Списък със стъпки и очаквания

склонни към чупливост

регресия

Стара грешка не се връща

Тестване за специфични грешки

Трябва да се добави към всяка корекция

Мини калъфи

Случай 1 — Тестът, който винаги преминава. AI пише 12 теста на функция и всички те преминават. Инженерът става подозрителен и умишлено изкривява върнатата стойност на функцията; Само 3 от тестовете стават червени. Останалите 9 теста не съдържат значими твърдения. Тестването е подсилено от лов на мутации; реална защита се получава в 9 сценария.

Случай 2 — Грешка на границата. Функцията за проверка на възрастта трябва да казва „18 и повече е валидно“, но е написано >18, което означава, че възрастта 18 се отхвърля. Грешката се показва незабавно при тестване, тъй като AI генерира сценария „точно 18“ чрез анализ на точката на прекъсване. Един единствен тест за ограничение предотвратява оплаквания от реални потребители.

Случай 3 — Коригиране на текущото поведение. Когато на AI се каже да „напише тест въз основа на този код“, той произвежда тест, който приема като „правилна“ грешка при закръгляване, която вече съществува в кода. Когато инженерът отпечата теста според изискването (очаквана правилна стойност), а не кода, тестът става червен и възниква истинската грешка. Тестовете трябва да се извличат от очаквания, а не от код.

Често срещани грешки

  • Безсмислено твърдение. „Не издаде грешка“ не е достатъчно; Правилната стойност трябва да бъде проверена.
  • Объркващ обхват с качество. Високото покритие не е гаранция за точни резултати.
  • Отпечатване на теста по код. Поправя текущата грешка на "true"; Тестовете трябва да произтичат от очакванията.
  • Прескачане на гранични стойности. Объркването на > с >= е най-честата грешка; граничните двойки трябва да бъдат тествани.
  • Без одит на самия тест. Тест, който не става червен, когато разбиете кода, не осигурява защита.

В обобщение

Добрият пакет за тестване е ключът към извършването на промени с увереност. AI бързо генерира множество сценарии, граници и негативни ситуации; Но ако извлича тестове от код, а не от изисквания, той може да поправи съществуващи грешки или да напише безсмислени тестове, които винаги преминават. Посочете конкретната очаквана стойност във всеки тест, включете обвързани двойки и проверете дали вашите тестове действително защитават чрез умишлено нарушаване на кода. Съдържанието на твърдението, а не броят на обхватите, определя качеството.

Задача за приложение

Изберете функция и я накарайте да генерира тестове в четири категории (нормален, ограничен, отрицателен, грешка) с подкана за цялостно генериране на тест; Посочете конкретната очаквана стойност във всеки тест. След това стартирайте подканата за тестване на уязвимости, предложете 5 малки мутации в кода и изпълнете тестовете, за да проверите кои от тях улавят. Добавете нов тест за поне една мутация, която не е уловена и покажете, че сега е на червено.

контролен списък

  • [ ] Отпечатах тестовете въз основа на очакваното/правилното поведение, а не на кода.
  • [ ] Обхванах нормални, ограничени, отрицателни и грешки сценарии.
  • [ ] Заявих конкретната очаквана стойност във всеки тест.
  • [ ] Тествах двойки граници (точно над-долу / точно над-долу).
  • [ ] Чрез умишлено разбиване на кода потвърдих, че тестовете са станали червени.
  • [ ] Добавих нов тест за неоткрити мутации.