Oracle DBUnit/JUnit auf Oracle mit verschiedenen Schemata?

huhn57

Mitglied
Hi zusammen,
ich schreibe gerade JUnit-Tests für meine Java-Anwendung. Jetzt habe ich beispielsweise eine Methode wie diese hier:

Java:
    public static void test() {
        final String sqlStatement = "insert into test(id, text) values (1, 'hallo')";
        try {
            Connection conn = Hilfsklasse.getConnection([I]DatenbankschemaProd[/I]);
            final Statement stat = conn.createStatement();
            stat.executeUpdate(sqlStatement);
            conn.commit();
            stat.close();
            Hilfsklasse.closeConnection(conn);
        } catch (final SQLException e) {
            System.out.println(e.getMessage());
        }
    }

Wie gesagt, nur ein einfaches Beispiel, aber hier greife ich auf ein Oracle-Schema "DatenbankschemaProd" zu, in dem die Tabelle "test" liegt.

Wenn ich einen simplen JUnit-Test für diese Methode schreibe, stehen hinterher natürlich zwei gleichlautende Datensätze in der Tabelle "test". Von daher möchte ich an dieser Stelle gerne mit DBUnit arbeiten: im setUp eine leere Tabelle (z.B. im Datenbankschema "test") erzeugen, dann in einem JUnit-Test die Methode aufrufen und prüfen, ob der Datensatz hinzugefügt wurde, und im tearDown die Tabelle wieder leeren/löschen etc.

So weit auch so gut. Mein Problem ist: rufe ich in einem Test diese Methode auf, erfolgt hier natürlich der Zugriff auf das "DatenbankschemaProd" und nicht, wie ich es gerne hätte, auf die von mir für den Test erzeugte Tabelle. Vielleicht habe ich auch gerade ein großes Brett vorm Kopf, aber wie müßte ich meine Methode umstellen, um den von mir gewünschten Effekt zu erreichen? Das Datenbankschema als Parameter zu übergeben ginge zwar auch, fände ich aber nicht so schön.

Bin für jede Anregung dankbar!

Viele Grüße vom Huhn
 
M

maki

Gast
Wieso hantierst du mit SQL Code & JDBC, wenn DBUnit doch Datasets und DatabaseOperation unterstützt?
Datasets erstelle ich immer als Strings, nicht in (XML) Dateien.
Dein try/catch Block ist sehr schlecht für Tests, eigentlich ungeeignet, lass ihn weg ;)

Ansosnten sollte doch kein eigenes Schema für den Test auf der Prod DB erzeugt werden, nimm eine eigene DB fürs Testen.
 

huhn57

Mitglied
Sorry, habe mich mißverständlich ausgedrückt...

Die Beispielmethode von oben ist keine Testmethode (das wäre auch schön doof), sondern die Methode, die ich testen möchte. Ich habe sie aus Übersichtsgründen ein bißchen gekürzt und natürlich eine andere Datenbankabfrage genommen.

Die zugehörige Testklasse sieht dann z.B. so aus:

Java:
public final class TestTestklasse extends DatabaseTestCase {

   ...

    @Test
    public void testTestmethode() {
        ...
    }

Hoffe, das war jetzt klarer :)
 
M

maki

Gast
Im Prod code ein Schema fest vorzugeben ist keine gute Idee, sonst tut man sich sehr schwer mit dem Testen/Entwickeln.
Sowas sollte über Konfiguration (XML/Properties Dateien) gesteuert werden, sowie die restlichen Angaben (Server, User & Passwort) auch.
Was ich über DatabaseOperastion & Datasets sagte stimmt übrigens immer noch ;)
 

huhn57

Mitglied
Die Zugriffsdaten für Entwickler- und Prod-Schema sind in .properties-Dateien gespeichert. Nur würde ich gerne ein anderes Schema verwenden als das Schema, das gezogen wird, wenn ich die Tests lokal starte. D.h. hier sollte nach Möglichkeit eine andere properties-Datei gezogen werden. Oder kann man sowas in einem ant-Task definieren?

Zum Thema Datasets und DatabaseOperation:
ich war bisher der Ansicht, dass es sinniger ist, die ausgeführten Methoden direkt zu testen, als mit DatabaseOperations die Operationen auf einer Tabelle zu testen. Vor allem dann, wenn ich in meiner Methode noch Eingabeparameter habe, die ich vorher auf Plausibilität teste. Oder sehe ich das falsch?
 
M

maki

Gast
Die Zugriffsdaten für Entwickler- und Prod-Schema sind in .properties-Dateien gespeichert. Nur würde ich gerne ein anderes Schema verwenden als das Schema, das gezogen wird, wenn ich die Tests lokal starte. D.h. hier sollte nach Möglichkeit eine andere properties-Datei gezogen werden. Oder kann man sowas in einem ant-Task definieren?
Wie jetzt?
Du kannst das konfigurieren, möchtest die Konfiguration aber ignorieren?
Vielleciht verstehe ich dich da wieder falsch...
Auch mit Ant kann man für die Tests verscheidene Propertydateien nutzen.

um Thema Datasets und DatabaseOperation:
ich war bisher der Ansicht, dass es sinniger ist, die ausgeführten Methoden direkt zu testen, als mit DatabaseOperations die Operationen auf einer Tabelle zu testen. Vor allem dann, wenn ich in meiner Methode noch Eingabeparameter habe, die ich vorher auf Plausibilität teste. Oder sehe ich das falsch?
Da siehst du etwas falsch.
Es geht nicht um den eigentlichen Test (Exercise), sondern um das Setup und den Teardown.
Du willst ja jeden deiner Tests auf einem vordefinierten Zustand von Daten ausführen lassen.
 

huhn57

Mitglied
Ich scheine heute echt Probleme zu haben, mich auszudrücken :oops:

Die Standard-properties-Datei wird geladen, wenn ich das Projekt lokal starte. Dort sind die Zugangsdaten für die Test-Datenbank hinterlegt. Ich würde für JUnit/DBUnit gerne noch eine andere Datenbank nehmen. Kann auch gerne über ein ganz anderes DBMS laufen, z.B. HSQLDB. Egal was, so, wie die Methode aufgebaut ist, funktioniert das ja nicht. Vielleicht muß ich auch komplett die Struktur in meiner Anwendung ändern?

Hast du ein Beispiel, wie man eine properties-Datei nur für JUnit/DBUnit über ant hinterlegen kann?

Okay, ich habe mir eine solche Testklasse wie folgt gedacht:
- setUp: Erstellen/Leeren einer Datenbanktabelle, ggf. mit benötigten Testdaten füllen
- tearDown: Leeren/Löschen der Tabelle
- eine Testmethode (Bsp.): Funktion ausführen, Zustand der Tabelle (nach Insert/Update/Delete) bzw. erhaltenes Suchergebnis aus Select prüfen

Ist das vom Grundsatz her verkehrt?

Danke dir schonmal ganzherzlich für deine Geduld!
 
M

maki

Gast
Jetzt wirds klarer :)

Mit Ant arbeite ich seit Jahren nicht mehr, (nutze Maven2), sollte sich aber per Google finden lassen.

Okay, ich habe mir eine solche Testklasse wie folgt gedacht:
- setUp: Erstellen/Leeren einer Datenbanktabelle, ggf. mit benötigten Testdaten füllen
- tearDown: Leeren/Löschen der Tabelle
- eine Testmethode (Bsp.): Funktion ausführen, Zustand der Tabelle (nach Insert/Update/Delete) bzw. erhaltenes Suchergebnis aus Select prüfen
Ja, so in etwa, nochmals langsam:
Sog. 4 Phasen Tests bestehen aus 4 Phasen (*g*)
1. Setup - alles was der Test braucht wird hier bereitgestellt, zB. Schema, Tabellen und Daten
2. Exercise - die zu testende Methode wird aufgerufen
3. Verify - Die Ergebnisse werden überprüft
4. Teardown - hier wird aufgeräumt (Schema, Tabellen und/ oder Daten, je nachdem)

DBUnit bietet Unterstützung für alle diese Phasen, kannst es natürlich auch alles selber machen.

Noch als Tipp: Back Door Manipulation at XUnitPatterns.com
Bei "Example: Back Door Fixture Setup " wird es imho für dich interessant, das drumherum solltest du auch verstanden haben.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
N DBUnit und null Datenbankprogrammierung 6
J JUNIT und CRUD-Datenbank Datenbankprogrammierung 4
turmaline Oracle Testen DB-Background-Jobs mit JUNit Datenbankprogrammierung 10
A No persistance provider JUNIT Datenbankprogrammierung 5
P Hibernate -> Probleme bei n:m-Relation und JUnit Datenbankprogrammierung 10
D Mittels JUnit Reihe von DAOs testen Datenbankprogrammierung 10
S Das printen der Ausgabe des Oracle-SQL-Statements in der Java-Eclipse-Konsole funktioniert nicht Datenbankprogrammierung 6
S Den letzten Eintrag aus Datenbank ziehen (Oracle SQL Dev.) Datenbankprogrammierung 14
S Oracle DB-Connection in .jar file ändern Datenbankprogrammierung 11
D Oracle Gateway oder Relay-Server Datenbankprogrammierung 5
N Oracle SQL - Nächst kleineren Namen2 zu einem Namen aus einer Tabelle Datenbankprogrammierung 3
M Oracle SQL Zeitabstand in Tagen Datenbankprogrammierung 11
P Datenbank Tool - besser als oracle SQL Developer gesucht mit effizinte Verbindungsverwaltung Datenbankprogrammierung 2
X JPA (EclipseLink) und Oracle Datenbank Datenbankprogrammierung 2
H Oracle Resize eines Images in Java und Rückgabe des Image als BLOB an die Oracle Datebank Datenbankprogrammierung 14
H Java Class zum komprimieren von Jpeg-Images zum Einbinden in Oracle DB - Bild als blob (in und out) Datenbankprogrammierung 23
L Oracle Oracle Datumsspalte auslesen Datenbankprogrammierung 5
L Oracle Daten von Oracle zu MSSQL übertragen Datenbankprogrammierung 4
L LOAD DATA INFILE mit Oracle Datenbankprogrammierung 24
D Abfrage - Spalte(Datum) ändern (Oracle) Datenbankprogrammierung 7
L Oracle Datenbank über Java aufrufen Datenbankprogrammierung 29
R ERModel der Datebanken (ORACLE,MySQL,MS-SQL usw) Datenbankprogrammierung 4
I Datenbankverbindung Oracle DB klappt nicht - getConnection returned null Datenbankprogrammierung 8
R DB2 Oracle 12 - invalid username/passwort Datenbankprogrammierung 1
AssELAss Verbindung i5 Series 7.1 / 7.2 (DB2) mit Oracle SQL Developer Datenbankprogrammierung 3
C Von Oracle zu Couchbase Datenbankprogrammierung 1
E Was sind die Vorteile von DB2 im Gegensatz zu einer Oracle-Datenbank? Datenbankprogrammierung 5
R Oracle jdbc Zugriff auf Oracle Datenbankprogrammierung 2
B No suitable driver found for jdbc:oracle:thin:@$HOST:$PORT:$SID Datenbankprogrammierung 7
S Oracle Database 11g , eclipse , Tabelle erstellen Datenbankprogrammierung 2
0 JDBC Oracle Verbindungsaufbau Datenbankprogrammierung 6
Q Oracle Linux: ClassNotFoundException: oracle.jdbc.driver.OracleDriver Datenbankprogrammierung 6
F Oracle Oracle JDBC Anbindung unter Glassfish 3.1.2 Datenbankprogrammierung 3
P Oracle Hibernate - Oracle-VarChar-Index wird nicht genutzt Datenbankprogrammierung 3
Kenan89 Oracle passwortspalte Datenbankprogrammierung 2
Kenan89 Oracle Daten einer Tabelle in Array speichern Oracle Datenbankprogrammierung 10
S Problemme mit oracle Datenbankprogrammierung 13
H Oracle Hibernate + Oracle Datenbankprogrammierung 3
c_sidi90 JDBC Oracle Connection schlägt fehl Datenbankprogrammierung 2
D Oracle SQL Ergebnis anzeigen und Applet Fehlermeldung Datenbankprogrammierung 12
1 Java - Oracle Restore Point Datenbankprogrammierung 2
X Rollback mit Savepoint funktioniert auf Oracle nicht (ORA-01086) Datenbankprogrammierung 4
E Datenbankverbindung mit Oracle JDBC und Eclipse Plugin Quantum db Datenbankprogrammierung 2
M Kann Oracle Datenbanktreiber nicht laden Datenbankprogrammierung 5
F Performance-Tool für Oracle Datenbankprogrammierung 2
Dit_ Oracle Oracle DB | Installation Datenbankprogrammierung 3
T Datum anpassen in Oracle Datenbankprogrammierung 5
R Oracle Java -> Tomcat -> Oracle Datenbankprogrammierung 4
M Oracle Probleme mit dem anbinden einer Oracle 10g Datenbank Datenbankprogrammierung 27
G Stored Procedure in Oracle, Txt erzeugen Datenbankprogrammierung 9
G Oracle Zeile löschen Datenbankprogrammierung 2
G Auf Oracle Schema Name zugreifen Datenbankprogrammierung 7
G INSERT DATE in Oracle-DB Datenbankprogrammierung 11
J Oracle oder SQL-Server Datenbankprogrammierung 18
A Oracle Session Parameter per JDBC? Datenbankprogrammierung 14
Z [ORACLE] Ausgabe Tabelle im GUI Datenbankprogrammierung 4
S Oracle Trigger Datenbankprogrammierung 5
cosmic Problem beim Update einer Oracle DB Datenbankprogrammierung 7
L JDBC Oracle Datenbankprogrammierung 2
N Oracle DB liefert nicht alle Datensätze Datenbankprogrammierung 3
H Oracle - Indizes werden nicht genommen Datenbankprogrammierung 6
P Probleme mit Oracle Timestamp Datenbankprogrammierung 3
A Loader-Dateien in Oracle Datenbankprogrammierung 4
G Oracle DB Link Datenbankprogrammierung 3
padde479 Connection String Oracle Datenbankprogrammierung 5
S Oracle Abfrage mit Platzhaltern Datenbankprogrammierung 3
D Oracle Datenbank exportieren Datenbankprogrammierung 3
Q admin tool für oracle datenbank - freeware Datenbankprogrammierung 7
G Blob aus Oracle-Datenbank Datenbankprogrammierung 2
J jdbc Oracle Connection refused Datenbankprogrammierung 6
S Oracle JDBC Treiber Problem Datenbankprogrammierung 4
J Bild in Oracle Datenbank - Grundkurs Datenbankprogrammierung 7
M Verbindung zu Oracle DB Datenbankprogrammierung 4
G Float Problem Java Oracle Datenbankprogrammierung 4
O Vector als Blob in Oracle Datenbank speichern Datenbankprogrammierung 3
O Oracle 11g wirft bei 90 % der installation eine Exception ? Datenbankprogrammierung 5
W ID des letzten eingefügten Werts ermitteln (Oracle) Datenbankprogrammierung 4
ARadauer Date Problem bei Oracle DB Datenbankprogrammierung 4
R oracle Anbindung geht im jar nicht Datenbankprogrammierung 8
D Insert Oracle BLOB Datenbankprogrammierung 1
O Oracle Client Software für ojdbc5! Datenbankprogrammierung 1
Y ORACLE - Autoincrement funktioniert nicht Datenbankprogrammierung 2
E Ein If und ein SELECT in Oracle? Datenbankprogrammierung 2
M Problem mit SUBSTR (Oracle) bzw. substring (Java) Datenbankprogrammierung 13
J Fehler bei Oracle-Datenbankverbindung Datenbankprogrammierung 2
E [SQL, Oracle] Zeile einfügen Datenbankprogrammierung 8
G Connection zu einer Oracle DB erstellen Datenbankprogrammierung 8
L Oracle: PL/SQL und Java Datenbankprogrammierung 3
K Oracle XE Connection Problem Datenbankprogrammierung 2
T INSERT-Befehl in Java für Oracle Datenbankprogrammierung 4
G Oracle-Record auslesen Datenbankprogrammierung 2
E JDBC Oracle Fehler, zugriff auf datenbank (Cluster) Datenbankprogrammierung 5
H Oracle - Partionierung von Tabellen Datenbankprogrammierung 4
H Oracle XE 10 mit Java Datenbankprogrammierung 4
B Oracle Driver Probleme Datenbankprogrammierung 2
R ResultSet liefert oracle.sql.TIMESTAMP, aber unbrauchbar Datenbankprogrammierung 9
thE_29 Speicherplatz von Oracle DB Datenbankprogrammierung 2
D Problem beim Zugriff auf eine Oracle-DB Datenbankprogrammierung 23
G Single Sign On bei Oracle Datenbankprogrammierung 3
E Jar File: NoClassDefFoundError: oracle/sql/ORAData Datenbankprogrammierung 2

Ähnliche Java Themen

Neue Themen


Oben