Jednotkové testy pracující s databází David Möhwald Pavel Groll.

Slides:



Advertisements
Podobné prezentace
Přístup k databázím z WWW
Advertisements

Vývoj aplikací s využitím JavaFX
Základy jazyka SQL Jan Tichava
Špička v každém směru IT 3 Produktivita práce s Eclipse.
Ing. Jan Mittner MySQL Workbench 2. Základy práce s databází 3. Subversion 2.
FG Forrest, a.s. Jan Novotný iBatis SqlMaps.
 Informací se data a vztahy mezi nimi stávají vhodnou interpretací pro uživatele, která odhaluje uspořádání, vztahy, tendence a trendy  Existuje celá.
Ing. Jan Mittner Rozšíření modelu 2. Vazba 1:n 3. Vazba m:n 2.
Přednáška č. 5 Proces návrhu databáze
Průvodce pro prostorové dotazy v systému PostGIS (plugin pro OpenJUMP) Vedoucí: Ing. Jan Růžička.Ph.D. Konzultant: Ing. Aleš Daněk Diplomová práce.
„Programátor by měl být v prvé řadě líný.“. PIFovo Web API (API = Application Programming Interface)
PJV151 Vnořené a vnitřní členy mohou být členy tříd a interfejsů. Je-li X obalem Y a Y je obalem Z, pak Z získá jméno X$Y$Z - kompilací vzniknou classy.
● SWIG - Simplified Wrapper and Interface Generator ● + google a diskusní fóra ● nástroj zjednodušující (a sjednocující)
Desáté cvičení Java Core API Java Collection Framework JavaDoc.
Možnosti implementace temporálních Databází v Caché Lukáš Rychnovský
SQL Lukáš Masopust Historie  Předchůdcem databází byly papírové kartotéky  děrný štítek  1959 konference  1960 – vytvořen jazyk COBOL.
SQL Lukáš Masopust Historie  Předchůdcem databází byly papírové kartotéky  děrný štítek  1959 konference  1960 – vytvořen jazyk COBOL.
Ing. Lukáš Burkoň Debugging 2. Testování 3. Unit testy 2.
J a v a Začínáme programovat Lucie Žoltá. Odkazy - oficiální stránky (překladače, help, metody, vývojové prostředí NetBeans,...)
4IT101 Testování a ladění, dokumentace API třídy,
Tvorba webových aplikací
State. State – kontext a problém Kontext  chování objektu má záviset na jeho stavu, který se typicky mění za běhu Neflexibilní řešení  metody obsahují.
Páté cvičení Dědičnost Interface Abstarktní třídy a metody
11. Trendy ve vývoji aplikací, podporujících podnikové procesy
C# - Exceptions (výjimky)
Identity Field Radim Veselý ČVUT v Praze Radim Veselý ČVUT v Praze Michal Kouřík ČVUT v Praze
Objektové programování
Rozšíření jednouživatelské verze IS na víceuživatelskou Prezentace Diplomové práce Autor : Libor Tomášek Spoluautoři : Pobucký M., Drábek L. Vedoucí :
Jedenácté cvičení Vlákna. Java cv112 Vlákna Operační systém Mutitasking – více úloh se v operačním programu vykonává „současně“ Java Multithreading -
4IT445 – Testování a ladění v PHP Ing. Jan Mittner
Alg91 Textové soubory Na rozdíl od jiných typů souborů jsou textové soubory určené pro gramotné lidské oko. Textový soubor je posloupnost znaků členěná.
Memento. Obnovení operačního systému ( Windows | Linux...) Všichni víme, co jsou transekce v databázi Memento – zálohování databáze.
Association table mapping Jakub Chalupa Naim Ashhab ČVUT FEL A7B36ASS – Architektura SW systémů LS 2014.
Ing. Jan Mittner Životní cyklus požadavku 2. Moduly 3. Pluginy 4. Jak řešit komponenty typu menu 5. atd. 2.
KIV/PPA1 cvičení 8 Cvičící: Pavel Bžoch. Osnova cvičení Objekty v Javě Třída Konstruktor Metody Metody a proměnné třídy x instance Program sestávající.
IB111 Programování a algoritmizace
Návrh a tvorba WWW Přednáška 5 Úvod do jazyka PHP.
Databázové systémy I Cvičení č. 8 Fakulta elektrotechniky a informatiky Univerzita Pardubice 2013.
Architektury a techniky DS Cvičení č. 9 RNDr. David Žák, Ph.D. Fakulta elektrotechniky a informatiky
Dědičnost - inheritance dědičnost je jednou z forem znovupoužitelnosti dědičnost je jednou z forem znovupoužitelnosti B A Třída A je předkem třídy B Třída.
ADO – práce s databázemi
(Java) RDF APIs Jan Zemánek KIZI VŠE, Praha. Přehled Java RDF APIs Jena Download
ADO.NET – Objekt DataSet (offline scenář) Centrum pro virtuální a moderní metody a formy vzdělávání na Obchodní akademii T.G. Masaryka, Kostelec nad Orlicí.
Šesté cvičení Výjimky Balíky.
123.
Import záznamů diplomových prací nové řešení Antonín Vaishar, SUAleph, 26. –
Obchodní akademie, Ostrava-Poruba, příspěvková organizace Vzdělávací materiál/DUM VY_32_INOVACE_01B13 Autor Ing. Jiří Kalousek Období vytvoření březen.
Netrvaloppa21 Vytvořte třídu Student pro reprezentaci struktury student na ZČU. Atributy třídy budou fakulta a osobniCislo. Název třídy: Student proměnné.
Návrh podle kontraktu - klasická metodika a moderní nástroje Tomáš Pitner Masarykova univerzita v Brně Fakulta informatiky
FEL Komunikátor. Memory Leak program konsumuje operační paměť, kterou neumožňuje uvolnit o uvolnění paměti stará Garbage Collector ▫plně v režii Java.
Foreign key mapping Jakub Chalupa Naim Ashhab ČVUT FEL
Windows Presentation Foundation Ovládací prvky. Ovládací prvky Všechny standardní prvky jsou dostupné a některé nové Třídy jsou společné pro WPF System.Windows.Controls,
Kam se ubírá jazyk C#? Dr. Ing. Dalibor Kačmář Academic Developer Evangelist Developer & Platform Evangelist Group Microsoft Czech & Slovakia Anders Hejlsberg.
Service layer. Service layer – úvod Problém  Vytvoření API aplikace  Odstínění bussiness logiky a transakčního chování od zbytku aplikace  Kam s aplikační.
Databázové aplikace v Delphi
Observer Martin Dráb Návrhové vzory, Co to je?  Definuje závislost 1:N mezi objekty  Závislé objekty jsou informovány o změně stavu  Konzistentní.
Petr Chmelař UIFS FIT VUT JAVA pro PDB Kafe? Jako C++ Zrníčka 1 / 12 Java rychlokvaška pro PDB [ ]
Strategy. Motivace Různé algoritmy pro stejnou akci Hromada kódu v mnoha podmínkách Důsledky  Komplexnost  Špatná čitelnost  Těžká správa kódu  Těžka.
Proxy. Popis  Klient má přístup k nějakému objektu  Potřebujeme tento přístup ošetřit, aniž bychom přidělali klientovi práci Kontrola přístupu Vzdálený.
Template Method. Motivační příklad – reálný svět Čaj 1) Uvař vodu 2) Dej do hrnku sáček čaje 3) Zalij hrnek 4) Přisyp cukr a vymačkej citrón Káva 1) Uvař.
YOUR LOGO C# Entity Framework. YOUR LOGO  Entity framework nám poskytuje: -Vytváří objektový model na základě databázového schématu -Mapuje tabulky,
Databázové systémy přednáška 5 – Přístup na data
SOLID principy v OOP návrhu
Y36PJC Programování v jazyce C/C++
Návrhový vzor Flyweight
Abstract Factory.
Bridge.
C# přehled vlastností.
Přednáška 9 Triggery.
Composite “Spojuj a panuj”.
Transkript prezentace:

Jednotkové testy pracující s databází David Möhwald Pavel Groll

Osnova JUnit – David Möhwald DbUnit – David Möhwald Přiklad použití DbUnit – Pavel Groll Best practices – David Möhwald Zdroje

JUnit (testování jednotek programu)  Základní myšlenkou je možnost testovat jednotlivé komponenty programu nezávisle na ostatních  Jednotkou se myslí třída nebo skupina (balík) tříd poskytující jako celek určitou funkcionalitu navenek  Testy pracují tak, že si nejprve vytvoří prostředí složené z přípravků (fixture) objektů, které budou v testech figurovat, na nichž se budou spouštět testované metody a ověřovat jejich výsledky  Vytváření a spouštění testů je již dnes nedílnou součástí každého vývojového prostředí

Ukázka fragmentu JUnit testovací třídy k prověření třídy Stack public class StackTest extends JUnit.framework.TestCase { private Stack st; public StackTest(String testCaseName) { super(testCaseName); } // vytvoří přípravek, nastaví prostředí každého testu public void setUp() { st = new Stack(10); } // testuje prázdnost právě vytvořeného zásobníku public void testEmptyAfterCreation() { assertTrue("Stack should be empty after creation.", st.isEmpty()); } // testuje neprázdnost zásobníku po vložení prvku public void testPushPopEquals() { st.push("something"); assertEquals("What was pushed, must be popped...", "something", st.pop()); }... // uklidí po testu, je-li třeba public void tearDown() { }

DbUnit (testy datové vrstvy)  DbUnit je rozšířením JUnit pro testování databázových aplikací  Pomáhá řešit problémy testování db aplikací jako je uvedení prostředí před testem do vhodného stavu a po testu je “uklidit”  Lze tedy vytvořit databázi, tabulky, naplnit je daty např z XML, XLS nebo jiných zdrojů, spustit testovaný kód (který může data totálně zničit) a po skončení testu uvést opět do konzistentního stavu  DbUnit umožňují export a import dat do a z XML datasetu. Od verze 2.0, mohou pracovat s velmi velkým objemem dat (datesetem) při použití streaming modu  DbUnit umožňují také ověřovat že jsou v DB data, která odpovídají stanoveným hodnotám

Core Components  IDatabaseConnection – Interface reprezentující DbUnit spojení s DB.  IdataSet - interface reprezentujcící kolekci tabulek a práci s daty (abstract) ClassDescription DatabaseConnectionWraps a JDBC connection. DatabaseDataSourceConnectionWraps a JDBC DataSource. Implementace FlatXmlDataSetČte a zapisuje flat XML dataset XmlDataSetČte a zapisuje XML dataset odpovídající DTD. StreamingDataSetEfektivní pro načítání XML datasetu DatabaseDataSetAdaptér poskytující přístup do DB jako dataset QueryDataSetPoskytuje vysledky DB dotazů v kolekci tabulek FilteredDataSetUmožňuje pracovat s vybranými tab. datasetu XlsDataSetČte a zapisuje do Excel dokumentu...

Core Components  DatabaseOperation – abstraktní třída reprezentující operace, které jsou spoušteny před a po testu. Dvě nevíce užitečné operace jsou REFRESH a CLEAN_INSERTREFRESH CLEAN_INSERT ClassDescription DatabaseOperation.UPDATE DatabaseOperation.INSERT DatabaseOperation.DELETE DatabaseOperation.TRUNCATE Truncate tables present in the specified dataset DatabaseOperation.REFRESH Existujíci data jsou updated a non-existing jsou inserted. DatabaseOperation.CLEAN_INSERT Volá DELETE_ALL a potom INSERTDELETE_ALL INSERT TransactionOperationSpouští vše v transakčním modu...

DbUnit - jak začít... 1.Vytvořte vlastní dataset soubor. Můžete si vytvořit manuálně Flat XML dokument nebo vyexportovat data z DB 2.Vytvořte testovací třídu rozšířením DBTestCase class, která rozšiřuje Junit TestCase class. Je nutné implementovat metodu getDataSet() pro vrácení datasetu vytvořeného v předchozím kroku 3.(Optional) implementujte getSetUpOperation() a getTearDownOperation() metody. Defaultně je spouštěna CLEAN_INSERT operace 4.Implementujte vlastní testovací metody jako normální Junit DbUnit poskytují metody pro porovnání obsahu tabulek nebo datasetů public class Assertion { public static void assertEquals(ITable expected, ITable actual) public static void assertEquals(IDataSet expected, IDataSet actual) }

Příklad použití DbUnit XML datafile Metody getConnection() a getDataSet() Metody getSetUp() a getTearDown() public void createEmployee( EmployeeValueObject emplVo ) public EmployeeValueObject getEmployeeBySocialSecNum( String ssn ) public void updateEmployee( EmployeeValueObject emplVo ) public void deleteEmployee( EmployeeValueObject emplVo )

XML datafile <EMPLOYEE employee_uid='1' start_date=' ' first_name='Drew' ssn=' ' last_name='Smith' /> <EMPLOYEE employee_uid='2' start_date=' ' first_name='Nick' ssn=' ' last_name='Marquiss' /> <EMPLOYEE employee_uid='3' start_date=' ' first_name='Jose' ssn=' ' last_name='Whitson' />

getConnection() a getDataSet() protected IDatabaseConnection getConnection() throws Exception { Class driverClass = Class.forName("org.gjt.mm.mysql.Driver"); Connection jdbcConnection = DriverManager.getConnection( "jdbc:mysql:// /hr", "hr", "hr"); return new DatabaseConnection(jdbcConnection); } protected IDataSet getDataSet() throws Exception { return new FlatXmlDataSet( new FileInputStream("hr-seed.xml")); }

setUp a tearDown protected DatabaseOperation getSetUpOperation() throws Exception { return DatabaseOperation.REFRESH; } protected DatabaseOperation getTearDownOperation() throws Exception { return DatabaseOperation.NONE; }

Test vyhledání public void testFindBySSN() throws Exception{ EmployeeFacade facade = //obtain somehow EmployeeValueObject vo = facade.getEmployeeBySocialSecNum(" "); TestCase.assertNotNull("vo shouldn't be null", vo); TestCase.assertEquals("should be Drew", "Drew", vo.getFirstName()); TestCase.assertEquals("should be Smith", "Smith", vo.getLastName()); }

Test vytvoření public void testEmployeeCreate() throws Exception{ EmployeeValueObject empVo = new EmployeeValueObject(); empVo.setFirstName("Noah"); empVo.setLastName("Awan"); empVo.setSSN(" "); EmployeeFacade empFacade = //obtain from somewhere empFacade.createEmployee(empVo); //perform a find by ssn to ensure existence }

Test update public void testUpdateEmployee() throws Exception{ EmployeeFacade facade = //obtain façade EmployeeValueObject vo = facade.getEmployeeBySocialSecNum(" "); TestCase.assertNotNull("vo was null", vo); TestCase.assertEquals("first name should be Jose", "Jose", vo.getFirstName()); vo.setFirstName("Ramon"); facade.updateEmployee(vo); EmployeeValueObject newVo = facade.getEmployeeBySocialSecNum(" "); TestCase.assertNotNull("vo was null", newVo); TestCase.assertEquals("name should be Ramon", "Ramon", newVo.getFirstName()); }

Test odstranění public void testDeleteEmployee() throws Exception{ EmployeeFacade facade = //obtain façade EmployeeValueObject vo = facade.getEmployeeBySocialSecNum(" "); TestCase.assertNotNull("vo was null", vo); facade.deleteEmployee(vo); try{ EmployeeValueObject newVo = facade.getEmployeeBySocialSecNum(" "); TestCase.fail("returned removed employee"); }catch(Exception e){ //ignore }

Best practices  Uveďte Db před testem vždy do očekávaného stavu a nespouštějte více testů v jeden okamžik  Pokud pracuje na projektu více vývojářů, je snadnější, aby si každý udržoval svou lokální instanci DB  Vyhněte se závislostem na výsledcích jiného testu. Pokud se řídíte pravidlem jedna, potom nepotřebujete po testu uklízet  Snažte se nevytvářet jeden velký dataset – rozdělte jej např. podle logických celků  Pokud více testů používá jeden dataset, měl by být nahráván pouze jednou  Snažte se využívat DB pooling místo vytváření jednotlivých DB spojení

Zdroje  DbUnit  Effective Unit Testing with DbUnit  Control your test-environment with DbUnit and Anthill  Unit testing database code  IDE Tutorials CSE 219 Fall unit&pf=y unit&pf=y