Przejdź do głównej zawartości

Wzorce testowania

Właśnie skończyłeś implementację serwisu przetwarzania płatności. Działa w twoich testach ręcznych, ale nie masz automatycznych testów. Pisanie testów dla 15 funkcji obejmujących tworzenie płatności, walidację, zwroty i obsługę webhooków wydaje się zajmować więcej czasu niż napisanie samego serwisu. Więc wysyłasz go bez testów, obiecując sobie, że dodasz je później. Dwa tygodnie później refaktoryzacja psuje logikę zwrotów i nikt tego nie wyłapuje, dopóki klient nie zgłosi problemu.

AI jest wyjątkowo dobre w pisaniu testów. Może przeanalizować twój kod, zidentyfikować ważne ścieżki i przypadki brzegowe, i wygenerować kompleksowy zestaw testów w kilka minut. Kluczem jest wiedza, jak promptować o testy, które faktycznie wyłapują błędy, a nie testy, które po prostu osiągają liczby pokrycia.

  • Workflow generowania kompleksowych zestawów testów z istniejącego kodu
  • Wzorzec TDD z AI (najpierw pisz testy, potem implementację)
  • Techniki dodawania testów do nietestowanego kodu legacy
  • Gotowe prompty do skopiowania, które produkują wysokiej jakości, łatwe w utrzymaniu testy

Najpotężniejszy wzorzec testowania z AI: najpierw napisz testy, potem pozwól agentowi napisać implementację i iterować, aż testy przejdą.

Dlaczego to działa: AI pisze testy na podstawie twojej specyfikacji oczekiwanego zachowania. Potem pisze implementację, która przechodzi te testy. Jeśli test nie przechodzi, implementacja jest błędna (nie test), więc AI naprawia implementację. To zapobiega częstemu problemowi “naprawiania” testów przez AI, aby pasowały do wadliwego kodu.

Dla nietestowanego kodu, gdy nie jesteś pewien, co robi:

Testy charakteryzujące są niezbędne przed refaktoryzacją kodu legacy. Mówią ci, kiedy refaktoryzacja zmienia zachowanie, nawet jeśli oryginalne zachowanie nie było udokumentowane.

Jeden z najpraktyczniejszych wzorców: przyrostowe rozszerzanie pokrycia testami poprzez analizę tego, co nie jest testowane.

Wykorzystanie nieprzechodzących testów z błędów produkcyjnych

Dział zatytułowany „Wykorzystanie nieprzechodzących testów z błędów produkcyjnych”

Gdy napotkasz błąd produkcyjny, pierwszym krokiem powinno być napisanie testu, który go odtwarza:

We discovered a bug: orders with decimal quantities (e.g., 2.5 units)
cause the total calculation to return NaN.
Before fixing the bug:
1. Write a failing test that demonstrates the exact bug
2. The test should pass valid decimal quantities and assert the correct total
3. Run the test to confirm it fails with the current code
Then fix the bug and confirm the test passes.
This ensures the fix actually addresses the issue and prevents regression.

Zamiast pisać inline obiekty testowe w każdym teście, stwórz funkcje fabryczne:

AI pisze testy, które tylko potwierdzają implementację. Jeśli test wywołuje funkcję i sprawdza, czy zwracana wartość jest tym, co funkcja zwraca, nie testuje niczego. Określ oczekiwane zachowanie jawnie w prompcie: “should return 42 when given inputs X and Y.”

Testy przechodzą, ale nie wyłapują prawdziwych błędów. Testy zbyt skupiają się na szczęśliwych ścieżkach. Zawsze jawnie żądaj testowania ścieżek błędów, przypadków brzegowych i warunków granicznych.

AI “naprawia” test zamiast kodu. Wyraźnie powiedz: “The test represents the correct behavior. The implementation is wrong. Fix the implementation.”

Wygenerowane testy są niestabilne. Testy zależne od czasu, losowych wartości lub stanu zewnętrznego są nierzetelne. Dodaj do swojej reguły testowania: “Never use real timers, random values, or network calls in unit tests. Mock everything.”

Plik testowy staje się zbyt duży. Podziel testy według domeny (testy auth, testy profilu, testy płatności) zamiast mieć jeden monolityczny plik testowy na serwis.