JUnit - Optimierung der Testklassen

PHANTOMIAS

Aktives Mitglied
Hallo an alle!

Ich habe einige JUnit-Testklassen und drei statische Methoden darin sind immer gleich. Nun wäre es wohl angebracht diese Redundanz zu entfernen, aber wie macht man das am Besten?

Das sind die Methoden:
Java:
// Diese Methode soll in der Testklasse bestehen bleiben, hier werden unterschiedliche Dinge getan
@BeforeClass
public static void init() throws Exception {
	...
	// Aufruf der Methode in der Testklasse
	doSetup();
}

private static void doSetup() throws Exception {
	final IDatabaseConnection conn = getConnection();
	final IDataSet data = getDataSet();
	try {
		DatabaseOperation.CLEAN_INSERT.execute(conn, data);
	} finally {connection.close();}
}

private static IDataSet getDataSet() throws IOException, DataSetException {
	return new FlatXmlDataSetBuilder().build(new FileInputStream("database.xml"));
}

private static IDatabaseConnection getConnection() throws ClassNotFoundException, SQLException {
	Class.forName("com.mysql.jdbc.Driver");
	try {
		return new DatabaseConnection(DriverManager.getConnection("jdbc:mysql://localhost/testdb", "root", "passwort"));
	} catch (DatabaseUnitException e) {e.printStackTrace();}
	return null;
}
Wie kann ich diese auslagern? Wenn ich vererbe mit einer Oberklasse Test, so findet der Aufruf doSetup() nicht die Methode in der Oberklasse.

Jemand eine Idee?

Danke & Gruss PHANTOMIAS
 
M

maki

Gast
Eine Utility Klasse welche die 3 statischen Methoden enthält wäre eine Möglichkeit.

Nebenbei, wenn du die DB nur im @BeforeClass initalisierst, solltest du nur lesende Tests machen, sonst ändern sich die Daten von Test zu Test, und letztere sollten immer unabhängig voneinander sein.

Ansonsten kannst du ja noch den Weg einschlagen vor jedem Testcase die DB zu initialisieren, dann brauchst du diese Methoden auch nicht mehr statisch, solltest dann aber unbedingt einen ConnectionPool verwenden, oder du initalisierst eben in deinr @BeforeClass Methode die DB, aber erzeugst dafür ein Objekt.
static ist einschränkend wenn es um Vererbung geht.
 
B

bygones

Gast
mich verwirrt die Datenbank connection in einem Unit test ?
willst du nicht eher ein integrationsttest machen ?

wenn deine Funktionalität irgendwas aus einer DB braucht um zu funktionieren schau dir mal lieber Mocks/Spys etc an.

eine offene DB in einem unittest ist mehr als verdächtig...
 

fastjack

Top Contributor
Ich kann für DB-Tests HSQL empfehlen, das geht noch ein Zacken schneller und Du brauchst keinen Datenbankserver aufzusetzen oder zu benutzen.

edit: ansonsten Mocken, aber irgendwann möcht man ja mal die DB-Funktionalität testen.
 

fastjack

Top Contributor
Wo wird denn die Korrektheit der Datenbankzugriffe sonst getestest? Ich verwende dazu DBUnit und HSQL (setzt natürlich voraus, das der Datenbanklayer mehr als nur einen DB-Dialekt unterstützt.
 
M

maki

Gast
bygones hat schon recht, das ist kein Unittest mehr, sondern ein Integrationstest, dafür auch DBUnit.

Ansonsten bleibt das gesagte aber gültig, irgendwie muss man ja die DB testen, und da dieser Test eben die DB braucht, ist es ein Integrationstest.
 

PHANTOMIAS

Aktives Mitglied
Vielen Dank für eure vielen Antworten. Ich werde mal darauf eingehen:

Eine Utility Klasse welche die 3 statischen Methoden enthält wäre eine Möglichkeit.
Habe ich so nun gemacht, funktioniert einwandfrei, danke!

Nebenbei, wenn du die DB nur im @BeforeClass initalisierst, solltest du nur lesende Tests machen, sonst ändern sich die Daten von Test zu Test, und letztere sollten immer unabhängig voneinander sein.
Man erkennt mich als Laien wohl schneller als erwartet :) Ich habe vor ein paar Monaten schon mal damit begonnen mich mit dem Testen auseinanderzusetzen, dann eine Pause eingelegt, und nun geht es weiter. Und ja, ich setze einmal pro Testklasse die Datenbank neu auf. Ist es besser das vor jeder Funktionalität (Methode) zu machen? Falls ja, wie geht das? ConnectionPool sagt mir in diesem Zusammenhang (noch) nichts.

Ich nutze JUnit / DbUnit zum Testen meiner Services.
Ich dachte mit einem Unit-Test, testet man eine Einheit? Und der Test eines Service ist für mich eigentlich eine Einheit mit der Datenbank zusammen?

Ist das nur eine Begrifflichkeit oder sollte man nicht JUnit dafür verwenden?
 
M

maki

Gast
Ich dachte mit einem Unit-Test, testet man eine Einheit?
Eben.

Und der Test eines Service ist für mich eigentlich eine Einheit mit der Datenbank zusammen?
Eben nicht.

"Mit der Datenbank zusammen" oder "mit dem Dateisystem" etc. sind sog. Integrationstests, weil abhängigkeiten über Systemgrenzen hinaus benötigt werden.
Ein isolierter Unittest würde, wie schon bereits erwähnt wurde, Mockobjekte oder Stubs nutzen.

Man kann JUnit auch dafür verwenden, kein Problem.
Integrationstests sind meist langsamer und komplexer.

Ist es besser das vor jeder Funktionalität (Methode) zu machen?
Was heisst "besser", entweder richtig oder nicht.
Wenn eine deiner Testcases in die DB schreibt (INSERT, UPDATE, DELETE) und dann deren Werte ändert, beeinflusst das einen anderen deiner Testcases?
Was ist, wenn ein Testcase fehlschlägt, beeinflusst dass einen anderen Testcase?

Falls ja, wie geht das?
@Before kennst du?

ConnectionPool sagt mir in diesem Zusammenhang (noch) nichts.
Dann wird es aber Zeit, gehört zum JDBC Standard.
Musst aber erst feststellen ob dir die Tests ohne nicht doch schnell genug sind.
 

fastjack

Top Contributor
"Mit der Datenbank zusammen" oder "mit dem Dateisystem" etc. sind sog. Integrationstests, weil abhängigkeiten über Systemgrenzen hinaus benötigt werden.
Ein isolierter Unittest würde, wie schon bereits erwähnt wurde, Mockobjekte oder Stubs nutzen.

Man kann JUnit auch dafür verwenden, kein Problem.
Integrationstests sind meist langsamer und komplexer.

recht haste!
 

PHANTOMIAS

Aktives Mitglied
Da hast du vollkommen recht mit: Schlägt einer fehl, so hat das Konsequenzen für die nachfolgenden Testmethoden und das sehe ich ein, das ist ganz und gar nicht gut.

Ich habe nun das doSetup() aus der @BeforeClass herausgenommen und eine neue Methode folgendermaßen eingebunden:

Java:
@Before
public void setupBeforeMethod() throws Exception {
    MyTestUtil.doSetup();
}

Nun wird vor jeder Test-Methode die Datenbank neu eingespielt.

Okay, ConnectionPool bedeutet, dass Datenbankverbindungen aktiv bleiben und aus einem Pool eine offene genommen werden kann. Das steigert dann die Geschwindigkeit. Also für meine Mini-Anwendung mit gerade mal 6 Datenbanktabellen ist es ausreichend. Habe eventuell nur daran gedacht eine HSQLDB zu nehmen, aber die Geschwindigkeit ist i.O., die Tests dauern insgesamt weniger als 5 Sekunden.

Gruß PAHNTOMIAS
 

fastjack

Top Contributor
Die Tests sollen untereinander unabhängig sein und sich auch nicht gegenseitig beeinflussen können (jeder Test soll einen definierten Startzustand haben).
HSQL ist wirklich sehr easy zu benutzen, einfach die JAR einbinden, die Connection holen und schon läuft der HSQL-Server. Ich habe mal in einer Firma gearbeitet, da sind die Integrationstest um die halbe Stunde lang gelaufen. Nachdem Einbau von HSQL konnte man die Integrationstests minütlich zünden :)
 

timbeau

Gesperrter Benutzer
Jo, aber ob 10 oder 2 ist bei 10 Tests schon ein Unterschied.

Ich nutze Hibernate und H2 auch als Memory-DB in Tests und man merkt schon den Unterschied zwischen File-Db oder Mem-DB.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W junit.Test not accessible? Java Basics - Anfänger-Themen 4
6 Best Practice Feedback zu Service / JUnit Tests Java Basics - Anfänger-Themen 3
M Anfängerfehler - Tests JUnit IntelliJ Java Basics - Anfänger-Themen 24
D Cannot find JUnit.framework Java Basics - Anfänger-Themen 1
W Junit-Test (Java) Java Basics - Anfänger-Themen 4
W Testfälle bei Java ( Junit-Test) Java Basics - Anfänger-Themen 3
U JUnit testen auf SomeException Java Basics - Anfänger-Themen 5
U jUnit 5 Test für eine addMethode Java Basics - Anfänger-Themen 18
A JUnit testing is inkonsistent Java Basics - Anfänger-Themen 12
A Junit Test für MysqlDataSource JDBC Java Basics - Anfänger-Themen 3
A Test Junit Java Basics - Anfänger-Themen 1
H Junit test Java Basics - Anfänger-Themen 12
P Methoden JUnit 4 - Test Java Basics - Anfänger-Themen 6
P Probleme mit JUnit-Tests, es kommt was anderes raus als bei manuellen Tests Java Basics - Anfänger-Themen 5
Y Wie kann ich Konsoleneingaben durch den Scanner mit JUnit 4 testen? Java Basics - Anfänger-Themen 1
B JUnit 4: Wie man die eigene Liste testen kann [TDD] Java Basics - Anfänger-Themen 46
N Fehler bei JUnit Test Java Basics - Anfänger-Themen 5
W JUnit Tests Java Basics - Anfänger-Themen 4
hello_autumn Klassen Anzahl sowie die Anzahl der Junit Tests ermitteln? Java Basics - Anfänger-Themen 8
B JUnit / Exceptions/ try-catch Java Basics - Anfänger-Themen 6
L JUnit tests in java Java Basics - Anfänger-Themen 5
N JUnit und private Methoden testen. Java Basics - Anfänger-Themen 9
F JUnit - Was ist mit "side effects" gemeint ? Java Basics - Anfänger-Themen 2
H JUnit in Eclipse: java.lang.NoClassDefFoundError: Java Basics - Anfänger-Themen 9
B JUnit Test erstellen Java Basics - Anfänger-Themen 6
W Problem bei JUnit Test Aufgabe Java Basics - Anfänger-Themen 15
L Junit Testing bei XML? Java Basics - Anfänger-Themen 3
J LocalDateTime testen mit Junit Java Basics - Anfänger-Themen 20
W JUnit Test und HashCode Java Basics - Anfänger-Themen 14
A Objekt in Methode zurückgeben, JUnit zeigt Error Java Basics - Anfänger-Themen 2
A Kfz - Händler Klasse. JUnit-Test gibt noch Fehler an, aber finde Ursache nicht Java Basics - Anfänger-Themen 7
O JUnit - Objektreferenzen Java Basics - Anfänger-Themen 3
G Testen mit JUnit Java Basics - Anfänger-Themen 4
B Palindrom Test mit Junit Java Basics - Anfänger-Themen 23
C JUnit Tests. How to Java Basics - Anfänger-Themen 5
S Junit Test Java Basics - Anfänger-Themen 2
shiroX Klassen Klasse/Methode private final jUnit-Fehler Java Basics - Anfänger-Themen 5
L Junit Tests Java Basics - Anfänger-Themen 10
A IllegalArgumentException in JUnit testen Java Basics - Anfänger-Themen 3
V ToString-Methode mit JUnit testen(BlueJ) Java Basics - Anfänger-Themen 10
shiroX Methoden JUnit-Test einer void-Methode Java Basics - Anfänger-Themen 4
V JUnit Klassen Java Basics - Anfänger-Themen 3
T Junit Mockito: Instanz von inneren erzeugten Objekten Java Basics - Anfänger-Themen 4
S JUnit - Swing- Anwendung wird nicht neu gestartet Java Basics - Anfänger-Themen 0
B Binäre Suche - Junit Test Java Basics - Anfänger-Themen 6
S Kommt es zu Seiteneffekten wenn man waehrend den laufenden JUnit Tests den Code aendert? Java Basics - Anfänger-Themen 2
M JUnit Testmethoden mit mehreren assert Methoden Java Basics - Anfänger-Themen 1
S Double und Gleitkommazahlen mit JUnit testen Java Basics - Anfänger-Themen 7
K JUnit: Objekte von eigenen Klassen vergleichen...geht nicht Java Basics - Anfänger-Themen 5
Z JUnit Exception Java Basics - Anfänger-Themen 2
M Verständnisfrage zu JUnit Tests und private Methoden Java Basics - Anfänger-Themen 3
M Ist die Hamcrest Bibliothek auch schon in Junit 4.11 verfügbar? Java Basics - Anfänger-Themen 1
S Unterschied .jar Datei ausführen und junit Testfall... Java Basics - Anfänger-Themen 3
M Reihenfolge von Testmethoden in JUnit beeinflussen Java Basics - Anfänger-Themen 2
S Separate Funktion für JUnit-Test Java Basics - Anfänger-Themen 3
G JUnit-Tests im Programmdurchlauf starten Java Basics - Anfänger-Themen 4
T Best Practice JUnit: Wie Klassen durch Stubs/Mockups ersetzen Java Basics - Anfänger-Themen 7
T JUnit test failed Java Basics - Anfänger-Themen 3
M Junit Tests durchführen, die eine Verbindung zu einer Daten erfordern Java Basics - Anfänger-Themen 3
T Junit in Eclipse Java Basics - Anfänger-Themen 1
P JUnit bedeutungen Java Basics - Anfänger-Themen 3
R JUnit Test mit einer Dateistruktur als Testparameter Java Basics - Anfänger-Themen 3
shiroX OOP Array kleinste Zahl mit jUnit test Java Basics - Anfänger-Themen 3
S JUnit assertEquals funktioniert nichgt wie es sollte :( Java Basics - Anfänger-Themen 7
V Frage zu JUnit Tests Java Basics - Anfänger-Themen 3
B JUnit für JFileChooser Java Basics - Anfänger-Themen 6
S Code stimmt nicht für vorgegebenen JUnit-Test Java Basics - Anfänger-Themen 2
S File vergleich - Junit Java Basics - Anfänger-Themen 6
T JUnit Java Basics - Anfänger-Themen 18
G Junit Java Basics - Anfänger-Themen 4
X JUnit testing Java Basics - Anfänger-Themen 7
T JUnit Suite frage Java Basics - Anfänger-Themen 6
R JUnit Test mit mehrfach ausgeführt Java Basics - Anfänger-Themen 6
S InvocationTargetException bei JUnit Testlauf Java Basics - Anfänger-Themen 2
B JUnit - Mini-Test Java Basics - Anfänger-Themen 9
T Unterschied zwischen Integrationstest und JUnit test? Java Basics - Anfänger-Themen 12
Y Junit Test - Testwert ändert sich Java Basics - Anfänger-Themen 12
T Junit --Exception testen Java Basics - Anfänger-Themen 15
A JUnit Tests in Jar-Archiv packen Java Basics - Anfänger-Themen 2
G Erste Schritte JUNIT Regressionstests automatisieren Java Basics - Anfänger-Themen 2
M JUnit - nur einzelne Methode testen? Java Basics - Anfänger-Themen 4
M JUnit - nur Failures loggen? Java Basics - Anfänger-Themen 2
S Hilfe zu Java-Programm und JUnit Test!! Java Basics - Anfänger-Themen 5
T JUNit Test IOException Java Basics - Anfänger-Themen 5
R String Replace für JUnit Java Basics - Anfänger-Themen 19
T JUNIT Nullpointerexception Java Basics - Anfänger-Themen 3
M JUNIT tests mit ant script ausführen Java Basics - Anfänger-Themen 4
S [JUnit] eigener Testsuite Runner + Ausgabe Java Basics - Anfänger-Themen 6
S [JUnit] Print Results while running Java Basics - Anfänger-Themen 6
W Mit jUnit Array testen? Java Basics - Anfänger-Themen 5
T Junit Tests Java Basics - Anfänger-Themen 7
I JUnit Datapoints für mehrere Testklassen Java Basics - Anfänger-Themen 4
Spin JUNIT Test Case - Problem bei testen Java Basics - Anfänger-Themen 2
T brauche HILFE beim Junit test:eek: Java Basics - Anfänger-Themen 11
M Junit tests gehen nicht Java Basics - Anfänger-Themen 2
E OOP einfache Array Aufgabe mit jUnit Java Basics - Anfänger-Themen 5
L JUNIT Testing Java Basics - Anfänger-Themen 3
C jUnit: Erfahren, ob der getestete Code eine Exception gehandelt hat Java Basics - Anfänger-Themen 3
timbeau JUnit Test Dauer speichern/loggen Java Basics - Anfänger-Themen 16
turmaline JUnit testen ob keine Exception auftritt Java Basics - Anfänger-Themen 23

Ähnliche Java Themen

Neue Themen


Oben