K
Klaus
Gast
Hi,
und zwar müssen wir Code schreiben, der sehr sehr gut getestet werden soll mit entsprechenden Testcases. Am Ende werden wir erheblich mehr Testcode als wirklichen Code haben.
Nun ist die Frage, wie man Testcode elegant in Java-Klassen einbetten kann.
Was ich damit meine:
Wir würden unsere Testfälle gerne im "JUnit-Format" schreiben (JUnit3, 4 geht leider nicht), so dass wir am Ende mit einem Klick alle Testfälle durchlaufen können. Das Problem ist nun aber ein wenig, dass unsere Klassen/Methoden relativ viel vor dem Benutzer verstecken, da ist es aber dann schwierig, diese internen Methoden zu testen.
Bevor nun der Aufschrei kommt: Es handelt sich um einen Emulator der um bestimmte Funktionalität erweitert werden soll. Deswegen sind manche Methoden von außen überhaupt nicht zugreifbar, werden aber vom emulierten Code (über teilweise mehrere Umwege) aufgerufen.
Eine Möglichkeit wäre es, nun statt einer extra Klasse für den Testfall die Testfälle innerhalb der zu testenden Klasse zu haben.
Also irgendetwas wie:
Würde vom Prinzip gehen, wäre aber in meinen Augen doch unschön. Zum einen würde es die Klasse umgemein aufblähen (da mehr Testcode als echter Code) und zum zweiten, wenn man ein TestMich Objekt hat, würde man die Methode test_Testfall1 (und Testfall2, 3, ...) sehen.
Nun ist meine Frage: Wie löst man das elegant?
In C/C++/C# konnte man schön auf den Precompiler zurück greifen, und dann z.B. soetwas schreiben:
Oder
So dass man mit entsprechenden Flags zwischen Testcode und Produktivcode (der kein Testcode enthält) entscheiden konnte.
Soweit ich es nun in Erfarung bringen konnte, geht das in Java leider nicht
Wäre wirklich dankbar, wenn mir dort jemand weiterhelfen könnte. Schön wäre es, wenn z.B. alle private/protected Methoden/Variablen für die Testcases public wären und/oder ich Code einfüge, der ein public Interface für bestimmte Methoden anbietet, wenn die Testfälle am laufen sind.
Also soetwas in der Art:
So dass dann die Testfälle an entsprechend notwendigen stellen auf test_zuTestendeMethode() anstatt auf zuTestendeMethode() zurückgreifen.
Vielen Dank für jede Hilfe.
Klaus
und zwar müssen wir Code schreiben, der sehr sehr gut getestet werden soll mit entsprechenden Testcases. Am Ende werden wir erheblich mehr Testcode als wirklichen Code haben.
Nun ist die Frage, wie man Testcode elegant in Java-Klassen einbetten kann.
Was ich damit meine:
Wir würden unsere Testfälle gerne im "JUnit-Format" schreiben (JUnit3, 4 geht leider nicht), so dass wir am Ende mit einem Klick alle Testfälle durchlaufen können. Das Problem ist nun aber ein wenig, dass unsere Klassen/Methoden relativ viel vor dem Benutzer verstecken, da ist es aber dann schwierig, diese internen Methoden zu testen.
Bevor nun der Aufschrei kommt: Es handelt sich um einen Emulator der um bestimmte Funktionalität erweitert werden soll. Deswegen sind manche Methoden von außen überhaupt nicht zugreifbar, werden aber vom emulierten Code (über teilweise mehrere Umwege) aufgerufen.
Eine Möglichkeit wäre es, nun statt einer extra Klasse für den Testfall die Testfälle innerhalb der zu testenden Klasse zu haben.
Also irgendetwas wie:
Java:
class TesteMich {
private int zuTestendeMethode() {
//...
}
//Testcases
public void test_Testfall1() {
//Teste zuTestendeMethode
}
}
Würde vom Prinzip gehen, wäre aber in meinen Augen doch unschön. Zum einen würde es die Klasse umgemein aufblähen (da mehr Testcode als echter Code) und zum zweiten, wenn man ein TestMich Objekt hat, würde man die Methode test_Testfall1 (und Testfall2, 3, ...) sehen.
Nun ist meine Frage: Wie löst man das elegant?
In C/C++/C# konnte man schön auf den Precompiler zurück greifen, und dann z.B. soetwas schreiben:
Java:
class TesteMich {
private int zuTestendeMethode() {
//...
}
#ifdef TESTRUN
//Testcases
public void test_Testfall1() {
//Teste zuTestendeMethode
}
#endif
}
Oder
Java:
class TesteMich {
#ifdef TESTRUN
#define PRIVATEACC public
#else
#define PRIVATEACC private
#endif
PRIVATEACC int zuTestendeMethode() {
//...
}
}
Soweit ich es nun in Erfarung bringen konnte, geht das in Java leider nicht
Wäre wirklich dankbar, wenn mir dort jemand weiterhelfen könnte. Schön wäre es, wenn z.B. alle private/protected Methoden/Variablen für die Testcases public wären und/oder ich Code einfüge, der ein public Interface für bestimmte Methoden anbietet, wenn die Testfälle am laufen sind.
Also soetwas in der Art:
Java:
class TesteMich {
private int zuTestendeMethode() {
//...
}
#Wenn Testlauf / kein Testlauf flag gesetzt ist dann zeige folgende Methode an:
public int test_zuTestendeMethode() {
return zuTestendeMethode();
}
#endif
}
So dass dann die Testfälle an entsprechend notwendigen stellen auf test_zuTestendeMethode() anstatt auf zuTestendeMethode() zurückgreifen.
Vielen Dank für jede Hilfe.
Klaus