Gibt es sprachunabhängige Frameworks für Unit-Tests? [geschlossen]

11

Ich war immer skeptisch, Arbeitscode neu zu schreiben - Portierungscode ist keine Ausnahme. Mit dem Aufkommen von TDD und automatisierten Tests ist es jedoch viel vernünftiger, Code neu zu schreiben und umzugestalten.

Weiß jemand, ob es ein TDD-Tool gibt, mit dem alter Code portiert werden kann? Idealerweise können Sie Folgendes tun:

  1. Schreiben Sie sprachunabhängige Komponententests für den alten Code auf, der erfolgreich ist (oder fehlschlägt, wenn Sie Fehler finden!).
  2. Führen Sie Unit-Tests auf Ihrer anderen Codebasis aus, die fehlschlagen.
  3. Schreiben Sie Code in Ihrer neuen Sprache, der die Tests besteht, ohne auf den alten Code zu achten.

Die Alternative wäre, Schritt 1 in "Unit-Tests in Sprache 1 schreiben" und "Unit-Tests in Sprache 2 portieren" aufzuteilen, was den Aufwand erheblich erhöht und schwer zu rechtfertigen ist, wenn die alte Codebasis danach nicht mehr gewartet wird der Port (das heißt, Sie profitieren nicht von einer kontinuierlichen Integration auf dieser Codebasis).

EDIT: Es lohnt sich, diese Frage auf StackOverflow zu beachten .

Bringer128
quelle
Stellen Sie ein reines Textbefehlsprotokoll bereit und expectimplementieren Sie dann Ihre Tests.
SK-Logik
@ SK-Logik, von der ich noch nichts gehört hatte expect. Wenn Sie ein Legacy-System im Unix-Stil haben, das über stdin und stdout mit Pipes kommuniziert, kann dieses Tool mit Sicherheit verwendet werden. Tatsächlich wäre es auch ziemlich einfach, mit jeder Skriptsprache zu testen.
Bringer128
Warum Vermächtnis? Sie können auch ein modernes System im Unix-Stil verwenden. Auf jeden Fall gibt es keine gültige Rechtfertigung dafür, keine Skriptschnittstelle für eine Funktionalität bereitzustellen.
SK-Logik
@ SK-Logik Entschuldigung, dass ich nicht klar bin. Ich sagte "Vermächtnis", weil die Portierung im Allgemeinen von legacy language xbis erfolgt fancy new language y. Ich habe nicht versucht, etwas über Unix zu sagen!
Bringer128
@ Bringer123 Übrigens, mein kleiner Trick für diese Art von Unix-ähnlicher Integration ohne anständige Unix-Unterstützung (z. B. keine richtigen Pipes) besteht darin, eine Skriptsprache einzubetten und über den TCP-Port (mit) Zugriff auf ihre REPL zu gewähren REPL läuft in einem separaten Thread). Es ist sowohl ein leistungsstarkes Debugging-Tool als auch eine Testautomatisierungs-Engine. Und dieser Ansatz funktioniert mit buchstäblich allem (eine eingebettete Skriptsprache kann sehr klein sein, in einem Szenario mit begrenzten Ressourcen sogar ein Forth).
SK-Logik

Antworten:

6

Ich denke nicht, dass es möglich ist, Unit-Tests in einer anderen Sprache zu schreiben.

Sie können jedoch Integrations- / Akzeptanz- / Benutzeroberflächen- / whaterver_you_name_it-Tests schreiben, die sehr hoch sind und nicht an die Sprache gebunden sind, mit der Ihre Software geschrieben wurde.

Wenn es sich bei Ihrer Anwendung um einen Webservice handelt, können Sie sie mit einer beliebigen Sprache testen, sofern sie Ihr Protokoll unterstützt. Wenn Ihre Anwendung in einem Browser ausgeführt wird, können Sie Selen verwenden (das ist das erste, was mir in den Sinn kam, aber es gibt andere. Usw. Es kann Fälle geben, in denen es meiner Meinung nach nicht funktioniert (vielleicht Hardware-Material), es hängt alles davon ab über die Art der Anwendung, an der Sie arbeiten.

Natürlich haben Sie nicht die gleiche Abdeckung wie bei Tests auf Einheitenebene (es sei denn, Sie verbringen viel Zeit), aber zumindest hätten Sie ein Testgeschirr.

David
quelle
+1 für die automatisierten High-Level-Tests. Diese wären definitiv die Mühe wert zu produzieren.
Bringer128
1
"Ich glaube nicht, dass es möglich ist, Unit-Tests in einer anderen Sprache zu schreiben." : counter Beispiel: In .NET können Sie Unit-Tests von C # in Visual Basic (oder einer anderen .NET-fähigen Sprache) schreiben. Vor einigen Jahren wurde dies sogar von Microsoft als Best Practice beworben, da es das Risiko senkt, sowohl Code zu machen als auch denselben Fehler in Bezug auf die Sprache (und insbesondere das relative Missverständnis des Programmierers) zu testen. Einverstanden, man wird keine Unit-Tests in Fortran schreiben, um PHP-Code zu testen.
Arseni Mourzenko
2

Ich denke, was Ihrer Idee am nächsten kommt, sind Unit-Test-Frameworks für auf virtuellen Maschinen basierende Ökosysteme wie die Java-VM. Zumindest Scala (und ich glaube auch Groovy - ich bin mir bei Clojure nicht ganz sicher) ist fast perfekt mit Java kompatibel. Das heißt, Scala-Code kann mit JUnit und Java-Code mit ScalaTest getestet werden. Auf diese Weise können Sie Java-Code (schrittweise oder sofort) in Scala neu schreiben und weiterhin dieselben alten Java-Komponententests verwenden, um die Richtigkeit zu überprüfen. (Oder umgekehrt - obwohl ich mir keinen triftigen Grund vorstellen kann, von Scala zurück nach Java zu migrieren.)

Wahrscheinlich gilt das Gleiche für Sprachen in der .NET-CLI, z. B. C #, F #, ASP.NET et al.

Außerhalb einer VM / CLR ist dies jedoch schwieriger. Theoretisch könnte man Unit-Tests und / oder zu testenden Code in eine andere Sprache wie C kompilieren (wie es bei neuen Sprachen wie frühem C ++ usw. üblich war und ist), aber ich habe noch nie von jemandem gehört, der dies speziell ausprobiert hat Unit-Tests.

Péter Török
quelle
1
Ich denke, das zeigt das Problem mit meiner Frage. Wenn sie problemlos zusammenarbeiten können, warum dann portieren? Und wenn dies nicht möglich ist, macht es die Sprachbarriere unmöglich, sprachübergreifende Unit-Tests durchzuführen.
Bringer128
@ Bringer128, Befürworter der neuen Generation von JVM-Sprachen behaupten, dass bestimmte Probleme schneller gelöst werden können, mit deutlich weniger und saubererem Code als in Java. Meine begrenzten Erfahrungen mit Scala bestätigen dies bisher.
Péter Török
Groovy arbeitet genauso gut mit Java zusammen.
user281377
1

Ein solches Framework existiert nicht, da es in der Sprache des verwendeten Codes geschrieben werden muss.

Beispielsweise muss ein Framework zum Testen von C ++ - Code in c oder c ++ geschrieben werden. Die Verwendung eines in C ++ geschriebenen Frameworks ist möglicherweise möglich, es wird jedoch kein AC-Code getestet, wenn C ++ - Funktionen verwendet werden.

BЈовић
quelle
1

Die Methoden variieren, aber in meinem Fall tendiert ein großer Teil meiner TDD-Tests zum "Integrationstest" -Stil, im Gegensatz zum "Unit-Test". Das heißt, die meisten von ihnen testen das gesamte Programm in nahezu realen Abfragen und suchen nach geeigneten Antworten.

In einigen Fällen, als ich netzwerkgesteuerte Programme (meistens anwendungsspezifische Protokolle) schrieb, hatte ich kein vollständiges Testframework zur Hand, das sich für den Job einfach anfühlte, so dass ich die meisten Tests "über das Netzwerk" in durchgeführt habe Kurz gesagt, ich habe einen sehr einfachen Client in einer anderen Sprache mit einem gemeinsamen und einfachen Testframework geschrieben, und die meisten Tests haben die Antworten des Servers überprüft.

Trotzdem habe ich selbst in diesen Fällen einige handgerollte Tests in die reale Anwendung injiziert, um einige Teile außerhalb des Netzwerks zu testen.

Javier
quelle
0

Sprachunabhängige Testframeworks sind generische Testframeworks, die für Abnahmetests (Sicht) geeignet sind, und Testfälle in diesem Framework werden von der Qualitätssicherung verwaltet, z. B. Robotframework

rrsguru
quelle
2
Dies scheint nichts Wesentliches über Punkte zu bieten, die in den vorherigen 4 Antworten gemacht und erklärt wurden
Mücke