Zyski:
- Umiejętność tworzenia testów jednostkowych, integracyjnych i brzegowych ze znaczącymi potwierdzeniami za pomocą sztucznej inteligencji
- Możliwość systematycznego wyodrębniania zasięgu testów, wartości granicznych i negatywnych scenariuszy przy wsparciu AI
- Możliwość sprawdzenia, czy testy tworzone przez sztuczną inteligencję faktycznie weryfikują zachowanie, a nie tylko powtarzają istniejący kod
Testowanie to mechanizm potwierdzający, że oprogramowanie faktycznie zachowuje się zgodnie z obietnicą. Dobry zestaw testów w ciągu kilku sekund poinformuje Cię, czy zmiana coś psuje, i daje inżynierowi swobodę działania. Sztuczna inteligencja przyspiesza najbardziej żmudną i najczęściej pomijaną część pisania testów: generowanie wielu scenariuszy, punktów przerwania i przypadków negatywnych. Ale kryje się tu podstępna pułapka: sztuczna inteligencja może napisać testy, które weryfikują bieżące (być może błędne) zachowanie kodu, a nie jego przypuszczalne zachowanie; lub może generować puste testy, które zawsze kończą się sukcesem, w rzeczywistości niczego nie sprawdzając. Wartość testu nie polega na tym, czy przejdzie pomyślnie, ale na tym, czy sprawdza, czy coś jest właściwe, i czy zmienia kolor na czerwony, gdy jest błędny.
W tej części dowiesz się, jak tworzyć testy jednostkowe, integracyjne i brzegowe za pomocą znaczących asercji; jak systematycznie wyodrębniać pokrycie testów, punkty przerwania i scenariusze niekorzystne; i zobaczymy, jak sprawdzić, czy testy przeprowadzane przez sztuczną inteligencję rzeczywiście weryfikują zachowanie.
Pojęcia: Testowanie jednostkowe: Testuje pojedynczą funkcję/klasę w izolacji. Testowanie integracyjne: sprawdza, czy wiele części współpracuje poprawnie. Assert: oświadczenie sprawdzające, czy wynik jest równy oczekiwanemu; To jest serce testu. Zasięg: jaka część kodu jest uruchamiana przez testy; Wysokie krycie nie gwarantuje jakości.
Tworzenie znaczących testów
Dobry test wyraźnie spełnia trzy funkcje: ustanawia stan, wykonuje akcję i potwierdza wynik. Drukując testy do AI, określ, jakie zachowanie chcesz zweryfikować i jakie scenariusze ma obejmować; W przeciwnym razie tworzy powierzchowne testy, które zawsze kończą się sukcesem.
- Zdefiniuj zachowanie, które ma zostać przetestowane. „Co uważa się za słuszne?” Odpowiedz jasno na pytanie.
- Zapytaj o typy scenariuszy. Normalny, graniczny, ujemny, stan błędu.
- Importuj znaczące potwierdzenie. Nie tylko „zgłosił błąd”, ale „zwrócił poprawną wartość”.
- Sprawdź dokładność testu. Czy test zmienia kolor na czerwony, gdy świadomie łamiesz kod?
Kompleksowy monit o wygenerowanie testu: „Napisz testy jednostkowe dla następującej funkcji „applydiscount(kwota, kupon)”. Zawieraj CO NAJMNIEJ jeden scenariusz w następujących kategoriach: (1) normalny ważny kupon, (2) punkty przerwania (0 ilość, 100% rabatu), (3) ujemny (nieprawidłowy kupon, kwota ujemna), (4) przypadek błędu (kupon zerowy). Potwierdź KONKRETNĄ oczekiwaną wartość w każdym teście (nie tylko „przepracowany”). Nazwij testy w sposób czytelny. Kod: [kod]”
Monit o wyodrębnienie wartości granicznych: „Przeprowadź analizę wartości granicznych dla wejść tej funkcji. Dla każdego parametru wyodrębnij wartości „tuż na granicy”, „tuż pod granicą”, „tuż nad granicą” w formie tabeli. Następnie wypisz scenariusze testowe, które pokrywają te granice. Nie pisz jeszcze kodu, tylko analizę i listę scenariuszy. Funkcja: [podpis]”
Uwaga: Wysokie pokrycie testami (np. 90%) nie oznacza, że kod jest poprawny. Pokrycie mierzy, ile wierszy zostało wykonanych; nie oznacza to, że te linie dają poprawny wynik. Test bez znaczącego potwierdzenia zwiększa zasięg, ale niczego nie gwarantuje. Treść twierdzenia określa jakość, a nie liczbę twierdzeń.
Testowanie samego testu: logika mutacji
Najbardziej praktycznym sposobem sprawdzenia, czy test wygenerowany przez sztuczną inteligencję rzeczywiście działa, jest celowe złamanie kodu (logika testowania mutacji). Odwróć warunek, wstaw znak + -; Jeśli żaden test nie zmieni koloru na czerwony, oznacza to, że Twoje testy w rzeczywistości nie utrzymują tego zachowania.
Podpowiedź przetestuj wykrywanie podatności: „Powiedz mi, jakich potencjalnych błędów w tym kodzie MOGĄ NIE wychwycić poniższe testy. Zaproponuj 5 małych mutacji, które można wprowadzić w kodzie (np. >= zamiast >, - zamiast +) i dla każdej z nich wskaż, czy istniejące testy to wyłapią. Jeśli nie zostaną wyłapane, zasugeruj testy, które należy dodać. Kod: [kod] Testy: [test]”
Słaba podpowiedź/silna podpowiedź
SŁABY: „Napisz test tej funkcji”. (Wynik: zwykle jeden szczęśliwy scenariusz, słabe potwierdzenie; pomija błędy.) SILNY: „Napisz test dla tej funkcji „passwordStrong”. Reguła: co najmniej 8 znaków, wymagana jest 1 duża litera, 1 cyfra. Obejmij następujące scenariusze jako ODDZIELNE testy: dokładnie 8 znaków (limit), 7 znaków (poniżej limitu), bez wielkich liter, bez cyfr, pusty ciąg znaków, tylko spacje, za długi (1000 znaków) Jawnie potwierdź oczekiwane wartość prawda/fałsz w każdym teście i nazwij test zgodnie z tym, co sprawdza.”
Potężny monit podaje reguły i scenariusze z pełnymi granicami. Pary graniczne, takie jak „dokładnie 8/7 znaków”, są najczęstszymi miejscami popełniania błędów (myląc > z >=). Słaby monit omija te granice i przenosi błąd do produkcji.
Rodzaje testów i gdzie je stosować
Typ testu
Co potwierdza?
Wkład AI
Uwaga
jednostka
Pojedyncza funkcja/klasa
Szybko generuje wiele scenariuszy
Wymagane jest znaczące stwierdzenie
integracja
Części współpracujące ze sobą
Scenariusz i próbna wersja danych
Prawdziwie uzależniające zachowanie
zakończyć/zaakceptować
Cały przepływ użytkowników
Lista kroków i oczekiwania
skłonny do kruchości
regresja
Stary błąd nie powraca
Testowanie specyficzne dla usterki
Należy dodać do każdej poprawki
Mini etui
Przypadek 1 — Test, który zawsze kończy się sukcesem. AI zapisuje 12 testów funkcji i wszystkie przechodzą pomyślnie. Inżynier nabiera podejrzeń i celowo zniekształca wartość zwracaną przez funkcję; Tylko 3 testy zmieniają kolor na czerwony. Pozostałe 9 testów nie zawiera znaczących twierdzeń. Testowanie jest wzmacniane przez polowanie na mutacje; prawdziwą ochronę uzyskuje się w 9 scenariuszach.
Przypadek 2 – Błąd graniczny. Funkcja weryfikacji wieku powinna zawierać informację „Ważne jest 18 lat”, ale wpisano wartość > 18, co oznacza, że wiek 18 lat jest odrzucany. Błąd pojawia się od razu podczas testów, ponieważ sztuczna inteligencja generuje scenariusz „dokładnie 18” poprzez analizę punktów przerwania. Test pojedynczego limitu zapobiega prawdziwym skargom użytkowników.
Przypadek 3 — Naprawa bieżącego zachowania. Kiedy sztuczna inteligencja ma „napisać test w oparciu o ten kod”, tworzy test, który akceptuje jako „poprawny” błąd zaokrąglenia, który już istnieje w kodzie. Kiedy inżynier wydrukuje test zgodnie z wymaganiami (oczekiwaną poprawną wartością), a nie kodem, test zmieni kolor na czerwony i wystąpi prawdziwy błąd. Testy należy wyprowadzać z oczekiwań, a nie z kodu.
Typowe błędy
- Bezsensowne twierdzenie. „Nie zgłosiło błędu” nie wystarczy; Należy sprawdzić poprawność wartości.
- Mylenie zakresu z jakością. Wysokie pokrycie nie gwarantuje dokładnych wyników.
- Drukowanie testu po kodzie. Naprawia bieżący błąd na „true”; Testy powinny wynikać z oczekiwań.
- Pomijanie wartości granicznych. Najczęstszym błędem jest mylenie > z >=; należy przetestować pary graniczne.
- Brak audytu samego testu. Test, który nie zmienia koloru na czerwony po złamaniu kodu, nie zapewnia ochrony.
Podsumowując
Dobry zestaw testów jest kluczem do pewnego wprowadzania zmian. Sztuczna inteligencja szybko generuje mnóstwo scenariuszy, granic i negatywnych sytuacji; Jeśli jednak wyprowadza testy z kodu, a nie z wymagań, może naprawić istniejące błędy lub napisać bezsensowne testy, które zawsze kończą się sukcesem. Potwierdź konkretną wartość oczekiwaną w każdym teście, uwzględnij powiązane pary i sprawdź, czy testy faktycznie chronią, celowo łamiąc kod. Treść potwierdzenia, a nie liczba zakresów, określa jakość.
Zadanie aplikacji
Wybierz funkcję i wygeneruj testy w czterech kategoriach (normalny, graniczny, ujemny, błąd) z kompleksowym monitem o wygenerowanie testu; W każdym teście należy potwierdzić konkretną wartość oczekiwaną. Następnie uruchom test wyszukiwania podatności, zasugeruj 5 małych mutacji w kodzie i uruchom testy, aby sprawdzić, które zostaną wykryte. Dodaj nowy test na co najmniej jedną mutację, która nie została wykryta, i pokaż, że jest ona teraz na minusie.
lista kontrolna
- [ ] Wydrukowałem testy w oparciu o oczekiwane/poprawne zachowanie, a nie kod.
- [ ] Omówiłem scenariusze normalne, graniczne, negatywne i błędów.
- [ ] W każdym teście potwierdziłem konkretną oczekiwaną wartość.
- [ ] Testowałem pary graniczne (tuż powyżej-poniżej/tuż powyżej-poniżej).
- [ ] Celowo łamiąc kod, potwierdziłem, że testy zmieniły kolor na czerwony.
- [ ] Dodałem nowy test na niewykryte mutacje.