SlideShare a Scribd company logo
1 of 21
Download to read offline
Nástroje jednotkového testování
              seminář IBA CZ




                          Jakub Holý, 4/2010




1                                       © 2010 IBA CZ, s.r.o.
Obsah

    O čem si povíme...
         Jednotkové testování pro vývojáře
                proč
                jak
                nástroje


    ...a o čem nikoliv
            Místo jednotkového testování ve vývojovém
             cyklu (CI servery apod.)
           Jiné typy testování, jako funkční (Selenium aj.) a
            integrační (až na výjimky)




2                                                  © 2010 IBA CZ, s.r.o.
Díl 1: Co a proč?




3                       © 2010 IBA CZ, s.r.o.
Kvíz




    Jaký je nejefektivnější způsob odhalení chyb v kódu?
     a) Jednotkové testování
     b) Testování aplikace testovacím týmem
     c) Statická analýza kódu – FindBugs ap.
     d) Jiný?




                                                   Odpověď: Revize kódu


4                                               © 2010 IBA CZ, s.r.o.
Kvíz II




    Kdo někdy napsal jednotkový test s JUnit či podobnou?

    Kdo někdy použil pomocnou knihovnu pro testování ve
      specifickém prostředí nebo specifické datové
      struktury?
      (JSFUnit, XmlUnit, DbUnit, mocky, ...)




                                                  Odpověď: Revize kódu


5                                              © 2010 IBA CZ, s.r.o.
Překážky na cestě k testovacímu satori1

    Všichni víme, jak jsou testy důležité, ale nikdo to nedělá.
       Proč?
        
            Není čas (opravdu? šetří později, stojí jen 10%2)
                 Moc práce
                 Neví jak




    1)
         Zenový výraz pro stav dokonalého štěstí, volně řečeno
    2)
         Viz článek Cost of Testing: http://java.dzone.com/articles/cost-testing

6                                                                         © 2010 IBA CZ, s.r.o.
Drobné opakování...




7                         © 2010 IBA CZ, s.r.o.
Proč testovat?

    1. Nutí psát testovatelný a tedy lepší kód
          Koheze: Malé metody/třídy dělající jedinou věc
              Loose coupling (↔ DI; setDependency(..) -
               Google)
              Konfigurovatelnost (JDBC URL apod.)
       ➔       Flexibilní, hezčí, samostatný


    2. Včas najdeme chyby – čím dřív, tím levněji
               Př.: 12 x 24h čas, MobileBackup.LineReader


    3. Zlevňuje údržbu ← bezpečný refactoring




8                                                      © 2010 IBA CZ, s.r.o.
Typy testování

          Testování funkce:
            –   Vývojář: jednotkové x funkční x scenario
                (behavior) driven x integrační
            –   Uživatel: akceptační (FITT, ...)
          NFR: výkonové (stress a load)




9                                                     © 2010 IBA CZ, s.r.o.
Co a jak testovat

     Co testovat?
     Viz dřívější přednáška Petra Adámka.
             očekávané chování
             chování při nesplnění předpokladů → vede na:
               –   explicitní vyjádření předpokladů v kódu
               –   zajištění, že pokud byly mylné a nebudou tedy
                   splněny, aplikace to včas detekuje a dá
                   srozumitelně vědět → ušetřím hodiny/dny
                   zkoumání nečekaného chování
     Jak testovat?
     Pragmaticky!
             Nenechat se zaslepit pravidly – viz The Way of
              Testuvius [WoT]
             Bohužel ne vše lze otestovat
             100% pokrytí je nesmysl (gettery ap.?!)
             Paretovo pravidlo: posledních 20% je 80% práce
             Použít vždy ten pravý nástroj pro daný úkol
10                                                       © 2010 IBA CZ, s.r.o.
Díl 2: Usnadňujeme si práci




11                             © 2010 IBA CZ, s.r.o.
Základy jednotkového testování

                                    Frameworky: JUnit 3.8/4.x (lepší integrace
                                     všude) vs. TestNG (mocnější?)
                                      –   spouštění testů, výsledky, verifikace hodnot
                                      –   JUnit 4: Parametrizované testy
                                      –   JUnit 4.4: assertThat a fluent API s Hamcrestem
                                      –   prostředí: Java 5 x 1.4 x 1.4 s retroweaverem
                                    O podpoře tvorby a spouštění v IDE ...
                                    Show: Ukázka reálného kódu
                                      –   demonstrace užití a přínosu
                                      –   testing-seminar-junit/ITaxServiceTest, viz
                                          poznámky
                                    Pozn.: Že testy prošly neznamená že vše ok,
     Eclipse: JUnit runner           možná jsou jen nedostatečné!




12                                                                              © 2010 IBA CZ, s.r.o.
Co se závislostmi? (I)

     Simulujeme čili mock-ujeme
        = „náhrada předprogramovaným simulantem“
         Mockito, JMock, EasyMock
         PowerMock pro E.M./Mockito (statické m.,..)
         Groovy Gmock
         AOP




                       Simul-sestřička




13                                              © 2010 IBA CZ, s.r.o.
Co se závislostmi? (II)

     Závislosti na prostředí
           Databáze: DbUnit (a DbUnitTestSkeleton)
            Servlety: Cactus (používá JUnit 3.8.1, prý
             nefunguje s 4), Spring MockHttpServletRequest
            EJB: embeddable OpenEJB, JBoss embedded,
             EJB 3.1: embedded container
            Portlety: ?
            Web UI: ?HttpUnit, WebUnit...?, JSFUnit (nad
             Cactusem :-( ) x JBoss jsf-mock
     Závěr: Vždy se podívejte, zda neexistuje pomocná
     knihovna pro testování ve vašem prostředí.




14                                               © 2010 IBA CZ, s.r.o.
Mockito a proč si je zvolit

                         Snadnost užití – specifikujte jen co chcete
                             Jinde musíte předem specifikovat povolená volání
                             Mockuje rozhraní i třídy
                         Malé, dobře dokumentované, hezké API
 // Ukázka Mockita:
 l =                     Portováno i do Javy 1.4
 mock(List.class);
                         Pokročilé schopnosti
 when(l.get(0)).
  thenReturn(“X“);
                             Partial mocks

 assert l.get(0) ==
                             Spying on real objects
 “X“;                        Custom Answer callback
 assert l.get(1) ==
 null;                       Co vrací: RETURNS_SMART_NULLS,
                              RETURNS_DEEP_STUBS (zřetězení mocků), …
                         Rozumné výchozí chování & velmi přizpůsobitelný
                         Přečíst FAQ! (omezení, doporučení aj.)


15                                                                      © 2010 IBA CZ, s.r.o.
DbUnit a DbUnit Test Skeleton

                       1. DbUnit
                              Před každým testem naplní DB z dat v XML [← Jailer]
                       2. DbUnit Test Skeleton (dbunit-embeddedderby-parenttest)
                              Přednastaven pro vnořenou Derby DB => netřeba externí
                               DB; umí ji i vytvořit
                              Načte data z připraveného XML – stačí upravit
                              Užiteční pomocníci
                               (RowComparator, getDataSource(), ...)
                              Lepší zpracování chyb + rady jak řešit
                              V Central Maven repository
Kompletní (!) test:
public class MyDerbyDbTest {
 EmbeddedDbTester testDb = new EmbeddedDbTester();

 @Before void setUp() throws Exception { testDb.onSetup();}

 @Test public void testIt() throws Exception {
   new MyTestedClass().storeGeek(1, "Kuba Holy");
   testDb.createCheckerForSelect("select ...")
    .assertRowCount(1)
    .assertNext(new Object[]{ 1, "Kuba Holy"});
}}
// + .ddl, data v XML
16                                                                         © 2010 IBA CZ, s.r.o.
Groovy, jazyk testera

                          Co je Groovy?
                               Skriptovací jazyk, 99% Javy + mnoho navíc
                               Koupil Spring Source (dnes VMWare)
                               Odstraňuje ukecanost, usnadňuje práci, moduly


                          Pár ukázek
                                “““fakt dlouhý
     spock                          text“““
     specification fwrk
                                 Map m = [“klíč“:“hodnota“, …]
                                 def u = new User(
                                   name: “Jan“, věk: 18, muž: true)
                                 new File(“s.txt“).eachLine {
                                   assertEquals(“line${++cnt}“, it)}
                                 Moduly: GSQL, RE, XML, …
                                 Tvorba a srovnání objektových stromů
17                                                                   © 2010 IBA CZ, s.r.o.
Groovy Spock

                             testing and specification framework for Java and
                              Groovy
     spock
     specification fwrk      beautiful and highly expressive specification
                              language
                             has a JUnit runner → out-of-the-box IDE integration
                             perfect for data-driven tests
                             plus all the power of Groovy

                          def "maximum of two numbers"() {
                            expect:
                            Math.max(a, b) == c

                              where:
                              a | b |   c
                              3 | 7 |   7
                              5 | 4 |   5
                              9 | 9 |   9
                          }

18                                                                       © 2010 IBA CZ, s.r.o.
Neutříděný seznam nástrojů a knihoven

        Spring je velmi silný v testování jednotkovém i
         integračním (JPA,..): *.mock.jndi|web|portlet
        Unitils – integruje DbUnit, JPA, JMock aj.
         Vychytávky jako reflexivní porovnávač bean.
        Testy správnosti vícevláknových aplikací
            ConcuTest.org (2009, Java 1.4/5; testy dětí) viz notes
            IBM ConTest (2009, J.1.4/5; ovlivň. scheduler)
            MultithreadedTC (2007, ?; explic. scheduling)
        JEE a integrace: JBoss Arquillian
        NetBeans' Memory Leak Unit Test
        XmlUnit (porovnává XML)
        a mnoho dalších … → pravděpodobně už někde
         existuje ten nástroj, který potřebujete!



19                                                     © 2010 IBA CZ, s.r.o.
Pokročilá témata

     Test-Driven Development/Design (TDD)
       nejdřív test, pak kód, pak design (refactor)
        doplňuje se s akceptačním TDD
        zaměřuje pozornost na podstatné x předesignování


     Mutační testování (mutation testing)
        Kontrola kvality testů zavedením chyb do kódu
        Výzvou odstínění nepodstatných změn
            Př: compareTo vrátí -2 místo -1
        Výkonově náročné
        Viz framework Javalanche.org a MuJava
        Viz Beautiful Testing, O'Reilly 2010, kpt.18: Seeding
         Bugs to Find Bugs:Beautiful Mutation Testing
         (Andreas Zeller, David Schuler)


20                                                     © 2010 IBA CZ, s.r.o.
Odkazy

     Bibliografie
       [WoT] The Way of Testuvius:
        http://www.agitar.com/downloads/TheWayOfTestivus.
        pdf
        Odkazy z této prezentace: http://bit.ly/jhtstlinks

     Rozšiřující zdroje
         Google Talks by Misko Hevery
        pniederw.wordpress.com/category/spock-framework

     Knihy
       Martin Fowler: XUnit Test Patterns - Refactoring Test
        Code, 2008 - vzory a anti-vzory pro jednotkové testy
        Lasse Koskela: Test-Driven - Practical TDD and
         Acceptance TDD for Java Developers, Manning
         2008



21                                                    © 2010 IBA CZ, s.r.o.

More Related Content

Viewers also liked

High hopes & higher hurdles
High hopes & higher hurdlesHigh hopes & higher hurdles
High hopes & higher hurdlesCedarcom News
 
Region Forum 2008 - Ponúknime Europe originalne regionalne produkty cestovneh...
Region Forum 2008 - Ponúknime Europe originalne regionalne produkty cestovneh...Region Forum 2008 - Ponúknime Europe originalne regionalne produkty cestovneh...
Region Forum 2008 - Ponúknime Europe originalne regionalne produkty cestovneh...Liptour
 
Retenciones Y Conflicto
Retenciones Y ConflictoRetenciones Y Conflicto
Retenciones Y Conflictoguestbe28b4
 
Josemariodeandrade Transpoquip 100808
Josemariodeandrade Transpoquip 100808Josemariodeandrade Transpoquip 100808
Josemariodeandrade Transpoquip 100808Jose_Mario
 
Gebran Bassil's 2009 Telecom General Rules
Gebran Bassil's 2009 Telecom General RulesGebran Bassil's 2009 Telecom General Rules
Gebran Bassil's 2009 Telecom General RulesCedarcom News
 

Viewers also liked (7)

High hopes & higher hurdles
High hopes & higher hurdlesHigh hopes & higher hurdles
High hopes & higher hurdles
 
Region Forum 2008 - Ponúknime Europe originalne regionalne produkty cestovneh...
Region Forum 2008 - Ponúknime Europe originalne regionalne produkty cestovneh...Region Forum 2008 - Ponúknime Europe originalne regionalne produkty cestovneh...
Region Forum 2008 - Ponúknime Europe originalne regionalne produkty cestovneh...
 
Retenciones Y Conflicto
Retenciones Y ConflictoRetenciones Y Conflicto
Retenciones Y Conflicto
 
Twitter Einfuehrung
Twitter EinfuehrungTwitter Einfuehrung
Twitter Einfuehrung
 
Josemariodeandrade Transpoquip 100808
Josemariodeandrade Transpoquip 100808Josemariodeandrade Transpoquip 100808
Josemariodeandrade Transpoquip 100808
 
Gebran Bassil's 2009 Telecom General Rules
Gebran Bassil's 2009 Telecom General RulesGebran Bassil's 2009 Telecom General Rules
Gebran Bassil's 2009 Telecom General Rules
 
Designnet 09/11
Designnet 09/11Designnet 09/11
Designnet 09/11
 

Similar to Seminar Nastroje Jednotk Testovani

Funkční testování – chybějící vrchol pyramidy (WebExpo 2016)
Funkční testování – chybějící vrchol pyramidy (WebExpo 2016)Funkční testování – chybějící vrchol pyramidy (WebExpo 2016)
Funkční testování – chybějící vrchol pyramidy (WebExpo 2016)Ondřej Machulda
 
Proč chcete testovat své aplikace
Proč chcete testovat své aplikaceProč chcete testovat své aplikace
Proč chcete testovat své aplikaceatotocz
 
Entity Framework v enterprise aplikacích
Entity Framework v enterprise aplikacíchEntity Framework v enterprise aplikacích
Entity Framework v enterprise aplikacíchProfinit
 
Czjug Zari 2008
Czjug Zari 2008Czjug Zari 2008
Czjug Zari 2008RENESTEIN
 
Bezbolestné testování v Ruby on Rals
Bezbolestné testování v Ruby on RalsBezbolestné testování v Ruby on Rals
Bezbolestné testování v Ruby on RalsJan Kubr
 
node.js: zápisky z fronty (Battle guide to node.js)
node.js: zápisky z fronty (Battle guide to node.js)node.js: zápisky z fronty (Battle guide to node.js)
node.js: zápisky z fronty (Battle guide to node.js)almadcz
 
Spring framework - J2EE S Lidskou Tvari
Spring framework - J2EE S Lidskou TvariSpring framework - J2EE S Lidskou Tvari
Spring framework - J2EE S Lidskou TvariRoman Pichlík
 
Entity Framework: Optimalizace a záludnosti
Entity Framework: Optimalizace a záludnostiEntity Framework: Optimalizace a záludnosti
Entity Framework: Optimalizace a záludnostiProfinit
 
Pa104 pa104-priprava-na-zk
Pa104 pa104-priprava-na-zkPa104 pa104-priprava-na-zk
Pa104 pa104-priprava-na-zkFatmir Vela
 
Trendy a nové možnosti test automation
Trendy a nové možnosti test automationTrendy a nové možnosti test automation
Trendy a nové možnosti test automationOndřej Machulda
 
Dependency injection
Dependency injectionDependency injection
Dependency injectionJiří Matula
 
atoto.cz - jak na snadnou integraci Codeception
atoto.cz - jak na snadnou integraci Codeceptionatoto.cz - jak na snadnou integraci Codeception
atoto.cz - jak na snadnou integraci Codeceptionatotocz
 
Jan Čislinský: Seznámení se Sourcery aneb Základy metaprogramování ve Swiftu
Jan Čislinský: Seznámení se Sourcery aneb Základy metaprogramování ve SwiftuJan Čislinský: Seznámení se Sourcery aneb Základy metaprogramování ve Swiftu
Jan Čislinský: Seznámení se Sourcery aneb Základy metaprogramování ve Swiftumdevtalk
 
Dark Side of iOS [mDevCamp 2013]
Dark Side of iOS [mDevCamp 2013]Dark Side of iOS [mDevCamp 2013]
Dark Side of iOS [mDevCamp 2013]Kuba Břečka
 
Malware Houdiny
Malware HoudinyMalware Houdiny
Malware HoudinyCESNET
 
Vizuální regresní testy
Vizuální regresní testyVizuální regresní testy
Vizuální regresní testyMartin Krištof
 
Solid principy v oop návrhu
Solid principy v oop návrhuSolid principy v oop návrhu
Solid principy v oop návrhuProfinit
 

Similar to Seminar Nastroje Jednotk Testovani (20)

Funkční testování – chybějící vrchol pyramidy (WebExpo 2016)
Funkční testování – chybějící vrchol pyramidy (WebExpo 2016)Funkční testování – chybějící vrchol pyramidy (WebExpo 2016)
Funkční testování – chybějící vrchol pyramidy (WebExpo 2016)
 
Proč chcete testovat své aplikace
Proč chcete testovat své aplikaceProč chcete testovat své aplikace
Proč chcete testovat své aplikace
 
Entity Framework v enterprise aplikacích
Entity Framework v enterprise aplikacíchEntity Framework v enterprise aplikacích
Entity Framework v enterprise aplikacích
 
Czjug Zari 2008
Czjug Zari 2008Czjug Zari 2008
Czjug Zari 2008
 
Testování v PHP
Testování v PHPTestování v PHP
Testování v PHP
 
Bezbolestné testování v Ruby on Rals
Bezbolestné testování v Ruby on RalsBezbolestné testování v Ruby on Rals
Bezbolestné testování v Ruby on Rals
 
node.js: zápisky z fronty (Battle guide to node.js)
node.js: zápisky z fronty (Battle guide to node.js)node.js: zápisky z fronty (Battle guide to node.js)
node.js: zápisky z fronty (Battle guide to node.js)
 
Spring framework - J2EE S Lidskou Tvari
Spring framework - J2EE S Lidskou TvariSpring framework - J2EE S Lidskou Tvari
Spring framework - J2EE S Lidskou Tvari
 
Entity Framework: Optimalizace a záludnosti
Entity Framework: Optimalizace a záludnostiEntity Framework: Optimalizace a záludnosti
Entity Framework: Optimalizace a záludnosti
 
Pa104 pa104-priprava-na-zk
Pa104 pa104-priprava-na-zkPa104 pa104-priprava-na-zk
Pa104 pa104-priprava-na-zk
 
Trendy a nové možnosti test automation
Trendy a nové možnosti test automationTrendy a nové možnosti test automation
Trendy a nové možnosti test automation
 
Dependency injection
Dependency injectionDependency injection
Dependency injection
 
atoto.cz - jak na snadnou integraci Codeception
atoto.cz - jak na snadnou integraci Codeceptionatoto.cz - jak na snadnou integraci Codeception
atoto.cz - jak na snadnou integraci Codeception
 
Jan Čislinský: Seznámení se Sourcery aneb Základy metaprogramování ve Swiftu
Jan Čislinský: Seznámení se Sourcery aneb Základy metaprogramování ve SwiftuJan Čislinský: Seznámení se Sourcery aneb Základy metaprogramování ve Swiftu
Jan Čislinský: Seznámení se Sourcery aneb Základy metaprogramování ve Swiftu
 
Nette Tester / Posobota
Nette Tester / PosobotaNette Tester / Posobota
Nette Tester / Posobota
 
Dark Side of iOS [mDevCamp 2013]
Dark Side of iOS [mDevCamp 2013]Dark Side of iOS [mDevCamp 2013]
Dark Side of iOS [mDevCamp 2013]
 
Malware Houdiny
Malware HoudinyMalware Houdiny
Malware Houdiny
 
Úvod do OOP
Úvod do OOPÚvod do OOP
Úvod do OOP
 
Vizuální regresní testy
Vizuální regresní testyVizuální regresní testy
Vizuální regresní testy
 
Solid principy v oop návrhu
Solid principy v oop návrhuSolid principy v oop návrhu
Solid principy v oop návrhu
 

More from Jakub Holy

Dissolving Technical Debt on Agile Projects - Smidig 2012
Dissolving Technical Debt on Agile Projects - Smidig 2012Dissolving Technical Debt on Agile Projects - Smidig 2012
Dissolving Technical Debt on Agile Projects - Smidig 2012Jakub Holy
 
Dealing With Legacy: The Real-World Experience
Dealing With Legacy: The Real-World ExperienceDealing With Legacy: The Real-World Experience
Dealing With Legacy: The Real-World ExperienceJakub Holy
 
Commit on day one thanks to vagrant & puppet!
Commit on day one thanks to vagrant & puppet!Commit on day one thanks to vagrant & puppet!
Commit on day one thanks to vagrant & puppet!Jakub Holy
 
Why Functional Programming and Clojure - LightningTalk
Why Functional Programming and Clojure - LightningTalkWhy Functional Programming and Clojure - LightningTalk
Why Functional Programming and Clojure - LightningTalkJakub Holy
 
Specification by example - course summary
Specification by example - course summarySpecification by example - course summary
Specification by example - course summaryJakub Holy
 
Brief introduction into DbUnit Express, Q3/2011
Brief introduction into DbUnit Express, Q3/2011Brief introduction into DbUnit Express, Q3/2011
Brief introduction into DbUnit Express, Q3/2011Jakub Holy
 

More from Jakub Holy (6)

Dissolving Technical Debt on Agile Projects - Smidig 2012
Dissolving Technical Debt on Agile Projects - Smidig 2012Dissolving Technical Debt on Agile Projects - Smidig 2012
Dissolving Technical Debt on Agile Projects - Smidig 2012
 
Dealing With Legacy: The Real-World Experience
Dealing With Legacy: The Real-World ExperienceDealing With Legacy: The Real-World Experience
Dealing With Legacy: The Real-World Experience
 
Commit on day one thanks to vagrant & puppet!
Commit on day one thanks to vagrant & puppet!Commit on day one thanks to vagrant & puppet!
Commit on day one thanks to vagrant & puppet!
 
Why Functional Programming and Clojure - LightningTalk
Why Functional Programming and Clojure - LightningTalkWhy Functional Programming and Clojure - LightningTalk
Why Functional Programming and Clojure - LightningTalk
 
Specification by example - course summary
Specification by example - course summarySpecification by example - course summary
Specification by example - course summary
 
Brief introduction into DbUnit Express, Q3/2011
Brief introduction into DbUnit Express, Q3/2011Brief introduction into DbUnit Express, Q3/2011
Brief introduction into DbUnit Express, Q3/2011
 

Seminar Nastroje Jednotk Testovani

  • 1. Nástroje jednotkového testování seminář IBA CZ Jakub Holý, 4/2010 1 © 2010 IBA CZ, s.r.o.
  • 2. Obsah O čem si povíme...  Jednotkové testování pro vývojáře  proč  jak  nástroje ...a o čem nikoliv  Místo jednotkového testování ve vývojovém cyklu (CI servery apod.)  Jiné typy testování, jako funkční (Selenium aj.) a integrační (až na výjimky) 2 © 2010 IBA CZ, s.r.o.
  • 3. Díl 1: Co a proč? 3 © 2010 IBA CZ, s.r.o.
  • 4. Kvíz Jaký je nejefektivnější způsob odhalení chyb v kódu? a) Jednotkové testování b) Testování aplikace testovacím týmem c) Statická analýza kódu – FindBugs ap. d) Jiný? Odpověď: Revize kódu 4 © 2010 IBA CZ, s.r.o.
  • 5. Kvíz II Kdo někdy napsal jednotkový test s JUnit či podobnou? Kdo někdy použil pomocnou knihovnu pro testování ve specifickém prostředí nebo specifické datové struktury? (JSFUnit, XmlUnit, DbUnit, mocky, ...) Odpověď: Revize kódu 5 © 2010 IBA CZ, s.r.o.
  • 6. Překážky na cestě k testovacímu satori1 Všichni víme, jak jsou testy důležité, ale nikdo to nedělá. Proč?  Není čas (opravdu? šetří později, stojí jen 10%2)  Moc práce  Neví jak 1) Zenový výraz pro stav dokonalého štěstí, volně řečeno 2) Viz článek Cost of Testing: http://java.dzone.com/articles/cost-testing 6 © 2010 IBA CZ, s.r.o.
  • 7. Drobné opakování... 7 © 2010 IBA CZ, s.r.o.
  • 8. Proč testovat? 1. Nutí psát testovatelný a tedy lepší kód  Koheze: Malé metody/třídy dělající jedinou věc  Loose coupling (↔ DI; setDependency(..) - Google)  Konfigurovatelnost (JDBC URL apod.) ➔ Flexibilní, hezčí, samostatný 2. Včas najdeme chyby – čím dřív, tím levněji  Př.: 12 x 24h čas, MobileBackup.LineReader 3. Zlevňuje údržbu ← bezpečný refactoring 8 © 2010 IBA CZ, s.r.o.
  • 9. Typy testování  Testování funkce: – Vývojář: jednotkové x funkční x scenario (behavior) driven x integrační – Uživatel: akceptační (FITT, ...)  NFR: výkonové (stress a load) 9 © 2010 IBA CZ, s.r.o.
  • 10. Co a jak testovat Co testovat? Viz dřívější přednáška Petra Adámka.  očekávané chování  chování při nesplnění předpokladů → vede na: – explicitní vyjádření předpokladů v kódu – zajištění, že pokud byly mylné a nebudou tedy splněny, aplikace to včas detekuje a dá srozumitelně vědět → ušetřím hodiny/dny zkoumání nečekaného chování Jak testovat? Pragmaticky!  Nenechat se zaslepit pravidly – viz The Way of Testuvius [WoT]  Bohužel ne vše lze otestovat  100% pokrytí je nesmysl (gettery ap.?!)  Paretovo pravidlo: posledních 20% je 80% práce  Použít vždy ten pravý nástroj pro daný úkol 10 © 2010 IBA CZ, s.r.o.
  • 11. Díl 2: Usnadňujeme si práci 11 © 2010 IBA CZ, s.r.o.
  • 12. Základy jednotkového testování  Frameworky: JUnit 3.8/4.x (lepší integrace všude) vs. TestNG (mocnější?) – spouštění testů, výsledky, verifikace hodnot – JUnit 4: Parametrizované testy – JUnit 4.4: assertThat a fluent API s Hamcrestem – prostředí: Java 5 x 1.4 x 1.4 s retroweaverem  O podpoře tvorby a spouštění v IDE ...  Show: Ukázka reálného kódu – demonstrace užití a přínosu – testing-seminar-junit/ITaxServiceTest, viz poznámky  Pozn.: Že testy prošly neznamená že vše ok, Eclipse: JUnit runner možná jsou jen nedostatečné! 12 © 2010 IBA CZ, s.r.o.
  • 13. Co se závislostmi? (I) Simulujeme čili mock-ujeme = „náhrada předprogramovaným simulantem“  Mockito, JMock, EasyMock  PowerMock pro E.M./Mockito (statické m.,..)  Groovy Gmock  AOP Simul-sestřička 13 © 2010 IBA CZ, s.r.o.
  • 14. Co se závislostmi? (II) Závislosti na prostředí  Databáze: DbUnit (a DbUnitTestSkeleton)  Servlety: Cactus (používá JUnit 3.8.1, prý nefunguje s 4), Spring MockHttpServletRequest  EJB: embeddable OpenEJB, JBoss embedded, EJB 3.1: embedded container  Portlety: ?  Web UI: ?HttpUnit, WebUnit...?, JSFUnit (nad Cactusem :-( ) x JBoss jsf-mock Závěr: Vždy se podívejte, zda neexistuje pomocná knihovna pro testování ve vašem prostředí. 14 © 2010 IBA CZ, s.r.o.
  • 15. Mockito a proč si je zvolit  Snadnost užití – specifikujte jen co chcete  Jinde musíte předem specifikovat povolená volání  Mockuje rozhraní i třídy  Malé, dobře dokumentované, hezké API // Ukázka Mockita: l =  Portováno i do Javy 1.4 mock(List.class);  Pokročilé schopnosti when(l.get(0)). thenReturn(“X“);  Partial mocks assert l.get(0) ==  Spying on real objects “X“;  Custom Answer callback assert l.get(1) == null;  Co vrací: RETURNS_SMART_NULLS, RETURNS_DEEP_STUBS (zřetězení mocků), …  Rozumné výchozí chování & velmi přizpůsobitelný  Přečíst FAQ! (omezení, doporučení aj.) 15 © 2010 IBA CZ, s.r.o.
  • 16. DbUnit a DbUnit Test Skeleton 1. DbUnit  Před každým testem naplní DB z dat v XML [← Jailer] 2. DbUnit Test Skeleton (dbunit-embeddedderby-parenttest)  Přednastaven pro vnořenou Derby DB => netřeba externí DB; umí ji i vytvořit  Načte data z připraveného XML – stačí upravit  Užiteční pomocníci (RowComparator, getDataSource(), ...)  Lepší zpracování chyb + rady jak řešit  V Central Maven repository Kompletní (!) test: public class MyDerbyDbTest { EmbeddedDbTester testDb = new EmbeddedDbTester(); @Before void setUp() throws Exception { testDb.onSetup();} @Test public void testIt() throws Exception { new MyTestedClass().storeGeek(1, "Kuba Holy"); testDb.createCheckerForSelect("select ...") .assertRowCount(1) .assertNext(new Object[]{ 1, "Kuba Holy"}); }} // + .ddl, data v XML 16 © 2010 IBA CZ, s.r.o.
  • 17. Groovy, jazyk testera Co je Groovy?  Skriptovací jazyk, 99% Javy + mnoho navíc  Koupil Spring Source (dnes VMWare)  Odstraňuje ukecanost, usnadňuje práci, moduly Pár ukázek  “““fakt dlouhý spock text“““ specification fwrk  Map m = [“klíč“:“hodnota“, …]  def u = new User( name: “Jan“, věk: 18, muž: true)  new File(“s.txt“).eachLine { assertEquals(“line${++cnt}“, it)}  Moduly: GSQL, RE, XML, …  Tvorba a srovnání objektových stromů 17 © 2010 IBA CZ, s.r.o.
  • 18. Groovy Spock  testing and specification framework for Java and Groovy spock specification fwrk  beautiful and highly expressive specification language  has a JUnit runner → out-of-the-box IDE integration  perfect for data-driven tests  plus all the power of Groovy def "maximum of two numbers"() { expect: Math.max(a, b) == c where: a | b | c 3 | 7 | 7 5 | 4 | 5 9 | 9 | 9 } 18 © 2010 IBA CZ, s.r.o.
  • 19. Neutříděný seznam nástrojů a knihoven  Spring je velmi silný v testování jednotkovém i integračním (JPA,..): *.mock.jndi|web|portlet  Unitils – integruje DbUnit, JPA, JMock aj. Vychytávky jako reflexivní porovnávač bean.  Testy správnosti vícevláknových aplikací  ConcuTest.org (2009, Java 1.4/5; testy dětí) viz notes  IBM ConTest (2009, J.1.4/5; ovlivň. scheduler)  MultithreadedTC (2007, ?; explic. scheduling)  JEE a integrace: JBoss Arquillian  NetBeans' Memory Leak Unit Test  XmlUnit (porovnává XML)  a mnoho dalších … → pravděpodobně už někde existuje ten nástroj, který potřebujete! 19 © 2010 IBA CZ, s.r.o.
  • 20. Pokročilá témata Test-Driven Development/Design (TDD)  nejdřív test, pak kód, pak design (refactor)  doplňuje se s akceptačním TDD  zaměřuje pozornost na podstatné x předesignování Mutační testování (mutation testing)  Kontrola kvality testů zavedením chyb do kódu  Výzvou odstínění nepodstatných změn  Př: compareTo vrátí -2 místo -1  Výkonově náročné  Viz framework Javalanche.org a MuJava  Viz Beautiful Testing, O'Reilly 2010, kpt.18: Seeding Bugs to Find Bugs:Beautiful Mutation Testing (Andreas Zeller, David Schuler) 20 © 2010 IBA CZ, s.r.o.
  • 21. Odkazy Bibliografie  [WoT] The Way of Testuvius: http://www.agitar.com/downloads/TheWayOfTestivus. pdf  Odkazy z této prezentace: http://bit.ly/jhtstlinks Rozšiřující zdroje  Google Talks by Misko Hevery  pniederw.wordpress.com/category/spock-framework Knihy  Martin Fowler: XUnit Test Patterns - Refactoring Test Code, 2008 - vzory a anti-vzory pro jednotkové testy  Lasse Koskela: Test-Driven - Practical TDD and Acceptance TDD for Java Developers, Manning 2008 21 © 2010 IBA CZ, s.r.o.

Editor's Notes

  1. ITaxServiceTest 1. Postup Rozhraní -> test -> implementace 2. Zapamatovánihodnosti Stejný package, jiný adresář -> test/čti protected a package metody/atributy Bez anotací platný JUnit 3.x text dík pojmenování setUp() či @Before: (re)inicializace k provedení před každým testem Junit 4: @Test(expected=...) Dostupné assert* viz třída Assert - (Not)Null, True/False, Equals // JUnit by měla být přidána přes Maven
  2. ITaxServiceTest 1. Postup Rozhraní -> test -> implementace 2. Zapamatovánihodnosti Stejný package, jiný adresář -> test/čti protected a package metody/atributy Bez anotací platný JUnit 3.x text dík pojmenování setUp() či @Before: (re)inicializace k provedení před každým testem Junit 4: @Test(expected=...) Dostupné assert* viz třída Assert - (Not)Null, True/False, Equals // JUnit by měla být přidána přes Maven
  3. ITaxServiceTest 1. Postup Rozhraní -> test -> implementace 2. Zapamatovánihodnosti Stejný package, jiný adresář -> test/čti protected a package metody/atributy Bez anotací platný JUnit 3.x text dík pojmenování setUp() či @Before: (re)inicializace k provedení před každým testem Junit 4: @Test(expected=...) Dostupné assert* viz třída Assert - (Not)Null, True/False, Equals // JUnit by měla být přidána přes Maven
  4. ITaxServiceTest 1. Postup Rozhraní -> test -> implementace 2. Zapamatovánihodnosti Stejný package, jiný adresář -> test/čti protected a package metody/atributy Bez anotací platný JUnit 3.x text dík pojmenování setUp() či @Before: (re)inicializace k provedení před každým testem Junit 4: @Test(expected=...) Dostupné assert* viz třída Assert - (Not)Null, True/False, Equals // JUnit by měla být přidána přes Maven
  5. ITaxServiceTest 1. Postup Rozhraní -> test -> implementace 2. Zapamatováni hodnosti Stejný package, jiný adresář -> test/čti protected a package metody/atributy Bez anotací platný JUnit 3.x text dík pojmenování setUp() či @Before: (re)inicializace k provedení před každým testem Junit 4: @Test(expected=...) Dostupné assert* viz třída Assert - (Not)Null, True/False, Equals // JUnit by měla být přidána přes Maven
  6. ConcuTest (2009, Java 1.4/5): ConcJUnit: Upravený junit.jar, který navíc v dětských vláknech a) hlásí výjimky b) hlásí, když dítě přežije rodiče. Thread Checker: A lightweight annotation language, which can be used to specify and check the threading invariants of both existing and new code; Schedule-Based Execution: A testing framework that WILL execute unit tests according to a specified set of recorded or generated schedules, elevating the unit testing of concurrent programs to a rigorous, deterministic process.