Twoje AI pisze testy, które nigdy nie mogą zawieść

Prosisz AI o napisanie testów. Otrzymujesz dwanaście zielonych testów. Twoje CI przechodzi pomyślnie. Łączysz kod. Trzy dni później błąd trafia na produkcję. Patrzysz na testy. Przeszły, ale niczego nie przetestowały.

Zielony test to nie dowód. To hipoteza. AI pisze hipotezy, które nigdy nie zawodzą.

Spójrz na tę funkcję:

func Discount(total int) int {
    if total > 100 {
        return total - 10
    }
    return total
}

AI może napisać taki test:

func TestDiscount(t *testing.T) {
    got := Discount(150)
    if got < 0 {
        t.Errorf("result should not be negative")
    }
}

Ten test jest zielony. Uruchamia kod, więc pokrycie wygląda dobrze. Ale test sprawdza tylko, czy wynik jest mniejszy od zera. Jeśli zmienisz rabat w błąd matematyczny, test nadal pozostanie zielony. Nie sprawdza on zachowania. Sprawdza jedynie, czy „świecą się światła”.

To pułapka. Pokrycie liczy linie, których dotykasz. Nie liczy jednak asercji, które mają znaczenie. Raport o 90% pokryciu może ukrywać wadliwy kod.

AI szuka najkrótszej drogi do zielonego światła. Wybiera słabe asercje i mocki, które niczego nie testują.

Aby to naprawić, zastosuj jedną zasadę: sprawdź, czy test wie, jak zawieść.

Zmień swój kod celowo. Jeśli test pozostaje zielony, jest bezużyteczny. Wyrzuć go.

Prawdziwy test wygląda tak:

func TestDiscount(t *testing.T) {
    if got := Discount(150); got != 140 {
        t.Errorf("Discount(150) = %d, want 140", got)
    }
}

Jeśli zepsujesz logikę, ten test natychmiast zaświeci się na czerwono. Złapie to.

Nie możesz robić tego ręcznie dla każdego testu. Zamiast tego użyj testowania mutacyjnego (mutation testing). Narzędzia takie jak Gremlins w Go wprowadzają małe zmiany w twoim kodzie. Sprawdzają, czy twoje testy wykryją te zmiany.

Jeśli zmiana nie powoduje błędu testu, masz lukę w swoim zestawie testów.

Używam tego w przypadku kodu generowanego przez AI. Nie pozwalam AI uznać pracy za zakończoną. Stosuję mechanizm bramki (gate). Narzędzie mutuje kod. Jeśli test pozostaje zielony, AI musi go napisać od nowa. To nie AI decyduje, czy test jest dobry. Decyduje mutacja.

Żaden test AI nie trafia do mojej bazy kodu bez udowodnienia, że potrafi zawieść. Test, który nie może zawieść, jest gorszy niż brak testu. Brakujący test jest oczywisty. Fałszywy test jest niebezpieczny.

Przestań ufać zielonym światłom. Test jest wart tylko tyle, ile czerwieni jest w stanie wygenerować.

Source: https://dev.to/ohugonnot/your-ai-writes-tests-that-can-never-fail-3i57

Opcjonalna społeczność edukacyjna: https://t.me/GyaanSetuAi