Jednostka 6 / 11

Generowanie testów za pomocą sztucznej inteligencji: testy jednostkowe, interfejsowe i automatyczne

Zyski:

  • Umiejętność tworzenia testów jednostkowych, integracyjnych i UI ze sztuczną inteligencją zgodnie z piramidą testową oraz pokrywania sytuacji granicznych, błędnych i szczęśliwych scenariuszy
  • Możliwość wyeliminowania pustych/bezużytecznych testów i nadętego zasięgu poprzez sprawdzenie, czy każdy wygenerowany test faktycznie potwierdza zachowanie
  • Zapewnienie, że test wykryje błąd i uniemożliwi mu jego naprawienie, informując sztuczną inteligencję, co powinien zrobić kod

Pisanie kodu to połowa pracy; Udowodnienie, że kod działa poprawnie, to druga połowa. Aplikacje mobilne spotykają się z setkami różnych urządzeń, rozmiarów ekranu, wersji systemu operacyjnego i zachowań użytkowników. Nie da się przetestować tego wszystkiego ręcznie; Dlatego właśnie testowanie automatyczne (testowanie kodu — testowanie bez kliknięcia człowieka) jest podstawą jakości mobilnej. Sztuczna inteligencja jest niezwykle wydajna w pisaniu testów, ponieważ pisanie testów to dokładnie taki rodzaj pracy ze wzorcami, jaki lubi: sprawdzanie określonego zachowania dla określonych danych wejściowych. W tej części dowiemy się, jak przyspieszyć testy jednostkowe, testowanie interfejsu i automatyzację za pomocą sztucznej inteligencji, ale jednocześnie zapewniać jakość testu ludzkimi oczami.

Piramida testowania: co testować i ile

Zdrowa strategia testowania przypomina piramidę. Baza zawiera dużą liczbę testów jednostkowych (szybkie testowanie, które testuje pojedynczą funkcję lub klasę w izolacji); są szybkie i tanie. Pośrodku jest mniej testów integracyjnych (testowanie współpracy wielu części). Na górze znajdują się minimalne testy interfejsu użytkownika/end-to-end (testowanie odbywa się poprzez kliknięcie na ekranie tak, jak robi to użytkownik); są realistyczne, ale powolne i delikatne. Sztuczna inteligencja pomaga na każdej warstwie, ale największa wartość leży u podstawy: szybkie tworzenie testów jednostkowych logiki biznesowej.

Typ testu

Zakres

prędkość

Wydajność sztucznej inteligencji

testy jednostkowe

Pojedyncza funkcja/klasa

bardzo szybko

bardzo wysoki

integracja

międzywarstwa

średni

wysoki

Interfejs użytkownika / kompleksowo

Cały strumień ekranu

powolny

Średni (kruchy)

Wskazówka: mówiąc AI, aby „wygenerowała testy dla tej funkcji”, wyraźnie poproś o przypadki brzegowe: puste dane wejściowe, wartość null, liczba ujemna, bardzo duża wartość, błąd sieci. AI z łatwością tworzy szczęśliwą ścieżkę; Prawdziwe błędy kryją się w granicach i wyskakują, jeśli ich tam nie chcesz.

Etapy pisania testów z AI

  1. Zdefiniuj zachowanie, które ma zostać przetestowane. „Ta funkcja powinna dawać ten wynik na to wejście.”
  2. Określ ramy. JUnit + MockK na Androida, XCTest na iOS, Espresso (Android) lub XCUITest (iOS) dla interfejsu użytkownika.
  3. Zapytaj o stany graniczne. Szczęśliwy scenariusz + błąd + punkty przerwania.
  4. Zarządzaj próbnymi obiektami. Na potrzeby testowania emulowane są zależności zewnętrzne, takie jak sieć i baza danych (mock — kontrolowana próba zamiast rzeczywistej usługi).
  5. Uruchom test i sprawdź. Czy test zdaje egzamin, czy potwierdza coś naprawdę istotnego?

Piąty krok jest krytyczny. Sztuczna inteligencja czasami tworzy bezużyteczne testy, które „zawsze zdają egzamin”; na przykład test, który niczego nie weryfikuje lub sprawdza własne fałszywe dane. Zdany egzamin i wartościowy test to dwie różne rzeczy.

Uwaga: to, że sztuczna inteligencja może wyprodukować, nie oznacza, że ​​test jest prawidłowy. Czasami sztuczna inteligencja akceptuje bieżące (być może błędne) zachowanie kodu jako „poprawne” i odpowiednio pisze testy. Takie testowanie naprawia błąd, zamiast go wyłapywać. Ty określasz, czego oczekuje test; Powiedz AI, co powinna zrobić, a nie co robi kod.

Miara pokrycia testowego i błąd

Pokrycie testów (jaki procent kodu jest wykonywany przez testy) to przydatna, ale myląca metryka. Pokrycie 90% oznacza, że ​​wykonano 90% kodu; ale nie sprawdzono, czy linie te działają poprawnie. Test, który uruchamia linię i nie sprawdza wyniku, zawyża zakres, ale nie zapewnia bezpieczeństwa. Celem nie są duże liczby, ale znacząca walidacja. Możesz szybko skalować rozwiązanie za pomocą sztucznej inteligencji, ale upewnij się, że każdy test faktycznie testuje zachowanie.

trzy mini etui

Przypadek 1 – Uchwycona sytuacja graniczna. AI poproszono o testy funkcji przekazu pieniężnego w aplikacji bankowej, a konkretnie dodano scenariusze „kwota ujemna” i „więcej niż saldo”. Test wykazał, że przelew nie został zablokowany kwotą ujemną; stanowiłaby to poważną lukę w zabezpieczeniach produkcji. Zamknięto przez dodanie kontrolki jednowierszowej. Lekcja: testy graniczne są najcenniejszymi testami.

Przypadek 2 – Fałszywy test. Jeden zespół odetchnął z ulgą, zwiększając zasięg do 85% za pomocą 40 testów jednostkowych opracowanych przez sztuczną inteligencję. Podczas inspekcji okazało się, że większość testów tak naprawdę nie weryfikowała żadnych wyników, po prostu wywoływały funkcję i zapisywałyasserTrue(true). Zasięg był wysoki, ale ochrona zerowa. Testy zostały poddane przeglądowi i napisane na nowo, uwzględniając rzeczywiste walidacje. Lekcja: liczby dotyczące zasięgu mogą kłamać.

Przypadek 3 — Przyspieszone testowanie interfejsu użytkownika. Zespół ds. handlu elektronicznego napisał skrypt XCUITest przedstawiający proces dodawania do koszyka przy użyciu sztucznej inteligencji w 20 minut; Gdyby pisano go ręcznie, zajęłoby to pół dnia. AI odgadła identyfikatory elementów ekranu; Zespół dopasował je do prawdziwego kodu i naprawił. Szybkość przeciągu jest rzeczywista, ale weryfikacja identyfikatora to praca człowieka.

Słaba zachęta/silna zachęta

Słaby monit: „Napisz test dla tej funkcji”.

Potężny monit: „Wytwórz testy jednostkowe dla tej funkcji Kotlina za pomocą JUnit5 + MockK. Funkcja: przelew pieniężny (kwota, źródło, cel). Zachowania do przetestowania (co powinien ROBIĆ kod): - Prawidłowy przelew musi się powieść - Kwota ujemna lub zerowa musi zostać odrzucona - Kwota większa niż saldo musi zostać odrzucona - Błąd sieci musi zgłosić odpowiedni wyjątek. Każdy test powinien zweryfikować tylko jedną rzecz, ich nazwy powinny być opisowe, kpić z usługi zewnętrznej. Nie pisz pustej asercji.

Szablony do kopiowania

Szablon testu jednostkowego: „Wygeneruj testy jednostkowe [JUnit/XCTest] dla tej funkcji dla [język]. Oczekiwane zachowanie: [co robić]. Uwzględnij: szczęśliwy scenariusz, dane wejściowe o wartości null, punkty przerwania, przypadek błędu. Niech każdy test zweryfikuje pojedyncze zachowanie; użyj znaczącej asercji; próbuj. [kod]”

Szablon testowania interfejsu użytkownika: „Napisz test interfejsu użytkownika dla następującego przepływu za pomocą [Espresso/XCUITest]: [przebieg użytkownika krok po kroku]. Wybierz elementy ekranu z identyfikatorem dostępności, użyj identyfikatora zamiast tekstu. Dodaj strategię oczekiwania. Przypomnij mi, aby dopasować identyfikatory elementów do rzeczywistego kodu.”

Szablon audytu testów: „Zbadaj te testy:1) Czy rzeczywiście weryfikują wynik/zachowanie, czy też są zerowe?2) Czy obejmują przypadki graniczne?3) Czy naprawiają błędy w kodzie lub oczekują prawidłowego zachowania? Oznaczą i wzmocnią słabe testy. [testy]”

Szablon optymalizacji pokrycia: „Zidentyfikuj nieprzetestowane części tej klasy i zaproponuj znaczące testy. Nadaj priorytet ścieżkom o rzeczywistym ryzyku, a nie tylko liczbie pokryć. [kod]”

Typowe błędy

  • Właśnie testuję szczęśliwy scenariusz. Błędy przechowywane są w stanach granicznych; Proś o nie otwarcie.
  • Akceptacja pustego/bezużytecznego testu. Testy typu AssertTrue(true) zawyżają zakres i nie zapewniają żadnej ochrony.
  • Poproś sztuczną inteligencję o sprawdzenie, co robi kod. Testowanie powinno oczekiwać tego, co powinien zrobić kod; w przeciwnym razie naprawia błąd.
  • Pomyłka z numerem zakresu w tym celu. 90% pokrycia nie oznacza 90% dokładności.
  • Link do tekstu w testowaniu interfejsu użytkownika. Test zostaje przerwany w przypadku zmiany tekstu; Użyj stabilnego identyfikatora (id).
  • Nieprawidłowe konfigurowanie prób. „Test jednostkowy”, który wywołuje rzeczywistą usługę, będzie powolny i kruchy.

Podsumowując

Testowanie jest podstawą jakości mobilnej, a sztuczna inteligencja jest w tym obszarze bardzo wydajna, szczególnie w testach jednostkowych. Postępuj zgodnie z piramidą testowania: wiele jednostek, średnia integracja, mało testów interfejsu użytkownika. Wyraźnie poproś sztuczną inteligencję o szczęśliwy scenariusz, a także o ograniczenie przypadków i ścieżek błędów. Upewnij się, że każdy wygenerowany test faktycznie potwierdza zachowanie; Puste testy i zawyżony zasięg wprowadzają w błąd. Co najważniejsze, powiedz AI, co kod powinien zrobić, a nie co robi, aby test wyłapał błąd, a nie go naprawił.

Zadanie aplikacji

Zażądaj testów od sztucznej inteligencji, korzystając z „szablonu testu jednostkowego” dla funkcji logiki biznesowej (np. obliczenia rabatu lub walidacji formularza) i wyraźnie określ przypadki graniczne (zerowe, ujemne, za duże). Uruchom wygenerowane testy, a następnie zleć ich audyt za pomocą „Szablon audytu testów”. Znajdź przynajmniej jeden słaby test, wzmocnij go i sprawdź, czy testy wyłapią rzeczywisty błąd funkcji (dodając mały błąd).

lista kontrolna

  • [ ] Wybrałem odpowiednią warstwę dla piramidy testowej (jednostka priorytetowa)
  • [ ] Chciałem oprócz szczęśliwego scenariusza przypadki graniczne i błędy
  • [ ] Sprawdziłem, że każdy test zawiera znaczące stwierdzenie
  • [ ] Powiedziałem AI, co kod powinien zrobić, a nie co robi
  • [ ] Skupiłem się na rzeczywistych ścieżkach ryzyka, a nie na liczbie ubezpieczeń
  • [ ] Użyłem stabilnego identyfikatora w testach interfejsu użytkownika, nie wiązałem się z tekstem