2009-09-25 13 views
7

Ich muss zwei Versionen der gleichen Anwendung schreiben, eine in .NET und die andere in Java. Also würde ich gerne eine einzelne Testsuite schreiben und sie dann gegen beide Codebasen verwenden.Mehrsprachiges Test-Framework

Welches Testwerkzeug würden Sie mir empfehlen zu verwenden?

Antwort

3

Es gibt einige weitere Optionen für Sprachen, die sowohl auf der CLR als auch auf der JVM ausgeführt werden. Einige davon haben bereits eigene Unit-Test-Frameworks.

Zum Beispiel Rubin kommt mit Test Unit und existiert in Quelle kompatiblen Versionen für beide Laufzeiten (JRuby und Iron Ruby -. Beide sind Ruby 1.8-Version kompatibel)

Wäre eine gute Ausrede sein Ruby zu lernen, wenn du kennst es nicht schon ...

+1

Um ehrlich zu sein, ich möchte wirklich eine Entschuldigung finden, Ruby zu lernen. Das kann es sein. Ich werde Test Unit überprüfen. Danke –

3

Ich sehe zwei Strategien:

  • Wickeln Sie den Code in irgendeiner Art von Server zu testen, so können Sie die Methoden aufrufen remote zu testen. Dies würde Ihnen erlauben, jede Testsuite zu verwenden.

  • Schreiben Sie die Tests in etwas wie J # oder einer anderen Sprache, die Sie problemlos .NET und Java zuordnen können. Dies bedeutet, dass Sie die Tests einmal schreiben und dann den Testcode in etwas übersetzen, was zwei verschiedene Test-Frameworks verstehen können.

Ich schlage vor, den zweiten Ansatz zuerst zu versuchen. Es wird Tests zu einem viel komplexeren Testaufbau viel schneller machen. Der erste Ansatz ist wahrscheinlich einfacher einzurichten, wird aber die Tests verlangsamen und Sie müssen den Server irgendwo in den Tests starten und abbauen.

+1

Wir sind hauptsächlich ein .NET-Shop, also wäre es für uns einfach, wenn wir die Tests in einer CLR-Sprache schreiben könnten. Ich möchte mich jedoch nicht mit dem Testcode herumschlagen. Idealerweise würde ich den Test nur einmal schreiben. Danke. –

+0

Das Ausführen eines Skripts, das den Code von einer Sprache in eine andere übersetzt (wenn diese beiden Sprachen sehr ähnlich sind), ist nicht "unordentlich" :) –

+0

Ich denke, das ist machbar, aber ich würde es wieder lieber tun, ohne müssen schreibe mehr Support-Code. Ich werde es trotzdem berücksichtigen. –

6

Interessante Frage ..

Ich denke, dass Sie xUnit Implementierungen für Java (JUnit, höchstwahrscheinlich) und .NET verwenden können. Aber Ihr Test-Code muss es eine dritte Sprache geschrieben haben, wahrscheinlich einfache DSL zum Testen, die Sie selbst entwerfen können. Diese Sprache soll in Java- und C# -Quelldateien übersetzt werden.

Andere Option ist nicht mit der eigenen Sprache zu verwirren und einige bestehende zu nehmen. Z.B. Python verfügt über Implementierungen für beide Plattformen: Jython (Java) und IronPython (.NET). So können Sie Tests in dieser Sprache schreiben. Python hat seine eigene gebündelte xUnit-Implementierung: unittest Paket.

+4

+1 Ich mag die Idee, Python zu verwenden –

+0

Entwerfen meiner eigenen DSL klingt zu kompliziert, aber ich denke, der Python-Ansatz ist eine Überlegung wert. Danke –

+0

was ist DSL? – jrharshath

2

Ich bin mir nicht sicher, warum Sie parallele Implementierungen in Java und .NET haben und die Redundanz der Pflege von 2 Codebasen durchlaufen sollten. Python stellt zwar eine skriptfähige Test-Harness zur Verfügung, hat aber in jeder Plattform ceveats, d. H. Nicht alle Core-Python-Module wurden nach Java und ipython portiert.

+0

Es ist eine geschäftliche Entscheidung. Wir haben Kunden, die entweder an die Java- oder .NET-Technologie gebunden sind, und die meisten von uns möchten dann nicht, dass wir auf ihren Servern fremden Code auf ihrer Plattform installieren. –

2

Was ich interessant finde ist, dass Sie nicht den Aufwand von Komponententests duplizieren, aber nicht für die Anwendung selbst. Warum nicht schreiben Sie die Anwendung Kern & Komponententests in Java sagen und dann ikvm verwenden und haben nur die UI-Ebenen in C# und Java mit separaten Komponententests rund um die Technologie jeweils. (Oder Grasshopper wenn Sie ein .NET-Shop sind)?

+0

Was Sie sagen, macht Sinn, aber ich bin mir nicht sicher, ob ich einem Drittanbieter-Tool traue, den Code von einer Plattform auf die andere zu transformieren. Ich hätte lieber die Kontrolle über das, was vor sich geht. Außerdem sollten beide Implementierungen * ziemlich einfach sein. –

+0

Gibt es neutrale Sprachen, die auf beide Umgebungen abzielen und eine Kompilierung auf native Bytecodeoption unterstützen? Python oder Ruby sagen? Ihre Clients müssen dies nicht wissen (es sei denn, sie möchten die Quelle anzeigen), da Sie nur kompilierte Klassen und eine zusätzliche Bibliothek bereitstellen würden. –

3

Cucumber ist ein großartiger Rahmen für das Schreiben von Spezifikationen. Die Spezifikationen werden durch Schrittdefinitionen unterstützt, die geschrieben werden können, um sowohl die .net- als auch die Java-Implementierung zu steuern.

+0

klingt faszinierend. Ich werde das überprüfen. Danke –

1

Ich bin Autor von jni4net, Open Source-Intra-Prozess-Brücke zwischen JVM und CLR. Es ist auf JNI und PInvoke aufgebaut. Kein C/C++ Code benötigt. Ich hoffe es hilft dir.

+0

Es scheint, dass jni4net nicht auf Linux-Boxen arbeiten wird, eine der Anforderungen, die ich habe. –

+0

Mehr über Mono hier: http://zamboch.blogspot.com/2010/04/jni4net-not-yet-on-mono-linux.html Möchten Sie Ihre Geschichte mit uns teilen, um Ihren Fall zu unterstützen? –

1

Ich empfehle, die Granularität Ihrer Frage erneut zu untersuchen. Es impliziert Unit-Testing, aber warum nicht auf Funktions-/Systemebene testen. In diesem Zusammenhang wird FIT eine Wahl.

Als Beispiel haben wir eine Client-Server-App in Java. Wir verwenden FIT als alternativen Client: Wir können Html-Eingabedateien angeben und mit etwas Kleber (auch Fixtures genannt) können wir den Server treffen.

Die gute Nachricht ist, dass dies für die Sprache auf dem Server agnostisch ist und die Html-Dateien als Akzeptanztests verwendet werden können.

Die schlechte Nachricht ist, dass FIT nur ein Rahmen ist: Es kann viel Klebstoff brauchen. Außerdem muss man erkennen, dass dies keine Unit-Tests sind. Nicht nur die Granularität ist unterschiedlich, sondern auch die Geschwindigkeit ist unterschiedlich. h. eine große Anzahl von Tests kann aus der Sicht eines Komponententests nicht in "normaler" Zeit ablaufen. (Wir führen uns in der Nacht und nur eine kleine Teilmenge während CI-Build.)

0

Statt zwei Versionen der Anwendung schreiben Sie es in UML-Modell könnte
dann AndroMDA verwenden, um vorwärts Ingenieur Ihr Modell in separaten Java-und. Netzimplementierungen.

Die von AndroMDA verwendete Methode fördert die Einbeziehung von Komponententests.

Verwandte Themen