db Unit Frameworka JUnit Extension Moka Badertscher Jonas
db. Unit Frameworka JUnit Extension Moka Badertscher, Jonas Rüttimann, 21. 11. 2006 1/14/2022 Moka Badertscher @ infopoint 2008
db. Unit Inhalt § Einleitung § Produkt db. Unit § Datenbank Testing mit JUnit – Heikle Punkte § Interfaces Db. Unit § Verschiedene Teststrategien § Fazit: Lohnt sich der Einsatz von db. Unit? § Links § Fragen 1/14/2022 Moka Badertscher @ infopoint 2008
db. Unit Einleitung Warum wird Datenbank Zugriff getestet? § Code kann immer fehlerhaft sein § Falls Datenbank hinter Framework versteckt (z. B. Hibernate): § ein Framework kann falsch konfiguriert sein § ein Framework tut das Falsche (resp. Jemand lässt ihn das falsche tun) 1/14/2022 Moka Badertscher @ infopoint 2008
db. Unit Einleitung Wann wird Datenbank Zugriff getestet? Rational Unified Process • Objektorientiertes Prozessmodell • Metamodell für Prozessmodelle • Gleichzeitig mit UML veröffentlicht Grady Booch, Ivar Jacobson und James Rumbaugh 1/14/2022 Moka Badertscher @ infopoint 2008
db. Unit Einleitung § Warum db. Unit § Vorwissen § Herangehensweise § Ziele: § Möglichkeiten kennenlernen § kontroverse Best. Practices von Anwendern kennenlernen § 1/14/2022 auftretende Probleme oder Grenzen erkennen Moka Badertscher @ infopoint 2008
db. Unit Produkt db. Unit § Open-Source-Projekt § sourceforge. net § In welcher Form einbinden in Java? 1. Java-Projekt: als jar-File (zusätzlich jars von slf 4 j) http: //sourceforge. net/project/showfiles. php? group_id=47439&release_id=2 42511 2. Plug. In-Projekt: Plug. In Maven http: //mojo. codehaus. org/dbunit-maven-plugin/ 3. Auch mit Ant verwendbar http: //dbunit. sourceforge. net/anttask. html 1/14/2022 Moka Badertscher @ infopoint 2008
db. Unit Datenbank Testing mit JUnit Probleme § In welchem Zustand befindet sich die Datenbank nach einem Test ? § 1 Test (z. B. einer Suite) verlässt die Datenbank in inkonsistentem Zustand die folgenden Tests schlagen fehl § 1 Test braucht u. U. 5 Einträge in Tabellen viel Testcode: Fehleranfälligkeit, Wartungsaufwand bei Aenderungen 1/14/2022 Moka Badertscher @ infopoint 2008
db. Unit Lösung db. Unit Vorteil § Datenbank vor jedem Test in gewünschten Zustand bringen § Löschen von Datensätze beim Set. Up Delegiert an db. Unit § Einfügen von Daten in Testmethode Delegiert an db. Unit § Durch Delegation wenig Code, wenig Fehler, wenig Wartung 1/14/2022 Moka Badertscher @ infopoint 2008
db. Unit Datenbewegungen 1/14/2022 Moka Badertscher @ infopoint 2008
db. Unit Interfaces db. Unit Db. Unit Core Components § IDatabase. Connection - interface repräsentiert eine Db. Unit Connection zu einer Datenbank § IData. Set - interface repräsentiert mehrere Tabellen § Database. Operation – Abstrakte Klasse, repräsentiert eine Datenbank-Manipulation, die vor oder nach einem Test ausgeführt wird § Database. Connection, - wrappt eine JDBC Connection § ITable repräsentiert die Daten in einer Tabelle 1/14/2022 Moka Badertscher @ infopoint 2008
db. Unit Klasse Database. Test. Case § Konkrete Testklassen von Database. Test. Case ableiten (Unterklasse von Test. Case) § Abstrakte Klasse § Folgende Methoden müssen implementiert werden: - protected IDatabase. Connection get. Connection() - protected IData. Set get. Data. Set() 1/14/2022 Moka Badertscher @ infopoint 2008
db. Unit Klasse Database. Test. Case § get. Connection() gültige Datenbank-Connection wird geholt protected IDatabase. Connection get. Connection() { Connection conn = null; Class. for. Name("sun. jdbc. odbc. Jdbc. Odbc. Driver"); String url = "jdbc: odbc: MYSQLTESTSERVER"; conn = Driver. Manager. get. Connection(url, "root", “password"); return new Database. Connection(conn); } 1/14/2022 Moka Badertscher @ infopoint 2008
db. Unit Klasse Database. Test. Case § get. Data. Set(): von Source input. xml werden Datensätze in IData. Set der Testklasse geladen § Aufruf durch set. Up: super. Set. Up(). Muss also nicht explixit aufgerufen werden. protected IData. Set get. Data. Set() { loaded. Data. Set = new Flat. Xml. Data. Set(this. get. Class(). get. Class. Loader(). get. Resource. As. Stream("input. xml")); return loaded. Data. Set; } 1/14/2022 Moka Badertscher @ infopoint 2008
db. Unit Beispiel input. XML 1/14/2022 Moka Badertscher @ infopoint 2008
db. Unit XML File Erstellen § Von Hand § per Code aus Datenbank: extract. Tables § mit Abfrage aus Datenbank 1/14/2022 Moka Badertscher @ infopoint 2008
db. Unit Datenbank Operationen §Database. Operation §UPDATE §INSERT §DELETE_ALL TRUNCATE REFRESH CLEAN_INSERT NONE §Other Operations §Composite. Operation §Transaction. Operation §Identity. Insert. Operation 1/14/2022 Moka Badertscher @ infopoint 2008
db. Unit Abfragen § mit Db. Connection: Daten abfragen aus Datenbank und diese mit asserts prüfen § mit Abfrage Data. Set erstellen und als Flat. XMLData. Set speichern; kann später wieder in Datenbank geladen werden § Aus Abfragen direkt Spaltenwerte abfragen ohne Iteration 1/14/2022 Moka Badertscher @ infopoint 2008
db. Unit Abfragen § Beispiel 1 String query = "SELECT * FROM MEDIA WHERE ID= "+id; ITable database. Data = db. Connection. create. Query. Table("EXPECTED_DATA", query); assert. Equals(1, database. Data. get. Row. Count()); Big. Decimal foreign. Key = (Big. Decimal) database. Data. get. Value("FK_OTHER_ID"); assert. Equals(new Big. Decimal(1234)), foreign. Key); § Beispiel 2 Query. Data. Set query. Data. Set = new query. Data. Set(get. Connection()); query. Data. Set. add. Table(TABLE_NAME, "SELECT * FROM " + TABLE_NAME); Assertion. assert. Equals(loaded. Data. Set, query. Data. Set); 1/14/2022 Moka Badertscher @ infopoint 2008
db. Unit Daten vergleichen § mit assert-Methoden Datenbank Inhalt prüfen § dabei werden miteinander verglichen: a) 2 Datasets oder b) 2 Tabellenrepräsentationen Beispiele a) public static void assert. Equals(IData. Set expected, IData. Set actual); b) public static void assert. Equals(ITable expected, ITable actual); 1/14/2022 Moka Badertscher @ infopoint 2008
db. Unit Teststrategien db. Unit. Macher § use one database instance per developer § Good setup don‘t need clean. Up - nie auf vorgehendem Test aufbauen - Don't be afraid to leave your trace after a test § Use multiple small Data. Sets § Perform setup of stale data once for entire test class or test suite § Connection management strategies 1/14/2022 Moka Badertscher @ infopoint 2008
db. Unit Connection Management § Bei ODBC-Connection: unbedingt User. DSN benutzen!!! § Connection pro Testmethode - Setup: Connection erzeugen - Teardown: Connection schliessen § Kommen in einer Testklasse viele Testmethoden vor, kann pro Testklasse einzige Connection verwendet werden 1/14/2022 Moka Badertscher @ infopoint 2008
db. Unit Teststrategien Sun Developer § Don’t extend DBTest. Case • Locks you into JUnit • DBUnit lifecycle can make it more difficult to perform certain tests • Just isn’t necessary § Simply leverage the fundamental DBUnit classes 1/14/2022 Moka Badertscher @ infopoint 2008
db. Unit Zu Beachten § werden Tabellen aus einer produktiven Datenbank abgefüllt, könnten zu viele Datensätze ein Problem werden mit Query arbeiten, sodass nur eine Teilmenge der Datensätze abgefüllt wird 1/14/2022 Moka Badertscher @ infopoint 2008
db. Unit Aussagen von Anwender Beschreibung eines Software-Entwicklers, der mit dem ganzen Team db. Unit verwendete: § Daten abfüllen: zu Anfang aufwändig § Nach einer Anfangsinvestition geht es einfach, Entwickler lernen Datenbank besser kennen. 1/14/2022 Moka Badertscher @ infopoint 2008
db. Unit Fazit: Lohnt sich der Einsatz von db. Unit? § Nach Anfangsinvestition scheint Aufwand kleiner als wenn Testdaten mittels Code eingefügt werden § Handhabung recht einfach § Keine Probleme soweit gefunden § ? ? ? Sehr viele Daten 1/14/2022 Moka Badertscher @ infopoint 2008
db. Unit Links Db. Unit Framework 2. 2. 3 API http: //www. dbunit. org/apidocs/index. html Anwendungsbeispiele http: //www. ibm. com/developerworks/library/j-dbunit. html Vortrag zum Thema db. Unit http: //developers. sun. com/learning/javaoneonline/j 1 sessn. jsp? sessn=TS 5859&yr=2008&track=javaee 1/14/2022 Moka Badertscher @ infopoint 2008
db. Unit Anhang Verschiedene Implementation von Data. Set: Flat. Xml. Data. Set Streaming. Data. Set Database. Data. Set Query. Data. Set 1/14/2022 Default. Data. Set Composite. Data. Set Filtered. Data. Set Xls. Data. Set Replacement. Data. Set Moka Badertscher @ infopoint 2008
db. Unit Fragen 1/14/2022 Moka Badertscher @ infopoint 2008
- Slides: 28