GexfVizz – Über JUnit und Testfälle

20 Aug

Nachdem nun der „Circos Teil“ meiner Bachelorarbeit soweit abgeschlossen ist (von ein paar Kleinigkeiten mal abgesehen) bin ich nun in den Bereich des Testens übergegangen. Mit anderen Worten beschäftige ich mich aktuell mit JUnit 4 und in wie weit man dies in meinem Projekt sinnvoll einsetzen kann.

In der Theorie ist es natürlich einfach für jede öffentliche Methode einen oder mehrere Testfälle zu erzeugen, um dann mit Hilfe von JUnit die gesamte Anwendung komplett automatisiert durchtesten zu können. Nun wird eigentlich mein Back-end durch ein zwischengeschaltetes Java Servlet aufgerufen, welches zum Beispiel nur sehr schlecht mit JUnit testbar ist. Das liegt daran, dass es nur in einer relativ langen Methode die Parameter einließ, die über die REST Schnittstelle mitgegeben worden sind um dann die entsprechende Server Methode aufzurufen. Es gibt zwar Möglichkeiten um Servlets mit JUnit zu testen, aber bisher konnte ich damit noch keine zufriedenstellenden Ergebnis erzielen. Insbesondere da ich nichts nur Strings, sondern teilweise auch Bilder zurückgebe. Wie in dem verlinkten Blogeintrag aber deutlich wird, ist es möglich HTTP Anfragen zu simulieren:


HttpClient client = new HttpClient();
PostMethod post = new PostMethod(url);
post.setQueryString(queryString);
client.executeMethod(post);
result = post.getResponseBodyAsString();
post.releaseConnection();

 

Dies ist auf jeden Fall schon mal ein wichtiger Anfang, löst aber, wie bereits erwähnt, nicht alle Probleme mit JUnit und meinem Servlet.Nun lassen sich zum Glück diese Teile des zwischengeschalteten Servlet einigermaßen leicht „von Hand“ testen, da ich nur etwa Zehn Parameter habe; aber eine optimalen Lösung ist das leider (noch) nicht.

Ansonsten bestehen große Teile des Back-ends aus privaten Methoden, die ich auch nicht direkt testen kann (da ich eigentlich nicht auf eingebettete Test-Klassen zurückgreifen möchte). Allerdings kann man wohl davon ausgehen, dass wenn ich korrekte Testergebnisse auf der öffentlichen Schnittstelle erziele, dass dann auch die privaten Methoden korrekt funktioniert haben, da diese von den öffentlichen aufgerufen worden sind.

Nun möchte ich im Folgenden noch einmal ganz kurz beschreiben wie so ein JUnit-Test überhaupt aufgebaut ist. Als erstes sollte man die JUnit.jar zu seinem Java buildpath hinzufügen, danach kann man eine Test Klasse erzeugen, welche die einzelnen Tests enthält. Das Ganze kann dann zum Beispiel so aussehen:


public class Tests {
@Test public void testGenerateCircos() throws RemoteException{
Server serv = new Server();
String result = serv.getCircosPath(Settings.APACHE_PATH + "data/e77b1839e8f031e3b6ead6dfe067757d948269d77a2f50f6ff2fcb6858d6ef0e.gexf", "cc", 10);
String expected = "circos/gfx/1af0b2e56edd8bd30effc4ea8eeca098b3e7c96791d054bb4435d30f064584bf_cc_10.png";
assertTrue(expected.equals(result));
}
}

Nun kann man also in dieser Testklasse beliebig viele automatisierte Testfälle ablegen und später mit dieser Klasse die Tests ausführen. Die Tests geben danach Rückmeldung über die erfolgreichen und fehlgeschlagenen Testfälle. Abgesehen von den oben angesprochenen Ausnahmen, funktioniert dieses Verfahren auch sehr gut und ist unglaublich hilfreich :)

2 Antworten to “GexfVizz – Über JUnit und Testfälle”

  1. dmmeiners 20. August 2012 um 12:00 #

    Hallo plasmalampe,

    Zum Testen privater Methoden kann ich folgendes beisteuern:

    Eine Möglichkeit wäre, Mockup- oder Spy-Objekte einzusetzen, wobei ich natürlich nicht weiß, ob sich bei deiner Implementierung vielleicht selbst dann nicht alles testen lässt.

    Wichtiger erscheint mir jedoch:

    Es gibt die weit verbreitete Ansicht, dass man private Methoden nicht testen sollte (braucht), da diese „Implementierungsdetails“ sind und sich ändern können. Es reicht, wie du schon schreibst, die öffentlichen Methoden zu testen.

    Ich würde mich also deiner intuitive Auffassung anschließen und nicht damit aufhalten, private Methoden zu testen. Aus meiner Erfahrung weiß ich, das dies selbst mit Mockup-Objekten sehr umständlich ist.

    Grüße

    • plasmalampe 22. August 2012 um 16:00 #

      Danke für deinen Hinweis und der Bekräftigung meiner Auffassung, warum ich die privaten Methoden nicht testen möchte.

      Im Endeffekt stütze ich mich da jetzt auch auf die Argumentation, dass diese „Implementierungsdetails“ sind und ich daher nur die öffentlichen Methoden testen brauche, welche die privaten ja sowieso benutzen :)

Schreibe einen Kommentar

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

%d Bloggern gefällt das: