• Publiceer datum
    November 26, 2024
  • Delen

Het creëren van goed ontworpen en correcte code is het doel van elke ontwikkelaar. Een methodologie die hierin opvalt, is Test-driven development (TDD). Hoewel TDD uw code niet ontwerpt of voor u schrijft, is het een methodologie in softwareontwikkeling waarmee u snel feedback krijgt op ontwerpbeslissingen in een iteratieve ontwikkelingscyclus. 

Of unit tests voor of na het coderen worden geschreven of helemaal geen tests worden geschreven, hangt af van de keuze van de ontwikkelaar. Het is duidelijk dat het nooit schrijven van tests kritieke situaties in productie veroorzaakt. Als de ontwikkelaar geluk heeft, ontdekt hij fouten tijdens de handmatige testfase. 

Het schrijven van tests nadat de code is voltooid, is beter dan helemaal geen tests. De meeste ontwikkelaars, waaronder wij, passen de code first-benadering direct toe en schrijven dan tests. Desalniettemin is de geschreven code niet beter. Er zullen enkele functionele fouten aanwezig zijn als we de testcase vergeten. Het schrijven van falende testcases voor elk stukje code en vervolgens de code toevoegen om die test te laten slagen door de TDD-cyclus te volgen, is veel beter.

Momenteel bespreken we hoe we Generative AI kunnen gebruiken om ons werk meer geautomatiseerd te maken. In dit werk introduceren we een nieuw experiment geïnspireerd door Blog van Allen HeltonWe schrijven verschillende testcases voor het project en vragen ChatGPT vervolgens om de testgerelateerde code te genereren. 

Generatieve AI voor test-first-ontwikkeling 

Gezien de kans op menselijke fouten bij handmatig testen, rijst de vraag: Waarom automatiseren we TDD niet met behulp van Generative AI? Generative AI kan een transformatieve rol spelen in TDD door de creatie van unit tests en de bijbehorende code te automatiseren. Hier is een voorgestelde workflow:

  1. Tests geschreven door ontwikkelaars: ontwikkelaars beginnen met het schrijven van de eerste unittests, waarin ze de gewenste uitkomsten voor hun code specificeren.
  2. Code gegenereerd door AI: Generative AI leest deze unittests en produceert de benodigde code om ze te doorstaan. Als de code succesvol wordt uitgevoerd, wordt deze opgeslagen op de schijf. Als dat niet het geval is, genereert de AI een foutrapport en probeert de juiste code opnieuw te produceren, waardoor een lus ontstaat totdat de tests slagen. Door AI op deze manier te integreren, kunnen ontwikkelaars ervoor zorgen dat hun code grondig wordt getest en gevalideerd, waardoor het risico op fouten wordt geminimaliseerd.
Ekran Resmi 2024-11-04 13.29.43.png

Voordelen van het gebruik van generatieve AI in TDD

Het automatiseren van het codegeneratie- en testproces kan ontwikkelingscycli aanzienlijk versnellen. Ook het verminderen van de kans op menselijke fouten in testcases en het schrijven van code. Terwijl u dit doet, zorgt u ervoor dat alle tests uitgebreid en consistent worden behandeld en schaalt u het ontwikkelingsproces eenvoudig op zonder de handmatige werklast te vergroten.

Potentiële uitdagingen en oplossingen

Hoewel het integreren van Generative AI in TDD talloze voordelen biedt, kent het ook uitdagingen. De initiële installatie van AI-systemen voor TDD kan soms complex en tijdrovend zijn. Ontwikkelaars hebben mogelijk training nodig om AI-tools effectief te gebruiken en te vertrouwen. Maar zelfs als de ontwikkelaars er klaar voor zijn, kan AI moeite hebben met unieke of edge cases die niet goed vertegenwoordigd zijn in de trainingsdata, waardoor de gevraagde scenario's in de war kunnen raken. Generative AI reageert met fatsoenlijke code, maar het is niet de beste keuze. Omdat code nog geen feedbackmechanisme toepast. Om geweldige code te produceren, moeten we feedbackmechanismen toepassen op AI, zoals de codebeoordelingsaanpak van de ontwikkelaars. We kunnen AI combineren met menselijk toezicht om complexe scenario's aan te kunnen, althans voor nu.. :)

Feedback Toegepaste generatieve AI in TDD

Ekran Resmi 2024-11-04 13.31.52.png

Feedbackmechanisme

Om het proces verder te verfijnen, kan een feedbackmechanisme worden geïntroduceerd. Ontwikkelaars schrijven de unittests en een developer agent genereert de code. Een nieuwe laag van controle wordt toegevoegd met een code reviewer agent, die de code beoordeelt en feedback geeft aan de developer agent.

Iteratieve verbetering

De developer agent herziet de code op basis van de feedback van de reviewer agent en dient deze opnieuw in voor review. Dit iteratieve proces gaat door totdat de code de review succesvol doorstaat.

Laatste testen

Zodra de code is goedgekeurd door de reviewer agent, worden unit tests uitgevoerd. Als ze slagen, wordt de code opgeslagen. Als ze mislukken, wordt er een foutrapport gegenereerd en gaat het proces terug naar codegeneratie.

In essentie ziet de workflow er als volgt uit:

  1. De ontwikkelaar schrijft de unit tests.ev
  2. De AI leest deze tests en genereert de benodigde code.
  3. Als de tests succesvol zijn uitgevoerd, wordt de code opgeslagen. Als dat niet het geval is, wordt er een foutrapport gegenereerd en probeert de AI de code in een lus te corrigeren.
  4. Deze initiële automatisering kan code opleveren die gevoelig is voor fouten. Hierbij komt het feedbackmechanisme om de hoek kijken.
  5. Ontwikkelaars schrijven de unittests en de ontwikkelaarsagent genereert de vereiste code en methoden.
  6. Een codereviewer controleert de code en stuurt feedback naar de developeragent.
  7. De ontwikkelaarsagent verfijnt de code op basis van de feedback en dient deze opnieuw in ter beoordeling.
  8. Deze cyclus gaat door totdat de codebeoordelaar de code goedkeurt.
  9. Na goedkeuring worden de unittests uitgevoerd. Als dit lukt, wordt de code opgeslagen. Als dit niet lukt, wordt er een foutrapport gegenereerd en gaat de lus verder.

Door een feedbackmechanisme in te bouwen, verbetert de kwaliteit van de gegenereerde code aanzienlijk. Zo wordt gegarandeerd dat de code voldoet aan de vereiste normen en alle tests met succes doorstaat.

Conclusie

Het integreren van Generative AI in Test-Driven Development (TDD) heeft het potentieel om softwareontwikkeling te revolutioneren. Door de generatie van unittests en bijbehorende code te automatiseren, kunnen ontwikkelaars een hogere codekwaliteit garanderen, fouten verminderen en hun workflow stroomlijnen. Hoewel er uitdagingen zijn die overwonnen moeten worden, wegen de voordelen ruimschoots op tegen de initiële hindernissen, wat dit een veelbelovende aanpak maakt voor de toekomst van coderen. U kunt onze Coder-AI project als u geïnteresseerd bent in het ondersteunen van programmering met behulp van generatieve AI. 

Toekomstige richtingen

Er zijn drie zaken die we op basis van deze aanpak willen uitbouwen:

  • Uitbreiding van taalondersteuning: Hoewel we ons hebben gericht op Java, kan deze methodologie worden uitgebreid naar andere talen, zoals Python, JavaScript en meer.

  • Geautomatiseerde testgeneratie: We kunnen generatieve AI de tests laten schrijven op basis van de door ontwikkelaars aangeleverde, hoogwaardige vereisten, in plaats van dat we handmatig tests moeten schrijven. 

  • Uitbreiding van het Agentic AI-team: Naast een eenvoudige codereviewer zouden we meer gespecialiseerde agents kunnen introduceren, zoals een QA-agent voor het testen van edge cases, een prestatieagent voor het optimaliseren van de codeprestaties, enzovoort.

Wij raden alle softwareontwikkelaars aan om hun tijd te besteden aan het schrijven van robuustere en nauwkeurigere testcases en vervolgens te profiteren van de kracht van generatieve AI om code van hoge kwaliteit te produceren.