Przejdź do głównej zawartości

Programowanie sterowane testami z pomoca AI

Prosisz AI o zbudowanie rate limitera. Generuje cos, co wyglada poprawnie. Wdrazasz to. Dwa dni pozniej twoje API pada, bo rate limiter nie obsluguje poprawnie wspolbieznych zadan — wyścig warunkow, ktorego AI nigdy nie pomyslalo testowac, bo nigdy mu nie powiedziales, co oznacza “dzialajacy”.

TDD odwraca te dynamike. Gdy piszesz testy pierwsze, AI ma precyzyjna, maszynowo weryfikowalna definicje sukcesu. Nie musi zgadywac, czego chcesz. Uruchamia testy, widzi niepowodzenia i iteruje, az przejda. To pojedyncza technika o najwyzszej dzwigni do uzyskiwania niezawodnych wynikow od asystentow AI do kodowania.

  • Przeplyw pracy do pisania specyfikacji testow jako pierwszych i pozwalania AI implementowac na ich podstawie
  • Prompty do generowania kompleksowych przypadkow testowych z wymagan
  • Strategie radzenia sobie z tendencja AI do oslabienia asercji, zeby testy przechodzily
  • Jasne zrozumienie, kiedy TDD z AI oszczedza czas, a kiedy dodaje narzut

Tradycyjne TDD podąza za cyklem czerwone-zielone-refaktoryzacja. Z AI ten cykl staje sie dramatycznie szybszy, poniewaz AI obsluguje fazy zielona i refaktoryzacji, a ty skupiasz sie na pisaniu sensownych czerwonych testow.

  1. Piszesz test, ktory nie przechodzi, uchwycajacy oczekiwane zachowanie
  2. AI pisze kod, ktory sprawia, ze test przechodzi
  3. AI refaktoryzuje implementacje, utrzymujac testy na zielono
  4. Przegladasz implementacje i piszesz nastepny test

Kluczowe spostrzezenie: test jest twoja specyfikacja. Dobrze napisany test komunikuje zamiar znacznie precyzyjniej niz jakikolwiek prompt w jezyku naturalnym.

Zacznij od zdefiniowania zachowania, ktore chcesz, a nie implementacji. Mozesz napisac test samodzielnie lub wspolpracowac z AI przy generowaniu przypadkow testowych z wymagan — ale musisz przejrzec i zatwierdzic testy, zanim poprosisz o implementacje.

Otworz tryb Agent. Popros Cursor o pomoc w wygenerowaniu przypadkow testowych, a nastepnie przejrzyj je przed poproszeniem o implementacje:

I need to build a rate limiter middleware for our Express API.
Requirements:
- 100 requests per minute per API key
- Returns 429 with a Retry-After header when exceeded
- Tracks limits in Redis
- Handles concurrent requests correctly
Write the test file first at src/middleware/__tests__/rateLimiter.test.ts.
Use our existing test patterns from @src/middleware/__tests__/auth.test.ts.
Do NOT write the implementation yet.

Przejrzyj testy. Dodaj przypadki brzegowe, ktore AI pominelo. Nastepnie:

Good tests. Now implement src/middleware/rateLimiter.ts to make
all tests pass. Run the tests after implementation and fix any
failures.

Cursor uruchomi testy w zintegrowanym terminalu, zobaczy niepowodzenia i bedzie iterowal, az wszystkie przejda.

Gdy testy sa na miejscu, faza implementacji to miejsce, gdzie AI dostarcza najwieksza wartosc. Testy dzialaja jako ciagly sygnal sprzezenia zwrotnego, ktory utrzymuje AI na wlasciwym torze.

Odwolaj sie zarowno do pliku testow, jak i do odpowiedniego istniejacego kodu:

Implement the rate limiter to pass @src/middleware/__tests__/rateLimiter.test.ts.
Reference @src/middleware/auth.ts for our middleware patterns.
Run the tests after each significant change.
If a test fails, read the error carefully and fix the root cause.

Uzyj checkpointow Cursor do zrobienia migawki znanych dobrych stanow. Jesli AI zepsuje cos, co przechodzilo, cofnij do checkpointu zamiast debugowac do przodu.

Najbardziej niebezpieczny tryb awarii w TDD wspomaganym AI to sytuacja, gdy AI modyfikuje twoje testy, zeby przechodzily, zamiast naprawiac implementacje. Zwracaj uwage na te znaki:

  • Asercje staja sie mniej konkretne. expect(result).toBe(429) staje sie expect(result).toBeDefined().
  • Testy sa usuwane. AI usuwa “niestabilne” testy zamiast naprawiac kod.
  • Mocki zastepuja prawdziwe zachowanie. AI mockuje dokladnie to, co chciałes przetestowac.

AI generuje trywialne testy. Jesli twoje prompty testowe sa ogolnikowe (“write tests for this function”), AI napisze testy weryfikujace, ze funkcja istnieje i cos zwraca. Badz konkretny w kwestii zachowan, ktore chcesz przetestowac. Dolacz konkretne przyklady wejsc i wyjsc.

Testy sa zbyt scisle powiazane z implementacja. Jesli twoje testy sprawdzaja wewnetrzne szczegoly implementacji (wywolania prywatnych metod, konkretne struktury danych), AI nie moze swobodnie refaktoryzowac. Pisz testy pod publiczne API i oczekiwane zachowania, nie wewnetrzna mechanike.

Zestaw testow jest zbyt wolny. TDD wspomagane AI dziala najlepiej, gdy testy uruchamiaja sie w sekundach. Jesli pelny zestaw testow trwa 10 minut, AI nie bedzie efektywnie iterowal. Uzyj --testPathPattern lub --grep, aby uruchamiac tylko odpowiednie testy podczas rozwoju.

Piszesz zbyt wiele testow z gory. Zacznij od 3-5 testow pokrywajacych podstawowe zachowanie. Pozwol implementacji ujawnic, ktore przypadki brzegowe sa wazne, a nastepnie dodawaj wiecej testow iteracyjnie. Probowanie napisania 30 testow przed jakakolwiek implementacja prowadzi do paralizy analitycznego.