Wissen Sie, es schleicht sich eine gewisse Angst ein, wenn man einen Blick auf eine Codebasis wirft, an der man gerade erst zu arbeiten beginnt, und dann erkennt, dass es sich um eine riesige, unbekannte Wildnis handelt. Es wurde kein einziger Test geschrieben, um sich vor dem Unerwarteten zu schützen.
Es ist, als würde man auf einem Seil über einen Abgrund gehen und wissen, dass ein einziger Fehltritt Ihr gesamtes Projekt ins Chaos stürzen könnte.
Wenn Sie an einer Codebasis mit 0 Tests gearbeitet haben, wissen Sie, dass es eine entmutigende Aufgabe sein kann, darüber nachzudenken, die gesamte Codebasis mit Tests von Grund auf abzudecken, wo es derzeit keine gibt.
Der Prozess erfordert einen fast herkulischen Aufwand: Sie müssten alle Funktionen, Methoden und Komponenten durchgehen, alle potenziellen Randfälle erarbeiten, den Code der Testsuite strukturieren und dafür sorgen, dass alles reibungslos läuft.
Und dabei ist noch nicht einmal die Zeit erwähnt, die benötigt wird, um eine aussagekräftige Berichterstattung zu erreichen. Wir reden über Wochen, vielleicht Monate, bevor Sie sich zurücklehnen und sagen können: „Ja, wir haben eine Abdeckung von 80 % oder 90 % erreicht.“
Aus diesem Grund freue ich mich, Ihnen mitzuteilen, woran ich in den letzten Monaten gearbeitet habe. Diese Reise führt uns an einen Ort, an dem das Reich des automatisierten Testens auf die magische Welt der KI trifft. Lernen Sie Pythagora kennen, ein Open-Source-Entwicklungstool, das bald Ihr neuer bester Freund wird.
In diesem Blogbeitrag werde ich Ihnen zeigen , wie Sie automatisierte Tests mit Pythagora starten können, die die Leistungsfähigkeit der KI nutzen, um Tests für Ihre gesamte Codebasis zu generieren, alles mit einem einzigen CLI-Befehl , und hoffentlich Ihre Codebasis auf 80–90 % bringen % Codeabdeckung an einem einzigen Tag .
Wir alle kennen das Sprichwort: „Rom wurde nicht an einem Tag erbaut.“ Das Gleiche gilt auch für eine umfassende, effektive Testsuite. Es ist ein akribischer und anspruchsvoller Prozess, aber wenn man diesen steinigen Weg erst einmal bewältigt hat, ist das Erfolgserlebnis tiefgreifend.
Lassen Sie uns gemeinsam durch die notwendigen Schritte gehen, die erforderlich sind, um eine Testsuite von Grund auf zu erstellen und die begehrte Codeabdeckung von 80 % bis 90 % zu erreichen.
In der ersten Phase sind Sie wie ein Maler vor einer leeren Leinwand. Die Welt ist voller Möglichkeiten und es steht Ihnen frei, ein Meisterwerk zu schaffen.
In diesem Fall besteht Ihre Meisterleistung darin, die Arten von Tests auszuwählen , die Sie schreiben möchten, das richtige Test-Framework zu finden und die Best Practices zu übernehmen , die für Ihre spezifische Umgebung geeignet sind.
Erwägen Sie Unit-Tests, Integrationstests, E2E-Tests oder eine Mischung aus allen dreien?
Obwohl diese Ersteinrichtung oft als der „einfache“ Teil angesehen wird, ist sie keineswegs ein Kinderspiel. Um fundierte Entscheidungen zu treffen, sind Zeit, Recherche und vielleicht ein paar Tassen Kaffee erforderlich.
Sobald Sie Ihre Grundstruktur festgelegt haben, ist es an der Zeit, die Ärmel hochzukrempeln und tief ins Detail zu gehen. Jetzt müssen Sie Ihre gesamte Codebasis Funktion für Funktion durchgehen und für jede Funktion Tests schreiben. Ihre Aufgabe besteht hier darin, sicherzustellen, dass Ihre Tests alle Codezeilen innerhalb jeder Funktion, Methode oder Komponente berühren.
Diese Aufgabe ähnelt der Erkundung eines komplizierten Labyrinths. Sie müssen jeden Weg beschreiten, um jede Ecke biegen und sicherstellen, dass kein Stein auf dem anderen bleibt.
Das Schreiben dieser Tests ist ein detaillierter und zeitintensiver Schritt. Es geht nicht nur darum, ein paar Zeilen Code zu schreiben; Es geht darum, den Zweck der Funktion, ihre erwartete Ausgabe und ihre Interaktion innerhalb Ihrer Anwendung zu verstehen.
Nach der ersten Testrunde können Sie aufatmen. Aber warten Sie; Es ist noch ein wichtiger Teil des Puzzles übrig. Es ist Zeit, in die wilde, unvorhersehbare Welt der Randfälle einzutauchen.
Dieser Teil erhöht möglicherweise nicht den Prozentsatz Ihrer Codeabdeckung, ist jedoch für das Testen der Robustheit und Belastbarkeit Ihres Codes von entscheidender Bedeutung.
Diese sogenannten Negativtests helfen dabei, zu bewerten, wie Ihr Code auf verschiedene Eingaben reagiert, insbesondere auf solche, die am Rande des erwarteten Verhaltens liegen. Von leeren Eingaben bis hin zu Werten, die die Grenzen Ihrer Datentypen überschreiten – diese Tests sind darauf ausgelegt, das Benutzerverhalten in der realen Welt nachzuahmen, wo Benutzer oft ein Händchen dafür haben, Ihren Code in Richtungen zu treiben, die Sie nie für möglich gehalten hätten.
Das Erstellen einer Testsuite von Grund auf ist eine Herkulesaufgabe. Aber seien Sie versichert: Jede Anstrengung, die Sie unternehmen, ist ein Schritt hin zur Entwicklung einer robusteren, zuverlässigeren und belastbareren Anwendung.
Und denken Sie daran, Sie sind nicht allein. Das haben wir alle schon erlebt, und mit einem Werkzeug wie Pythagora ist die Reise nicht so entmutigend, wie es scheint.
Bei Pythagora hingegen können Sie Folgendes eingeben:
npx pythagora --unit-tests --path ./path/to/repo
Pythagora navigiert durch alle Dateien in allen Ordnern und zaubert Unit-Tests für jede Funktion, auf die es trifft. Jetzt können Sie sich zurücklehnen und entspannen oder zu Mittag essen und es eine Weile laufen lassen, bis es mit dem Schreiben der Tests fertig ist.
Ok, aber warte, was zum Teufel ist Pythagora??
Ich habe immer von einer Welt geträumt, in der automatisierte Tests für mich erstellt werden könnten. Aber die Realität ist nicht so einfach. Niemand kennt Ihren Code so gut wie Sie, was es für andere schwierig macht, effektive automatisierte Tests dafür zu entwerfen. Die Ergebnisse bleiben oft hinter dem zurück, was Sie selbst erreichen würden.
Allerdings änderte sich alles, als ChatGPT die Szene betrat. Als ich an dieser Technologie herumbastelte, fragte ich mich: „Könnten wir die Leistungsfähigkeit von ChatGPT zum Schreiben automatisierter Tests nutzen?“
Meine Neugier war geweckt, ich habe mich tiefer damit beschäftigt, mit seinen Möglichkeiten experimentiert, und was ich entdeckt habe, hat mich umgehauen.
ChatGPT zeigte eine unglaubliche Fähigkeit, Code zu verstehen und bot einen Einblick in einen vielversprechenden neuen Weg im automatisierten Testen.
Und so entstand die Idee für Pythagora.
Pythagora ist ein Open-Source-Entwicklungstool, das mit dem Ziel entwickelt wurde, automatisierte Tests autonom zu machen . Ich stelle mir eine Welt vor, in der sich Entwickler wie Sie und ich auf die Erstellung von Funktionen konzentrieren können, ohne sich im Sumpf des Schreibens und Wartens von Tests zu verzetteln.
Um diese Vision zu verwirklichen, wird GPT-4 verwendet.
Derzeit verfügt Pythagora über die Fähigkeit, sowohl Unit- als auch Integrationstests zu schreiben. In diesem Blogbeitrag konzentrieren wir uns jedoch auf die Fähigkeit, Unit-Tests zu generieren.
Um Pythagora zu installieren, müssen Sie nur npm i pythagora
ausführen. Das ist es! Pythagora steht jetzt zu Ihren Diensten.
Sobald Pythagora installiert ist, müssen Sie es mit einem API-Schlüssel konfigurieren. Dies kann entweder ein OpenAI-API-Schlüssel oder ein Pythagora-API-Schlüssel sein.
Um einen OpenAI-API-Schlüssel zu verwenden, sollten Sie den folgenden Befehl ausführen:
npx pythagora --config --openai-api-key <OPENAI_API_KEY>
Es ist wichtig zu beachten, dass Sie Zugriff auf GPT-4 haben müssen, wenn Sie Ihren eigenen OpenAI-API-Schlüssel verwenden möchten.
Alternativ können Sie über diesen Link einen Pythagora-API-Schlüssel erhalten. Sobald Sie es haben, richten Sie es mit dem folgenden Befehl ein:
npx pythagora --config --pythagora-api-key <PYTHAGORA_API_KEY>
Wenn Sie lieber Tests für eine bestimmte Datei generieren möchten, verwenden Sie:
npx pythagora --unit-tests --path ./path/to/file.js
Und wenn Sie eine bestimmte Funktion im Sinn haben, verwenden Sie:
npx pythagora --unit-tests --func <FUNCTION_NAME>
Ziehen wir den Vorhang zurück und werfen einen Blick in den Maschinenraum. Wie tickt Pythagora?
Im Kern fungiert Pythagora als unerschrockener Entdecker, der in das komplizierte Labyrinth Ihrer Codebasis eintaucht. Zunächst ordnet es alle aus Ihren Dateien exportierten Funktionen zu, sodass sie innerhalb der Tests aufgerufen werden können.
Wenn eine Funktion nicht exportiert wird, kann sie natürlich nicht von außerhalb ihrer Datei aufgerufen werden. Übrigens: Nachdem Sie ein paar Tests generiert haben, werden Sie über Ihre Codebasis nachdenken und darüber nachdenken, wie Sie sie besser strukturieren können, damit mehr Tests generiert werden können.
Sobald Pythagora die exportierten Funktionen identifiziert hat, geht es einen weiteren Schritt in die Tiefe: Es untersucht nacheinander jede Funktion und macht dabei auf die Suche nach allen darin aufgerufenen zusätzlichen Funktionen.
Stellen Sie sich ihn als den Archäologen Ihrer Codebasis vor, der sanft Staubschichten wegfegt, um die verborgenen Verbindungen und Abhängigkeiten freizulegen.
Mit anderen Worten: Es sucht nach allen Funktionen, die innerhalb der getesteten Funktion aufgerufen werden, damit GPT besser verstehen kann, was eine Funktion tut, für die die Tests geschrieben werden.
Ausgestattet mit diesen Informationen bereitet sich Pythagora darauf vor, die Macht der KI zu nutzen. Es verpackt den gesammelten Code und sendet ihn an die Pythagora-API. Hier geschieht die eigentliche Magie: Eine Eingabeaufforderung wird sorgfältig ausgearbeitet und an das GPT-Modell übergeben.
Diese Interaktion zwischen dem Code, der API und dem KI-Modell führt zur Generierung eines umfassenden Satzes von Komponententests, die bereitgestellt und in die Tat umgesetzt werden können.
Sowohl der API-Server als auch die verwendeten Eingabeaufforderungen sind Open Source. Sie stehen Ihnen zur Verfügung, damit Sie sich mit ihnen befassen, sie prüfen und sogar dazu beitragen können, wenn Sie dies wünschen. Den Pythagora-API-Server finden Sie hier , während die Eingabeaufforderungen und Schlüsselbestandteile bei der Erstellung von Unit-Tests in diesem Ordner untergebracht sind.
Sobald Pythagora alle angeforderten Tests geschrieben hat, ist es an der Zeit, einzusteigen und mit der Überprüfung zu beginnen. Dies ist ein wichtiger Schritt in diesem Prozess. Es ist wichtig zu wissen, was erstellt wurde, und sicherzustellen, dass alles Ihren Erwartungen entspricht.
Denken Sie daran, dass Pythagora scherzbasierte Tests erstellt. Um alle generierten Tests auszuführen, können Sie einfach Folgendes ausführen:
npx jest ./pythagora_tests/
Nun ein Wort zur Vorsicht: Pythagora befindet sich noch in einem frühen Stadium. Wie bei allen jungen Projekten wird es auf dem Weg dorthin zwangsläufig einige Probleme geben. Daher kann es bei Ihren ersten Durchläufen zu fehlgeschlagenen Tests kommen.
Seien Sie nicht entmutigt; Betrachten Sie dies als einen Teil der Reise. Mit Ihrer Rezension und den kontinuierlichen Verbesserungen von Pythagora gehören diese fehlgeschlagenen Tests bald der Vergangenheit an.
Und vergessen wir nicht die positive Seite. Selbst bei diesen Anfangsschwierigkeiten im Anfangsstadium kann Pythagora Sie an einen Punkt bringen, an dem Ihre Codebasis eine erhebliche, möglicherweise bis zu 90 %ige Testabdeckung aufweist.
Der Überprüfungsprozess kann insbesondere bei größeren Codebasen einige Stunden dauern. Denken Sie daran, dass Sie nicht nur die bestandenen Tests sehen, sondern auch die, die nicht bestanden wurden. Es ist wichtig, jeden Test zu verstehen, den Sie in Ihr Repository übertragen. Wissen ist schließlich Macht.
Nach einer gründlichen Überprüfung und möglichen Optimierungen sind Sie bereit für Ihren letzten Schritt: die Übergabe der generierten Tests an Ihr Repository. Mit diesem letzten Schritt hätten Sie erfolgreich eine robuste Unit-Test-Suite in Ihr Projekt integriert.
Und das alles wird mit der Kraft von Pythagora und ein paar Befehlszeilen in Ihrem Terminal erreicht.
Okay, jetzt, da ich Ihr Interesse geweckt habe, lasst uns tiefer in die Realität eintauchen – konkrete Beispiele von Pythagora in Aktion. Für unsere Demonstration haben wir ein bekanntes Open-Source-Projekt ausgewählt, Lodash .
Die Ausführung nur eines Pythagora-Befehls reichte aus, um satte 1604 Tests zu generieren und eine beeindruckende Codeabdeckung von 91 % des gesamten Lodash-Repositorys zu erreichen . Aber nicht nur die Menge der Tests ist beeindruckend.
Davon haben 13 Tests tatsächliche Fehler im Lodash-Master-Zweig zutage gefördert .
Wenn Sie neugierig sind, diese selbst auszuprobieren, haben wir das Lodash-Repository geforkt und die von Pythagora generierten Tests hinzugefügt. Fühlen Sie sich frei, sie hier zu erkunden.
Schauen wir uns nun einen der Tests genauer an, bei denen ein heimtückischer Fehler entdeckt wurde:
test(`size({ 'a': 1, 'b': 2, 'length': 9 })`, () => { expect(size({ 'a': 1, 'b': 2, 'length': 9 })).toBe(3); // test returns 9 });
In diesem Test soll die size
von Lodash die Größe eines JSON-Objekts zurückgeben. Aber GPT hat einen Schlüssel mit dem Namen „ length
hinzugefügt, ein kleiner Trick, um zu sehen, ob Lodash möglicherweise den Wert dieses Schlüssels anstelle der wahren Größe des Objekts zurückgibt.
Es scheint, dass Lodash auf diese List hereingefallen ist, da der Test fehlschlug und „9“ statt der erwarteten „3“ zurückgab.
Dies ist ein fantastisches Beispiel dafür, wie Pythagora, powered by GPT, hervorragend darin ist, knifflige Randfälle aufzudecken, die leicht unter dem Radar verschwinden könnten.
Durch die automatische Generierung einer großen Anzahl solch komplexer Testfälle kann Pythagora Ihr treuer Begleiter sein und Ihnen dabei helfen, Fehler zu entdecken und zu beheben, mit denen Sie vielleicht nie gerechnet hätten.
Nun, da haben wir es, liebe Entwicklerkollegen. Wir haben heute eine ziemliche Reise angetreten, sind durch unbekannte Gebiete einer umfangreichen Codebasis ohne Tests vorgedrungen und sind mit einer automatisierten Reihe von Tests zurückgekehrt, die von unserem bewährten KI-gestützten Tool Pythagora erstellt wurden.
Sie haben gelernt, dass es selbst angesichts einer entmutigenden Codebasis ohne Tests keinen Grund zur Verzweiflung gibt. Die Aufgabe, eine umfangreiche Testreihe zu erstellen, muss keine mühsame Aufgabe mehr sein.
Wir haben die Magie von Pythagora erlebt, als es eine bekannte Open-Source-Bibliothek, Lodash, untersuchte und 1604 Tests generierte, die atemberaubende 91 % der Codebasis abdeckten.
Wir haben gesehen, dass es bei Pythagora nicht nur um Quantität, sondern auch um die Qualität der Tests geht. Es geht nicht nur darum, Tests zu erstellen, sondern auch auf intelligente Weise Grenzfälle und Fehler zu finden, die andernfalls möglicherweise unbemerkt geblieben wären.
Pythagora hat 13 echte Fehler im Lodash-Master-Zweig entlarvt – ein Beweis für die Leistungsfähigkeit der KI beim Softwaretesten.
Jetzt sollten Sie besser verstehen, warum KI-gestützte Testtools wie Pythagora nicht nur ein Luxus, sondern eine Notwendigkeit in der heutigen schnelllebigen Entwicklungslandschaft sind.
Egal, ob Sie ein bestehendes Projekt ohne Tests bearbeiten oder ein neues Projekt starten und von Anfang an ein solides Test-Framework etablieren möchten, denken Sie daran, dass Sie nicht allein sind.
Pythagora ist hier, um die Zügel in die Hand zu nehmen, Ihnen dabei zu helfen, mit Leichtigkeit aussagekräftige Tests zu erstellen und Ihnen wertvolle Zeit zu sparen, die Sie besser für die Entwicklung großartiger Funktionen verwenden können.
Vielen Dank, dass Sie mich auf dieser Reise begleiten, und ich kann es kaum erwarten zu sehen, wie Sie Pythagora in Ihren Projekten nutzen. Viel Spaß beim Codieren!
PS Wenn Sie diesen Beitrag hilfreich fanden, würde es mir sehr viel bedeuten, wenn Sie das Pythagora-Github-Repo in den Vordergrund stellen würden, und wenn Sie Pythagora ausprobieren, teilen Sie uns bitte mit, wie es auf [email protected] gelaufen ist