Eleven
Menu

Diffblue:Artificial Intelligence inzetten voor unit testen

Als ontwikkelaar weet je hoe belangrijk het is om je code te testen voordat je die naar productie stuurt. Het is echter tijdrovend om al die testen te schrijven. Diffblue is een tool die met behulp van artificial intelligence automatische unit tests voor je schrijft. Dit klinkt misschien als een droom voor elke developer, maar is Diffblue echt zo'n goede oplossing? Tijd om de maandelijkse innovatiedag in te zetten om daar dieper in te duiken.

Diffblue zelf geeft al aan dat hun doel (nog) niet is om alle unit tests automatisch te genereren. De door de AI gegenereerde tests moet je vooral zien als regressietests: een check of je code blijft werken zoals het al deed. De automatische testen vinden geen bestaande bugs voor je, maar zouden het wel moeten ontdekken als je nieuwe bugs maakt.

Na een innovatiedag verschillende testen geschreven te hebben met deze tool en het daarna een week gebruikt te hebben tijdens het dagelijkse werk zie ik voor- en nadelen: er is een duidelijk onderscheid tussen het toevoegen van testen aan bestaande code en testen voor nieuwe code.

Testen toevoegen aan nieuwe code

Het voornaamste voordeel tijdens het schrijven van nieuwe testen is dat deze tool de boilerplate voor je doet. Het maakt alle mocks en entiteiten die nodig zijn. Hierdoor kun je je richten op het testen van de daadwerkelijke functionaliteit. Dit maakt de drempel om een test toe te voegen een stuk lager. Met je Intellij plugin zie je in de gutter naast een methode een symbool om direct een test te maken, die je eventueel later kunt verfijnen. De tests die geschreven worden moet je zien als een suggestie: je zult je eigen test data moeten toevoegen en meestal zal je ook de gemaakte unittest moeten herschrijven.

Wat een nadeel is, is dat de testen erg verbose zijn. Voor elke entiteit die je gebruikt worden alle variabele in de test gezet ondanks het feit dat die niet allemaal nodig zijn. Dat maakt het lezen van de testen minder handig. Je zou hiervoor een builder kunnen gebruiken: Diffblue ondersteunt dat. Echter op dit moment is de documentatie op dit onderwerp niet correct (hun eigen voorbeeld werkt niet) en doordat de tool nog nieuw is, is er ook geen informatie te vinden over de juiste configuratie.

Testen toevoegen aan bestaande code

Met Diffblue kun je in een paar uur regressietesten toevoegen aan je complete codebase. Dat deze verbose zijn is voor je bestaande code minder erg want het is nog steeds een stuk beter dan geen testen! Wat het lastiger maakt is dat in de meeste legacy code zonder test coverage vaak wat minder goede code zit en het daardoor minder goed te testen is. Daar loopt Diffblue dan ook op vast. Op oudere stukken spaghetti code kan het vaak maar 20% tot 40% van de methodes testen en zelfs voor dat deel ook niet alle mogelijk paths. Voor de niet geteste methodes wordt wel de opzet van de test gemaakt met daarbij een todo om de test af te maken.

Maar goed, zelfs 20% test coverage is beter dan 0%. Dus als je deze tool gebruikt zou ik zeker deze testen toevoegen. Zelf houd ik hier wel een andere naamgeving voor aan dan voor onze eigen unit testen door het woord Regression toe te voegen, bijv. ProjectRegressionTest i.p.v. ProjectTest. Op deze manier zie je duidelijk het verschil tussen de “menselijke intelligentie” testen die de functionaliteit testen en de “artificiële intelligentie” testen die checken of de code hetzelfde resultaat blijft geven.

Kosten

Diffblue is geen goedkope tool. Je betaalt $175 per developer per maand en elke developer die gebruik maakt van de tests moet een licentie hebben. Er is ook een gratis versie, beschikbaar voor losse developers. Of je dit ook als losse developers binnen een team mag gebruiken is niet duidelijk.

Conclusie

Diffblue is helaas niet de manier om nooit meer een unit test te hoeven schrijven, maar het maakt het schrijven van testen sneller en laagdrempeliger. Je begint niet meer met een blanco vel, maar kan snel een paar testen opzetten die je daarna zelf kan aanpassen of uitbreiden. Voor bestaande code kun je weliswaar lang niet overal regressietesten aan toevoegen, maar elke test die het wel toevoegt is meegenomen. Dat geeft meer zekerheid om toch ook in die oude code wijzigingen te maken.

Ongetwijfeld zal deze tool zich snel ontwikkelen, dus ook al kies je ervoor om het nu niet te gebruiken, hou het zeker in de gaten!