TDD w dobie AI

0

Ej, tak się zastanawiam czy w dobie AI TDD ma jeszcze sens? Bo czy nie lepiej najpierw napisać kod a potem kazać jakiemuś czatowi wygenerować do tego testy i potem je ewentualnie poprawić jeszcze niż samemu wedle TDD najpierw klepać testy i potem kod?

5

A nie lepiej żeby AI wygenerowało zarówno kod jak i testy?
AIDSD

0
opiszon napisał(a):

A nie lepiej żeby AI wygenerowało zarówno kod jak i testy?
AIDSD

Prompt do samych testów jest łatwiejszy niż do logiki biznesowej.

0

No dobra, tylko, że udostępniasz codebase dostawcy AI. Póki tworzysz sam to ok, ale kod firmy to tak średnio bym powiedział.

1
Nofenak napisał(a):
opiszon napisał(a):

A nie lepiej żeby AI wygenerowało zarówno kod jak i testy?
AIDSD

Prompt do samych testów jest łatwiejszy niż do logiki biznesowej.

Przecież AI musi wiedzieć co testuje. Chyba że robisz tam Ctrl c i Ctrl v kodu który napisałeś. Ale powiem ci ze w dużych firmach to nie przejdzie xD

3
Nofenak napisał(a):

Ej, tak się zastanawiam czy w dobie AI TDD ma jeszcze sens? Bo czy nie lepiej najpierw napisać kod a potem kazać jakiemuś czatowi wygenerować do tego testy i potem je ewentualnie poprawić jeszcze niż samemu wedle TDD najpierw klepać testy i potem kod?

A skąd będziesz mieć pewność, że AI wygeneruje w 100% poprawny kod i poprawne testy?

Być może AI wkrótce będzie takie mądre, że można będzie je zostawić bez opieki. Ale chyba jeszcze nie na tym etapie.

Poza tym, jeśli chcemy przekazywać komputerowi pełne kompetencje programistyczne, to może przydałby się bardziej ścisły język programowania, gdzie wiele potencjalnych błędów wyłapie już kompilator (Rust idzie w tę stronę). Wtedy AI sobie coś wyhalucynuje, ale kompilator będzie miał to pod kontrolą.

6

W dobie AI TDD ma sens bardziej, niż kiedykolwiek.

Po pierwsze - AI radzi sobie dużo lepiej, jak widzi testy.
Po drugie - zawsze największym problemem przy developmencie jest zrozumienie, co tak naprawdę chcemy napisać. Testy w tym pomagają, dzięki czemu to nie AI za nas decyduje.

4

w ogóle z dwojga skrajności, to już rozsądniej byłoby, gdyby programista pisał tylko testy, a AI implementację, niż odwrotnie.

Pisanie testów to jakaś forma weryfikacji. Testy to jest po prostu specyfikacja tego, co ma się stać. I nawet jak AI by pisało implementację, to testy przynajmniej zweryfikują, czy to działa.

A jak programista napisze implementację, to jak ją zweryfikuje, jeśli AI mu wypluje testy, które być może będą testować złe założenia?

np. teraz zrobiłem eksperyment i napisałem silnię z błędem i kazałem ChatGPT dopisać testy:

dopisz testy do tego:
function factorial(x) {
return x == 1? 1:
return x * factorial(x - 2);
}

i napisał testy do mojej błędnej implementacji (a nie do prawdziwej silni):

function factorial(x) {
    return x == 1 || x == 0 ? 1 :
           x * factorial(x - 2);
}

// Test cases

 function runTests() {
    let testResults = [];

    testResults.push(testCase(factorial(0), 1, "Test case for x = 0"));
    testResults.push(testCase(factorial(1), 1, "Test case for x = 1"));
    testResults.push(testCase(factorial(2), 2, "Test case for x = 2"));
    testResults.push(testCase(factorial(3), 3, "Test case for x = 3"));
    testResults.push(testCase(factorial(4), 8, "Test case for x = 4"));
    testResults.push(testCase(factorial(5), 15, "Test case for x = 5"));
    testResults.push(testCase(factorial(6), 48, "Test case for x = 6"));
    testResults.push(testCase(factorial(7), 105, "Test case for x = 7"));

    return testResults;
}
0
Nofenak napisał(a):

Ej, tak się zastanawiam czy w dobie AI TDD ma jeszcze sens? Bo czy nie lepiej najpierw napisać kod a potem kazać jakiemuś czatowi wygenerować do tego testy i potem je ewentualnie poprawić jeszcze niż samemu wedle TDD najpierw klepać testy i potem kod?

Do TDD to bardziej w formie konwersacji bym używał, aniżeli do pisania testów do gotowego kodu, albo kodu pod testy.
np. https://chatgpt.com/share/a3e1474c-82b4-4931-a976-be89ca869e5f

Taka forma daje możliwość śledzenia zmian i w jakimś stopniu reagowania i korygowania w trakcie. Dzięki temu, że operuje na mniejszych przyrostach można zrozumieć co się dzieje i zareagować.

2

Celem TDD jest przede wszystkim ewolucja do najczytelniejszej wersji kodu i dokładne zrozumienie problemu. Testy to wyłącznie cel drugorzędny.

Mam wrażenie, że autor myli TDD z klepaniem testów.

Co do AI, zgadzam się, że lepiej by pisała tylko kod, a człowiek testy.

1

O promptach do AI można myśleć jak o innym języku programowania, tylko trochę wyższego poziomu.

Można sobie wyobrazić kompilator ./chat-gpt, i source-code pisany w plikach main.gpt, którego kodem źródłowym mogłaby być treść:

napisz grę w kółko i krzyżyk, konsolową, na dwóch graczy

Zapisujesz to jako main.gpt, kompilujesz ./chat-gpt, i dostajesz binarkę do uruchomienia. Czy taki program powinien mieć testy, np. takie napisane w TDD? Podejdźmy do tego zdroworozskądkowo - po co są testy? Po to żeby dało się refaktorować i wprowadzać zmiany w oprogramowaniu, wiedząc że nic innego się nie zepsuło. Wyobraźmy sobie program napisany w języku ChatGPT który składa się z 100 plików, po 50 linijek każdy, i chcemy wprowadzić w nim poprawkę. Wprowadzamy zmianę, i odpalamy program. Jak często po takiej zmianie mamy bugi? Jeśli nigdy, to testy nie są potrzebne. Ale jesli jednak czasem są, program robi nie to co powinien, to widocznie wprowadziliśmy zmianę z defektem, i musimy jakoś ją znaleźć. Jeśli ChatGPT sam umie ją znaleźć, i pokazać - super. Jeśli kompiluje program i daje nam go z defektem, wtedy JAKIŚ sposób na trzymanie programu w ryzkach jest potrzebny, np. testy.

0

W dobie AI i TDD mozna napisac testy a pozniej kazac AI napisac kod ktory przejdzie te testy =)

2

Ja bym w ogóle pokusił się o stwierdzenie, że testy to jest forma formalizacji wymagań biznesowych :3, a kod to tylko przetworzenie danych w taki sposób, by przez te wymagania podane dane przeszły :3

0

Podsumowując: TDD wymyśliło GANy zanim to było modne tyle że na biologicznym materiale. W sumie praktycznie.

2

Bo czy nie lepiej najpierw napisać kod a potem kazać jakiemuś czatowi wygenerować do tego testy

A skąd to AI będzie wiedziało co kod ma robić? Bo z kodu, to może jedynie wywnioskować co on robi, a to niekoniecznie jest to samo...

0
piotrpo napisał(a):

A skąd to AI będzie wiedziało co kod ma robić? Bo z kodu, to może jedynie wywnioskować co on robi, a to niekoniecznie jest to samo...

Trochę jak z odwrotnością doboru naturalnego - dobór robi błędy a warunki zewnętrzne decydują które są istotne. Tutaj wiemy co kod robi a klientowi AI wmówi że tak ma być.

0

Ale pytanie, czy robimy TDD, piszemy testy z sensem, żeby kod robił to co chcemy, czy ktoś nam kazał "robić TDD", które sprowadza się do wymagania iluś tam % pokrycia kodu testami. Aplikacja nie działa, ale testy na zielono.

0
Ziemiak napisał(a):

W dobie AI i TDD mozna napisac testy a pozniej kazac AI napisac kod ktory przejdzie te testy =)

skubany, myślałem że wygeneruje mi jakąś drabinkę ifów...

napisz kod który przejdzie te testy

test1() {
assertEquals(1, mysteryFn(1));
}

test2() {
assertEquals(1, mysteryFn(2));
}

test3() {
assertEquals(2, mysteryFn(3));
}

test10() {
assertEquals(55, mysteryFn(10));
}

Copilot:

Zgodnie z testami, które podałeś, wygląda na to, że funkcja mysteryFn oblicza n-ty wyraz ciągu Fibonacciego. Oto kod, który powinien przejść te testy:

JavaScript

function mysteryFn(n) {
if (n <= 2) {
return 1;
} else {
let a = 1;
let b = 1;
for (let i = 3; i <= n; i++) {
let c = a + b;
a = b;
b = c;
}
return b;
}
}
AI-generated code. Review and use carefully. More info on FAQ.
Funkcja mysteryFn zwraca 1 dla n równego 1 lub 2, co jest zgodne z testami test1 i test2. Dla n większego od 2, funkcja oblicza n-ty wyraz ciągu Fibonacciego, co jest zgodne z testami test3 i test10.

Ale jak zmieniłem wynik mysteryFn na fibbonacci(n) - 1 to już zgłupiał i zaczął uprawiać matematykę alternatywną

7

Ale po co jakieś testy?
Myślałem, że AI generuje bezbłędny i idealny kod.

1
LukeJL napisał(a):

Ej, tak się zastanawiam czy w dobie AI TDD ma jeszcze sens? Bo czy nie lepiej najpierw napisać kod a potem kazać jakiemuś czatowi wygenerować do tego testy i potem je ewentualnie poprawić jeszcze niż samemu wedle TDD najpierw klepać testy i potem kod?

A skąd będziesz mieć pewność, że AI wygeneruje w 100% poprawny kod i poprawne testy?

Jeśli mam taką możliwość to używam AI zarówno do generowania kodu głównego jak i testów, nie ma w tym nic złego.
AI to po prostu młody, szybki, pracowity programista i traktuję kod jak wygenerowany przez takiego.
Sprawdzam / robie review / każe robić poprawki, aż jest czytelny i mniej więcej rozumiem jak działa.

0
jarekr000000 napisał(a):
LukeJL napisał(a):

Ej, tak się zastanawiam czy w dobie AI TDD ma jeszcze sens? Bo czy nie lepiej najpierw napisać kod a potem kazać jakiemuś czatowi wygenerować do tego testy i potem je ewentualnie poprawić jeszcze niż samemu wedle TDD najpierw klepać testy i potem kod?

A skąd będziesz mieć pewność, że AI wygeneruje w 100% poprawny kod i poprawne testy?

Jeśli mam taką możliwość to używam AI zarówno do generowania kodu głównego jak i testów, nie ma w tym nic złego.
AI to po prostu młody, szybki, pracowity programista i traktuję kod jak wygenerowany przez takiego.
Sprawdzam / robie review / każe robić poprawki, aż jest czytelny i mniej więcej rozumiem jak działa.

A jakich narzędzi AI używasz?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.