Jednostka 10 / 11

Ryzyko fałszywego zaufania, jakość testów i testowanie mutacji: testy testowe

Zyski:

  • Umiejętność rozpoznania trzech twarzy pseudozaufania (nieasertywnego, asertywnego, trywialnego asertywności) i zastosowania antidotów
  • Umiejętność wykorzystania testów mutacji i wyniku mutacji jako dokładniejszej miary jakości niż procent pokrycia za pomocą narzędzia lub ręki
  • Możliwość pozycjonowania sztucznej inteligencji jako czerwonej drużyny przeciwko testowaniu i polowania na luki w testowaniu bez wpadania w pułapkę pochwał

Sercem tego modułu jest powtarzające się ostrzeżenie: świecący na zielono panel testowy nie jest dowodem jakości. Jeśli testy dają ci pewność, musisz wiedzieć, czy ta pewność jest prawdziwa, czy fałszywa. W dobie sztucznej inteligencji (AI) to pytanie jest ważniejsze niż kiedykolwiek wcześniej, ponieważ sztuczna inteligencja jest biegła w tworzeniu płynnych, gładko wyglądających, ale pustych testów. Fałszywa pewność — wiara, że ​​oprogramowanie jest poprawne, ponieważ testy są zielone, podczas gdy w rzeczywistości testy niczego nie weryfikują — jest najniebezpieczniejszą rzeczą, jaka może przytrafić się zespołowi ds. kontroli jakości; ponieważ nie ukrywa, że ​​błędów nie ma, ale że ich nie widać. Ta jednostka łączy filozofię walidacji całego modułu w jedną dyscyplinę: testowanie testów.

Złoty standard pomiaru jakości testów: testowanie mutacji

Najskuteczniejszym sposobem zrozumienia, czy test faktycznie chroni, czy nie, jest testowanie mutacji (testowanie mutacji - technika, która powoduje celowe małe zniekształcenia/mutacje w kodzie źródłowym i mierzy, czy testy wykrywają te zniekształcenia). Logika jest prosta: jeśli celowo złamiesz kod (zmieniając + w -, > w >=, prawda w fałsz), dobry zestaw testów powinien wychwycić to uszkodzenie i zmienić kolor na czerwony. Jeśli tak nie jest, zaburzenie to jest mutantem, który przetrwał — więc Twoje testy w rzeczywistości nie zachowują tego zachowania.

Wynik mutacji = mutacja zabita / całkowita mutacja. Pakiet z 90% pokryciem linii może mieć wynik mutacji 40%; Oznacza to, że linie działają, ale zachowanie nie zostało zweryfikowane. Wynik mutacji jest znacznie bardziej uczciwą miarą jakości niż procent pokrycia.

Wskazówka: istnieją narzędzia do automatycznej mutacji (PIT/Pitest dla Java, Stryker dla JavaScript/TypeScript, Stryker.NET dla .NET, mutmut dla Pythona). Automatycznie generują i testują setki mutacji. Jeśli nie masz narzędzia, nawet ręczna metoda „testu złamania kodu” jest nieoceniona w przypadku krytycznych funkcji.

Trzy oblicza pseudozaufania i jego antidotum

Formularz pseudozaufania

objaw

antidotum

Testuj bez potwierdzenia

Kod działa, nic nie jest sprawdzane

Prawdziwe stwierdzenie w każdym teście; test z mutacją

test samopotwierdzający

Oczekiwano = wynik kodu

Oblicz wartość oczekiwaną niezależnie

Trywialne twierdzenie

„nie null”, „zwrócono 200”

Zweryfikuj regułę biznesową/rzeczywisty wynik

Błąd o dużym zasięgu

90% linii, niska ochrona

Spójrz na wynik mutacji

Krucha tolerancja testu

„Znowu utknąłem, pass”

Pierwotna przyczyna + testowanie deterministyczne

Wykorzystanie sztucznej inteligencji jako „czerwonej drużyny”

Sztuczna inteligencja może zarówno generować pseudozaufanie, jak i być potężnym sojusznikiem w jego ściganiu. Użyj sztucznej inteligencji jako czerwonej drużyny przeciwko własnym testom: poproś „napisz kod, który przejdzie te testy, ale jest błędny” lub „znajdź subwersję, która oszuka te testy”. Jeśli sztuczna inteligencja znajdzie luki w twoich testach, luki te stanowią realne ryzyko.

Uwaga: nie pytaj sztucznej inteligencji „Czy jakość mojego testu jest dobra?” i potraktuj odpowiedź „tak, świetnie” jako pewność. AI jest zazwyczaj miła. Zamiast tego rzuć wyzwanie sztucznej inteligencji, aby wykonała konkretne zadanie: „wyprodukuj błąd, który przejdzie te testy”. Jeśli może to wyprodukować, twoje testy są ślepe na ten błąd.

Równoważne mutacje i granice wyniku

Testowanie mutacji jest potężne, ale ma pewien haczyk: niektóre mutacje w ogóle nie zmieniają zachowania kodu. Nazywa się je mutacjami równoważnymi (równoważny mutant — uszkodzony kod, mutacja, która daje dokładnie taki sam wynik jak oryginał). Na przykład zmiana wartości początkowej zmiennej, która nigdy nie jest używana, nie ma wpływu na wynik; Żaden test nie może i nie powinien tego wykryć. Dlatego uzyskanie 100% wyniku mutacji jest często nieosiągalne w praktyce i nie jest celem. Ręczne usuwanie równoważnych mutacji jest pracochłonne; Nie czytaj więc wyniku mutacji jako bezwzględnego wyniku egzaminu, ale jako uczciwy wskaźnik „czy moje testy naprawdę chronią?”

Praktyczne podejście jest takie: zamiast ciągłego przeprowadzania testów mutacji w całej bazie kodu, uruchom je w modułach, które zawierają największe ryzyko i najbardziej złożone reguły biznesowe. Zbadaj po kolei mutacje, które przetrwały w tych modułach; Jeżeli jest to realna luka, dodaj test; jeśli jest to mutacja równoważna, zaznacz ją uzasadnieniem i zalicz. Sztuczna inteligencja może przeprowadzić wstępną analizę przesiewową, oceniając, czy mutacja, która przeżyła, jest równoważna; ale ostateczną decyzję podejmujesz Ty, który wiesz, co robi kod.

Uwaga: Testowanie mutacji jest kosztowne obliczeniowo (wszystkie odpowiednie testy są przeprowadzane ponownie dla każdej mutacji). Dlatego powszechną i rozsądną strategią jest zaplanowanie tego jako cotygodniowej lub przedpremierowej szczegółowej kontroli kluczowych modułów, a nie każdego połączenia.

Słaba zachęta/silna zachęta

Słabe: „Czy moje testy są wystarczające?”
Silny: „Działaj jako czerwony zespół dla tej funkcji i zestawu testów. (1) Wygeneruj 8 mutacji w kodzie, które można zabić (podstawienie operatora, przesunięcie granicy, odwrócenie warunku, podstawienie wartości zwracanej). (2) Dla każdej mutacji wskaż, który z istniejących testów ją wykryje, a który NIE. (3) Dla każdej mutacji, która przetrwa, napisz nowy test, który ją zabije. (4) Pokaż także, czy możesz stworzyć przykładowy kod, który przejdzie wszystkie te testy, ale narusza regułę biznesową. Kod+testy: [wklej]"

Potężny monit; Pozycjonuje sztuczną inteligencję jako egzaminatora łamiącego testy, a nie maszynę do pochwał.

Cztery szablony do kopiowania

1) Ręczna kontrola mutacji:

Wygeneruj 8 znaczących mutacji (drobnych, celowych zakłóceń) dla tego kodu: podstawienie operatora arytmetycznego, granica porównania (> vs >=), inwersja logiczna, powrót/stałe podstawienie, pominięcie warunku. Dla każdej mutacji należy przewidzieć, który z dostępnych testów ją wykryje, czy nie. Kod+testy: [wklej]

2) Zabicie pozostałej mutacji:

Poniższy raport z testu mutacji zawiera mutacje, które przeżyły (niezłapane): [lista/raport]. Dla każdego napisz minimalny test, który zabije tę mutację (po złamaniu w ten sposób kod zmieni kolor na czerwony). Skomentuj, jakie zachowanie potwierdza test.

3) Drużyna czerwona — test krwi:

Czy możesz napisać kod, który przechodzi WSZYSTKIE poniższe testy, ale narusza następującą regułę biznesową: [reguła biznesowa]. Jeśli tak, jaka luka w tych testach na to pozwala? Dodaj test, który zamknie tę lukę. Testy: [wklej]

4) Kontrola jakości testu:

Sprawdź ten zestaw testów pod kątem jakości. Zaznacz przy każdym teście: - Czy istnieje prawdziwe potwierdzenie, czy jest to rekwizyt? - Czy oczekiwana wartość jest niezależna i wynika z kodu? - Czy weryfikuje regułę biznesową, czy coś trywialnego? Na koniec podaj szacunkowy „prawdziwy wynik potwierdzenia” i 3 najsłabsze testy. Testy: [wklej]

trzy mini etui

Przypadek 1 — pokrycie 92%, wynik mutacji 38%. Jeden zespół polegał na dużym zasięgu. Kiedy przeprowadzono testy mutacji przy użyciu preparatu Stryker, wynik wyniósł 38%: większość powstałych mutacji przeżyła. Był to dowód na to, że testy nie uruchamiały linii i nie sprawdzały zachowania. Zespół zainwestował trzy tygodnie w testowanie jakości; Wynik mutacji wzrósł do 81%, a te wzmocnione testy w następnej wersji wykryły dwa rzeczywiste błędy w obliczeniach.

Przypadek 2 – AI oszukała test. W przypadku szablonu „czerwony zespół” ekspert poprosił sztuczną inteligencję o kod, który przeszedł istniejące testy, ale łamał zasadę rabatu. Sztuczna inteligencja napisała kod, który zawsze zwracał zerowy rabat – a wszystkie testy pozostały zielone, bo żadne testy nie sprawdzały faktycznej wartości rabatu. Widoczna luka, dodano prawdziwe stwierdzenia.

Przypadek 3 — Pułapka pochwał. Młodszy tester zapytał sztuczną inteligencję: „Czy moje testy są dobre?” i odetchnął z ulgą, słysząc odpowiedź: „Bardzo wyczerpująca”. Jego starszy kolega zlecił audyt tych samych testów przy użyciu szablonu „audyt jakości testów”; Okazało się, że 12 z 20 testów to wystrój (bez asertywności i śmieci). Właściwe pytanie przyniosło właściwą odpowiedź.

Typowe błędy

  • Mylenie zakresu z jakością. Opieranie się na dużym pokryciu wierszy i w ogóle nie patrzenie na wynik mutacji.
  • Ufając pochwałom AI. Pytanie: „Czy Twoje testy są dobre?” i uznanie pozytywnej odpowiedzi za pewność.
  • Wyprowadzanie oczekiwanej wartości z kodu. Testy samoweryfikujące potwierdzające błędny kod.
  • Zadowalaj się trywialnymi twierdzeniami. Kontrole, które nie potwierdzają rzeczywistej reguły, takie jak „nie null”, „zwrócono 200”.
  • Ignorowanie pozostałych mutacji. Ignorowanie tego, czego nie ujęto w raporcie mutacji.
  • Nawet nie próbuję ręcznie mutować krytycznego kodu. Pominięcie kroku „złam kod i przetestuj”, jeśli narzędzie nie jest dostępne.

Podsumowując

Pseudo-zaufanie to przekonanie, że oprogramowanie jest poprawne, ponieważ testy są zielone; natomiast badania mogą niczego nie potwierdzić. Złotym standardem pomiaru tego jest testowanie mutacji: celowe łamanie kodu i sprawdzanie, czy testy go wyłapią. Wynik mutacji jest znacznie bardziej uczciwą miarą jakości niż procent pokrycia. Sztuczna inteligencja zarówno wytwarza pseudozaufanie, jak i staje się potężną czerwoną drużyną w jego tropieniu — poproś „wyprodukuj błąd, który przejdzie te testy”. Przetestuj swoje testy: stwierdzenie prawdy, niezależna wartość oczekiwana, weryfikacja reguły biznesowej i zabite mutacje.

Zadanie aplikacji

Zaimportuj funkcję zawierającą regułę biznesową i jej testy z własnego projektu. Jeśli to możliwe, uruchom narzędzie do mutacji (Stryker/Pitest/mutmut) i zmierz wynik mutacji; Jeśli nie ma narzędzia, wygeneruj co najmniej 8 mutacji za pomocą szablonu „ręcznej kontroli mutacji” i wypróbuj je ręcznie. Dla każdej mutacji, która przeżyła, napisz nowy test z szablonem „zabij mutację, która przeżyła”. Na koniec, korzystając ze wzorca „czerwonego zespołu”, sprawdź, czy sztuczna inteligencja może wygenerować kod, który oszuka Twoje testy. Zgłoś swój wynik mutacji początkowej i końcowej (lub współczynnik złapanych/całkowitych mutacji).

lista kontrolna

  • [ ] Oceniłem jakość testu na podstawie wyniku mutacji, a nie pokrycia.
  • [ ] Przeprowadziłem testy mutacji (za pomocą narzędzia lub ręcznie) dla krytycznego kodu.
  • [ ] Napisałem nowe testy dla każdej mutacji, która przeżyła.
  • [ ] Używałem sztucznej inteligencji jako czerwonej drużyny i szukałem luk w moich testach.
  • [ ] Pochwały AI „twoje testy są dobre” nie traktowałem jako zapewnienia.
  • [ ] Sprawdziłem, czy każdy test weryfikuje rzeczywiste potwierdzenie, niezależną wartość oczekiwaną i regułę biznesową.