Prezentace se nahrává, počkejte prosím

Prezentace se nahrává, počkejte prosím

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

Podobné prezentace


Prezentace na téma: "Jednotkové testy pracující s databází David Möhwald Pavel Groll."— Transkript prezentace:

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

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

3 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í

4 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() { }

5 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

6 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...

7 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...

8 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) }

9 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 )

10 XML datafile

11 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")); }

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

13 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()); }

14 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 }

15 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()); }

16 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 }

17 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í

18 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


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

Podobné prezentace


Reklamy Google