JUnit

Nrobert

Mitglied
Hallo, hätte eine Frage zu JUnit (Verwende JUnit 4).
Ich habe meine Klassen in einem package und meine testklassen in einem anderen package.
In jeder Klasse befindet sich eine Angabe, also ein Beispiel was zu tun ist und zu dieser Klasse gibt es dann auch eine Testklasse (im anderen package), die überprüft ob das Beispiel richtig gelöst wurde.
Nun will ich, dass der User nicht den Testcode sieht, sondern er soll nur die TestSuite ausführen um überprüfen zu können ob das Beispiel richtig gelöst wurde. Das Problem ist jedoch, dass alle Testklassen im package sein müssen, damit ich die TestSuite erstellen kann und wenn sie alle im package sind, dann kann der Benutzer die alle sehen. Ich hab versucht in einem eigenen folder nur die class-files zu kopieren und sie so dem TestSuite zu übergeben, da bei den class_files eh nur bytecode steht und es für den benutzer unbrauchbar ist, jedoch geht das nicht. Gibt es also eine Möglichkeit den Code von den Testklassen irgendwie zu verschlüsseln oder dass im package sich nur die TestSuite-Klasse und die class_files befinden und sich die testsuite irgendiwie diese class_files holt.

P.S: verwende eclipse
 
Verschlüsseln etc. kannst du vergessen.

Bytecode kann man sehr einfach wieder zu Javacode dekompilieren, ausser natürlich man nutzt obfuscator, dann erhält man entweder unleserlichen Javacode, oder nicht-funktionierenden.

Mal doof gefragt: Warum darf man den Testcode nicht sehen?

Die Übungen/Kata die ich kenne zeigen alle den Testcode, falls vorhanden.
 
Verschlüsseln etc. kannst du vergessen.

Bytecode kann man sehr einfach wieder zu Javacode dekompilieren, ausser natürlich man nutzt obfuscator, dann erhält man entweder unleserlichen Javacode, oder nicht-funktionierenden.

Mal doof gefragt: Warum darf man den Testcode nicht sehen?

Die Übungen/Kata die ich kenne zeigen alle den Testcode, falls vorhanden.

Weil man durch die Betrachtung des Testcodes sich leichter beim Lösen der Aufgabenstellung tut
 
Dann bleibt dir wohl nichts anderes übrig, als den Testcode nicht heraus zu geben. Das erhöht außerdem die Spannung bei der Abgabe der Aufgaben 🙂
 
Weil man durch die Betrachtung des Testcodes sich leichter beim Lösen der Aufgabenstellung tut

Verstehe ich nicht ganz.

Der Testcode kann doch nur die öffentliche API abprüfen, bzw. Klassen, deren Schnittstelle komplett gefordert und spezifiziert ist. Somit ist da keine Mehrinformation enthalten.

Sonst reicht es natürlich die kompilierten Testklassen (mit oder ohne Suite) als JAR zu liefern. JUnit ist das natürlich egal.
 
Wenn der User den Testcode zu der Klasse sieht, dann tut er sich ja leichter. Z.b.: sieht er im Testcode, welche Methode verwendet wird bzw. wie die Variablen initialisiert sind bzw. bei manchen Klassen auch andere Informationen.....weil im Testcode treffe ich vorher alle Vorbereitung damit ich dann mit den Assert-Methoden auf Gleichheit überprüfen kann. Ich will die einzelnen Testklassen rausnehmen und nur die TestSuite drinnen lassen, damit er überprüfen kann, ob er die Klasse richtig nach der Angabe programmiert hat. Will dann nur die .class-Files von TestKlassen im packaga bzw in einem eclipse-ordner reintun und mit der TestSuite verlinken, weil die TestSuite braucht ja diese class-Files. Aber um eine TestSuite in Eclipse automatisch erstellenen und ausführen zu können, müssen sich die Java-Testklassen im package befinden und das will ich eig. nicht. Ich suche irgendeine Möglichkeit den Testcode von den normalen Klassen zu trennen, jedoch muss der Benutzer trotzdem seine Klasse testen können.
 
Du könntest eine Webanwendung bereitstellen, an die deine Leute (Schüler? Studenten?) ihre fertige Software schicken und dann automatisch die Tests ablaufen lässt. (Mal davon abgesehen, dass die Entwickler eigentlich ihre Unittests selber schreiben sollten...).
Wenn du ein Repository hast, in das die Quellen eingecheckt werden, könnte man das ganz einfach mit Jenkins machen. Der Server lässt die Testsuite laufen, sobald neuer Code comittet wurde und schickt das Ergebnis per Email an die Kandidaten. Der Testcode befindet sich dabei nur auf dem Server und muss nicht heraus gegeben werden.
 
Aber um eine TestSuite in Eclipse automatisch erstellenen und ausführen zu können, müssen sich die Java-Testklassen im package befinden und das will ich eig. nicht. Ich suche irgendeine Möglichkeit den Testcode von den normalen Klassen zu trennen, jedoch muss der Benutzer trotzdem seine Klasse testen können.

In meiner IDE kann ich einfach den Klassenpfad für die Tests anpassen. Die Tests (aus einem JAR) werden dann auch gefunden.

Warum muss die Suite automatisch erstellt werden? Liefer doch die Testklassen als JAR und die Suite als Source (da sieht man dann auch nichts, außer welche Klassen die Suite zusammenfasst).

Geht das nicht mit Eclipse?
 
In meiner IDE kann ich einfach den Klassenpfad für die Tests anpassen. Die Tests (aus einem JAR) werden dann auch gefunden.

Warum muss die Suite automatisch erstellt werden? Liefer doch die Testklassen als JAR und die Suite als Source (da sieht man dann auch nichts, außer welche Klassen die Suite zusammenfasst).

Geht das nicht mit Eclipse?

Je genau das will ich eigentlich machen, doch habs bis jetzt nicht geschafft.....bzw. ich weiß nicht wie ich das angehen soll
 
Zuletzt bearbeitet:
In meiner IDE kann ich einfach den Klassenpfad für die Tests anpassen. Die Tests (aus einem JAR) werden dann auch gefunden.

Warum muss die Suite automatisch erstellt werden? Liefer doch die Testklassen als JAR und die Suite als Source (da sieht man dann auch nichts, außer welche Klassen die Suite zusammenfasst).

Geht das nicht mit Eclipse?
Hallo, kannst du mir vll. erklären wie du das meinst? Ich bin noch in Programmieren ein Anfänger und wüßte gerne ich dieses Problem lösen könnte.




Mfg
Nrobert
 
Und das schon angesprochene Problem, dass man Classdateien aus JARs auch dekompilieren kann, ist dir egal?
 
Hallo, kannst du mir vll. erklären wie du das meinst? Ich bin noch in Programmieren ein Anfänger und wüßte gerne ich dieses Problem lösen könnte.




Mfg
Nrobert

Wie gesagt: Testklassen in JAR verpacken. Das JAR in den Klassenpfad des Moduls aufnehmen (wenn es geht, in den TEST-Scope) und eine Testklasse schreiben, die die Suite bildet.

Alternativ kann man das JAR auch dem Klassenpfad der Run-Konfiguration der Suite hinzufügen.

Besser kann ich es nicht erklären, weil ich kein Eclipse User bin.
 
Und das schon angesprochene Problem, dass man Classdateien aus JARs auch dekompilieren kann, ist dir egal?

Ich würde sagen, ausreichende "Sicherheit". Ich hätte auch kein Problem damit, die Testsourcen herauszugeben, wie ich oben schon sagte. Alles was eine Testklasse abtesten kann muss ja auch spezifiziert sein und ist somit kein Geheimnis.

Eine öffentliche API ist spezifiziert. Wenn konkrete Klassen gefordert sind, müssen diese auch mit Schnittstelle und Verhalten spezifiziert sein.... so what...???
 

Zurück
Oben