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:
- Schreiben Sie sprachunabhängige Komponententests für den alten Code auf, der erfolgreich ist (oder fehlschlägt, wenn Sie Fehler finden!).
- Führen Sie Unit-Tests auf Ihrer anderen Codebasis aus, die fehlschlagen.
- 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 .
unit-testing
language-agnostic
porting
Bringer128
quelle
quelle
expect
implementieren Sie dann Ihre Tests.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.legacy language x
bis erfolgtfancy new language y
. Ich habe nicht versucht, etwas über Unix zu sagen!Antworten:
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.
quelle
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.
quelle
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.
quelle
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.
quelle
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
quelle