SlideShare une entreprise Scribd logo
1  sur  32
Unit Testing @jordi9 4 diciembre 2010
roadmap Definición Primer test Excusas Tipos de tests <3 Mockito Código testeable Q & A #bcngtug http://bitbucket.org/jordi9/gtug-unit-testing http://slideshare.net/giro9
definición Código (método) que ejecuta un otro código para comprobar su validez.  ... todos hemos escrito unit tests  (o algo parecido) características Automático y repetible Fácil de implementar. Cualquiera puede ejecutarlo &quot;apretando un botón&quot; Debe ser  rápido  (<1ms)
nuestro primer test frameworks xUnit family: SUnit, JUnit, NUnit, PHPUnit... Nos facilitan como escribir un test, ejecutarlo y obtener resultados. (ejemplos en JUnit) esquema básico de un test Class Under Test (CUT, SUT,  @Unit ...) Precondición - Ejecución - Postcondición postcondición...?  Assert assertTrue(boolean); assertEquals(expected, actual); (...) Hamcrest assertThat(foo, is(&quot;foo&quot;));  assertThat(bar, is(not(&quot;foo&quot;)));  assertThat(list, hasSize(9)); 
ejemplo primer test
test con junit public class StringsTest {        @Test     public void stripAllHTMLForAGivenText() {         String html = &quot;<a>Link</a>&quot;;         assertThat(Strings.stripHTML(html), is(&quot;Link&quot;));     }        } public class Strings {       public static String stripHTML(String input) {         return input.replaceAll(&quot;</?+(b)[ˆ<>]++>&quot;, &quot;&quot;);     }   } unit test
tipos de test by @mhevery
excusas... by @mhevery
unit test...? // Class under test  CreditCardProcessor creditCardProcessor; @Test public void chargeCreditCard() {          creditCardProcessor = new CreditCardProcessor();     CreditCard c = new CreditCard(&quot;9999 0000 7777&quot;, 5, 2009);    creditCardProcessor.charge(c, 30.0);     assertThat (creditCardProcessor.balance(c), is(-30.0)); } public CreditCardProcessor() { }    Mi tarjeta tenía 30 Euros menos!  
test con dependencias / mocks   Dependencias falsas: mocks frameworks fases &quot;expect&quot; - &quot;replay&quot; - &quot;verify&quot;
ejemplo <3 mockito
preparando un test @Before @After Se ejecutan por cada test unitario public class DatabaseTest {    @Before  public void prepareFakeDatabase() {}    @After  public void cleanupFakeDatabase() {} } @BeforeClass @AfterClass Se ejecutan una vez por un conjunto de test public class DatabaseTest {    @BeforeClass  public static void prepareRealDatabase() {}    @AfterClass  public static void cleanupRealDatabase() {} }
más opciones junit testeando excepciones @Test(expected=IllegalArgumentException.class) public void emptyInputShouldRaiseAnException() {   Strings.stripHTML(&quot;&quot;); } tests con timeout @Test(timeout=1000) public void timeoutFirst() {   Strings.veryLongMethod(&quot;foo&quot;); } ignorar un test @Ignore(&quot;Some very good reason&quot;) @Test(timeout=1000) public void timeoutFirst() {   Strings.veryLongMethod(&quot;foo&quot;); }
ejemplo /etc/junit
detectar código no testeable new 's encapsulados Coste de construcción Estado global API's que engañan
new 's encapsulados class House {    Kitchen kitchen = new Kitchen();    Bedroom bedroom;    House() {     bedroom = new Bedroom();    } }
new 's encapsulados class House {    Kitchen kitchen = new Kitchen();    Bedroom bedroom;    House() {     bedroom = new Bedroom();    } } class HouseTest {    @Test    public void thisIsReallyHard() {      House house = new House();      // Oops... y si quiero utilizar otra cocina u otra      // habitación?    } }
new 's encapsulados fixed class House {    Kitchen kitchen;    Bedroom bedroom;    @Inject  // Guice!    House(Kitchen kitchen, Bedroom bedroom) {      this.kitchen = kitchen;      this.bedroom = bedroom;    } }
new 's encapsulados fixed class House {    Kitchen kitchen;    Bedroom bedroom;    @Inject  // Guice!    House(Kitchen kitchen, Bedroom bedroom) {      this.kitchen = kitchen;      this.bedroom = bedroom;    } } class HouseTest {    @Test    public void thisIsCoolAndFlexible() {      Kitchen kitchen = new FooKitchen();      Bedroom bedroom = new InexpensiveBedroom();      House house = new House(kitchen, bedroom); // yay!    } }
Coste de construcción class Car {    Engine engine;    Car(File file) {      String model = readEngineModel(file); // expensive method      engine = new EngineFactory().create(model);    } } Para instanciar un objeto:     Tienes que navegar por todo lo que se haga en la constructora.     No puedes sobrescribirla.
Coste de construcción class Car {    Engine engine;    Car(File file) {      String model = readEngineModel(file); // expensive method      engine = new EngineFactory().create(model);    } } class CarTest {    public void noSeamForFakeEngine() {      // Aggh! Ficheros en los unit tests...      File file = new File(&quot;engine.config&quot;);      Car car = new Car(file);     // Quiero utilizar otro motor pero no puedo por culpa     // de la fábrica...    } } Para instanciar un objeto:     Tienes que navegar por todo lo que se haga en la constructora.     No puedes sobrescribirla.
Coste de construcción class Car {    Engine engine;        Car(Engine engine) {      this.engine = engine;    } } @Provides  // más Guice! Engine providesEngine(EngineFactory engineFactory,                       @EngineModel String model) {    return engineFactory.create(model); }
Coste de construcción class Car {    Engine engine;        Car(Engine engine) {      this.engine = engine;    } } @Provides  // más Guice! Engine providesEngine(EngineFactory engineFactory,                       @EngineModel String model) {    return engineFactory.create(model); } @Test public void nowWeHaveACleanDesign() {    Engine fakeEngine = new FakeEngine();    Car car = new Car(fakeEngine); }    Hacer el mínimo trabajo posible en la constructora
Estado global Repetir el mismo proceso y obtener un resultado diferente... ugh! síntomas Orden de los tests importa (prohibido!) No se pueden ejecutar los tests en paralelo ejemplos En la propia JVM tenemos malos ejemplos:    System.currentTime();    new Date();    Math.random() Testear el código anterior es muy difícil.
APIs engañosas Dependencias ocultas... recuperemos el ejemplo de antes @Test public void chargeCreditCard() {          CreditCard cc = new CreditCard(&quot;9999 0000 7777&quot;, 5, 2009);    cc.charge(30.0); } java.lang.NullPointerExpection    at org.donky.gtug.C reditCard.charge()
APIs engañosas @Test public void chargeCreditCard() {          CreditCardProcessor.init();     CreditCard cc = new CreditCard(&quot;9999 0000 7777&quot;, 5, 2009);    cc.charge(30.0); } java.lang.NullPointerExpection    at org.donky.gtug.C reditCardProcessor.init()
APIs engañosas @Test public void chargeCreditCard() {     OfflineQueue.start();     CreditCardProcessor.init();     CreditCard cc = new CreditCard(&quot;9999 0000 7777&quot;, 5, 2009);    cc.charge(30.0); } java.lang.NullPointerExpection    at org.donky.gtug.OfflineQueue .start()
APIs engañosas @Test public void chargeCreditCard() {     Database.connect(...);     OfflineQueue.start();     CreditCardProcessor.init();     CreditCard cc = new CreditCard(&quot;9999 0000 7777&quot;, 5, 2009);    cc.charge(30.0); } La API de  CreditCard  nos engaña:     No expone sus dependencias de manera clara.     Pretende no necesitar la  CreditCardProcessor  pero lo hace.     Aun pierdo 30 Euros! Si tu código depende del orden en que se inician los Singletons... está documentado en alguna parte? Quien no se ha encontrado esto nunca?;) La solución es Dependency Injection: Te fuerza el orden correcto en tiempo de compilación.
una solución mejor @Test public void chargeCreditCard() {    db = new Database(...);    queue = new OfflineQueue( db );    ccProc = new CreditCardProcessor( queue );    CreditCard cc = new CreditCard( ccProc , &quot;9999 0000 7777&quot;);    cc.charge(30.0); }
muchísimas más cosas! más frameworks DbUnit WebDriver / Selenium 2 MockRunner Android:  ActivityInstrumentationTestCase            ActivityUnitTestCase metodologías Test Driven Development (<3) Acceptance Test utilidades Test coverage: Cobertura / Clover Testability Explorer
gracias! jordi @donky.org @jordi9
Q & A jordi @donky.org @jordi9

Contenu connexe

Tendances

SCJP, Clase 8: Inner Classes
SCJP, Clase 8: Inner ClassesSCJP, Clase 8: Inner Classes
SCJP, Clase 8: Inner Classesflekoso
 
Curso TDD Ruby on Rails #04: Factorías de objetos
Curso TDD Ruby on Rails #04: Factorías de objetosCurso TDD Ruby on Rails #04: Factorías de objetos
Curso TDD Ruby on Rails #04: Factorías de objetosAlberto Perdomo
 
Curso TDD Ruby on Rails #02: Test Driven Development
Curso TDD Ruby on Rails #02: Test Driven DevelopmentCurso TDD Ruby on Rails #02: Test Driven Development
Curso TDD Ruby on Rails #02: Test Driven DevelopmentAlberto Perdomo
 
Integrando React.js en aplicaciones Symfony (deSymfony 2016)
Integrando React.js en aplicaciones Symfony (deSymfony 2016)Integrando React.js en aplicaciones Symfony (deSymfony 2016)
Integrando React.js en aplicaciones Symfony (deSymfony 2016)Ignacio Martín
 
Cuckoosandbox
CuckoosandboxCuckoosandbox
CuckoosandboxTensor
 
Argentesting 2018 - Introducción a la automatización de pruebas con tecnologí...
Argentesting 2018 - Introducción a la automatización de pruebas con tecnologí...Argentesting 2018 - Introducción a la automatización de pruebas con tecnologí...
Argentesting 2018 - Introducción a la automatización de pruebas con tecnologí...Argentesting
 
Desarrollo con Java y metodologías agiles
Desarrollo con Java y metodologías agilesDesarrollo con Java y metodologías agiles
Desarrollo con Java y metodologías agilesJobsket
 
Construccion de proyectos con gradle
Construccion de proyectos con gradleConstruccion de proyectos con gradle
Construccion de proyectos con gradleDavid Gómez García
 
Escaner
EscanerEscaner
EscanerTensor
 
Desarrollo De Videojuegos Con Javascript
Desarrollo De Videojuegos Con JavascriptDesarrollo De Videojuegos Con Javascript
Desarrollo De Videojuegos Con JavascriptBR7
 
Gulp js php sevilla 28 septiembre 2016
Gulp js   php sevilla 28 septiembre 2016Gulp js   php sevilla 28 septiembre 2016
Gulp js php sevilla 28 septiembre 2016Agencia INNN
 

Tendances (20)

Por pagar
Por pagarPor pagar
Por pagar
 
SCJP, Clase 8: Inner Classes
SCJP, Clase 8: Inner ClassesSCJP, Clase 8: Inner Classes
SCJP, Clase 8: Inner Classes
 
Curso TDD Ruby on Rails #04: Factorías de objetos
Curso TDD Ruby on Rails #04: Factorías de objetosCurso TDD Ruby on Rails #04: Factorías de objetos
Curso TDD Ruby on Rails #04: Factorías de objetos
 
Curso TDD Ruby on Rails #02: Test Driven Development
Curso TDD Ruby on Rails #02: Test Driven DevelopmentCurso TDD Ruby on Rails #02: Test Driven Development
Curso TDD Ruby on Rails #02: Test Driven Development
 
Opencv entrenamiento(1/2)
Opencv entrenamiento(1/2)Opencv entrenamiento(1/2)
Opencv entrenamiento(1/2)
 
Qunit CookBook español
Qunit CookBook españolQunit CookBook español
Qunit CookBook español
 
Grails
GrailsGrails
Grails
 
Introducción a groovy & grails
Introducción a groovy & grailsIntroducción a groovy & grails
Introducción a groovy & grails
 
Dar lab1819
Dar lab1819Dar lab1819
Dar lab1819
 
Integrando React.js en aplicaciones Symfony (deSymfony 2016)
Integrando React.js en aplicaciones Symfony (deSymfony 2016)Integrando React.js en aplicaciones Symfony (deSymfony 2016)
Integrando React.js en aplicaciones Symfony (deSymfony 2016)
 
Introduccion A Groovy
Introduccion A GroovyIntroduccion A Groovy
Introduccion A Groovy
 
Cuckoosandbox
CuckoosandboxCuckoosandbox
Cuckoosandbox
 
Argentesting 2018 - Introducción a la automatización de pruebas con tecnologí...
Argentesting 2018 - Introducción a la automatización de pruebas con tecnologí...Argentesting 2018 - Introducción a la automatización de pruebas con tecnologí...
Argentesting 2018 - Introducción a la automatización de pruebas con tecnologí...
 
Desarrollo con Java y metodologías agiles
Desarrollo con Java y metodologías agilesDesarrollo con Java y metodologías agiles
Desarrollo con Java y metodologías agiles
 
Construccion de proyectos con gradle
Construccion de proyectos con gradleConstruccion de proyectos con gradle
Construccion de proyectos con gradle
 
TDD+CI con Teamcity
TDD+CI con TeamcityTDD+CI con Teamcity
TDD+CI con Teamcity
 
Escaner
EscanerEscaner
Escaner
 
Best Practices
Best PracticesBest Practices
Best Practices
 
Desarrollo De Videojuegos Con Javascript
Desarrollo De Videojuegos Con JavascriptDesarrollo De Videojuegos Con Javascript
Desarrollo De Videojuegos Con Javascript
 
Gulp js php sevilla 28 septiembre 2016
Gulp js   php sevilla 28 septiembre 2016Gulp js   php sevilla 28 septiembre 2016
Gulp js php sevilla 28 septiembre 2016
 

En vedette

Segunda gerra civil republica de roma
Segunda gerra civil republica de romaSegunda gerra civil republica de roma
Segunda gerra civil republica de romakriistiiannn
 
Programa4
Programa4Programa4
Programa4arecerv
 
Gap Analysis
Gap AnalysisGap Analysis
Gap AnalysisTICS
 
Ideas del grupo colaborativo 68
Ideas del grupo colaborativo 68Ideas del grupo colaborativo 68
Ideas del grupo colaborativo 68Alexandra Zuniga
 
Administração de materiais unidade 02 14-06-07 - 151 - ppts 01 slide por folha
Administração de materiais unidade 02   14-06-07 - 151 - ppts 01 slide por folhaAdministração de materiais unidade 02   14-06-07 - 151 - ppts 01 slide por folha
Administração de materiais unidade 02 14-06-07 - 151 - ppts 01 slide por folhaAlex Casañas
 
Trastorno de hiperactividad con déficit de atención (
Trastorno de hiperactividad con déficit de atención (Trastorno de hiperactividad con déficit de atención (
Trastorno de hiperactividad con déficit de atención (LeylaCruzMontufar
 
Dónde guardar parche español foxit
Dónde guardar parche español foxitDónde guardar parche español foxit
Dónde guardar parche español foxitOEI Capacitación
 
Plan de area 2010 old
Plan de area 2010 oldPlan de area 2010 old
Plan de area 2010 oldyolitasuca12
 
Sistema solar
Sistema solarSistema solar
Sistema solarAidaHM13
 
Mecanica cinetica dinamica
Mecanica cinetica dinamicaMecanica cinetica dinamica
Mecanica cinetica dinamicabyred
 

En vedette (20)

Segunda gerra civil republica de roma
Segunda gerra civil republica de romaSegunda gerra civil republica de roma
Segunda gerra civil republica de roma
 
Tutoria 2 cipas
Tutoria 2 cipasTutoria 2 cipas
Tutoria 2 cipas
 
Programa4
Programa4Programa4
Programa4
 
Semiconductores
SemiconductoresSemiconductores
Semiconductores
 
responsabilidad+empresarial
responsabilidad+empresarialresponsabilidad+empresarial
responsabilidad+empresarial
 
Gap Analysis
Gap AnalysisGap Analysis
Gap Analysis
 
Percepcion de la informacion
Percepcion de la informacionPercepcion de la informacion
Percepcion de la informacion
 
Ideas del grupo colaborativo 68
Ideas del grupo colaborativo 68Ideas del grupo colaborativo 68
Ideas del grupo colaborativo 68
 
Administração de materiais unidade 02 14-06-07 - 151 - ppts 01 slide por folha
Administração de materiais unidade 02   14-06-07 - 151 - ppts 01 slide por folhaAdministração de materiais unidade 02   14-06-07 - 151 - ppts 01 slide por folha
Administração de materiais unidade 02 14-06-07 - 151 - ppts 01 slide por folha
 
Trastorno de hiperactividad con déficit de atención (
Trastorno de hiperactividad con déficit de atención (Trastorno de hiperactividad con déficit de atención (
Trastorno de hiperactividad con déficit de atención (
 
Dónde guardar parche español foxit
Dónde guardar parche español foxitDónde guardar parche español foxit
Dónde guardar parche español foxit
 
Plan de area 2010 old
Plan de area 2010 oldPlan de area 2010 old
Plan de area 2010 old
 
Sistema solar
Sistema solarSistema solar
Sistema solar
 
Sumário Pesquisa Redes Sociais - Missão 1 - "Como os internautas brasileiros ...
Sumário Pesquisa Redes Sociais - Missão 1 - "Como os internautas brasileiros ...Sumário Pesquisa Redes Sociais - Missão 1 - "Como os internautas brasileiros ...
Sumário Pesquisa Redes Sociais - Missão 1 - "Como os internautas brasileiros ...
 
Trata de blancas
Trata de blancasTrata de blancas
Trata de blancas
 
trabalho de historia
trabalho de historiatrabalho de historia
trabalho de historia
 
Mecanica cinetica dinamica
Mecanica cinetica dinamicaMecanica cinetica dinamica
Mecanica cinetica dinamica
 
mariposas
mariposasmariposas
mariposas
 
Presentacion la organizacion y la mercadotecnia
Presentacion la organizacion y la mercadotecniaPresentacion la organizacion y la mercadotecnia
Presentacion la organizacion y la mercadotecnia
 
Paola filosofo
Paola filosofoPaola filosofo
Paola filosofo
 

Similaire à Unit Testing Fundamentals Explained in 40 Characters

Junit y Jmock
Junit y JmockJunit y Jmock
Junit y Jmockkaolong
 
Construccion a través de compontes
Construccion a través de compontesConstruccion a través de compontes
Construccion a través de compontesjalzate
 
P R A C T I C A2
P R A C T I C A2P R A C T I C A2
P R A C T I C A2climancc
 
Introducción a Unit Testing y TDD
Introducción a Unit Testing y TDDIntroducción a Unit Testing y TDD
Introducción a Unit Testing y TDDFernando Perez
 
Taller: Prueba Unitaria con JUnit en NetBeans
Taller: Prueba Unitaria con JUnit en NetBeansTaller: Prueba Unitaria con JUnit en NetBeans
Taller: Prueba Unitaria con JUnit en NetBeansEmerson Garay
 
_5 - Prácticas 3 - Constructor. El método mágico..pdf
_5 - Prácticas 3 - Constructor. El método mágico..pdf_5 - Prácticas 3 - Constructor. El método mágico..pdf
_5 - Prácticas 3 - Constructor. El método mágico..pdfLaura Ofelia Morales Pérez
 
REVIEWCLEANCODE9-11_GROUP4_FINAL.pptx
REVIEWCLEANCODE9-11_GROUP4_FINAL.pptxREVIEWCLEANCODE9-11_GROUP4_FINAL.pptx
REVIEWCLEANCODE9-11_GROUP4_FINAL.pptxHacheLOrtega
 
Pruebas de aceptación 15 11_2013
Pruebas de aceptación 15 11_2013Pruebas de aceptación 15 11_2013
Pruebas de aceptación 15 11_2013dayaorte
 
Clase 11 De Septiembre 2009
Clase 11 De Septiembre 2009Clase 11 De Septiembre 2009
Clase 11 De Septiembre 2009mtemarialuisa
 
Bases de Datos en Java - Intro a JDBC
Bases de Datos en Java - Intro a JDBCBases de Datos en Java - Intro a JDBC
Bases de Datos en Java - Intro a JDBCCarlos Hernando
 
Guia practica secuenciales eclipse java 01
Guia practica secuenciales eclipse java 01Guia practica secuenciales eclipse java 01
Guia practica secuenciales eclipse java 01Emerson Garay
 
Tema 9 pruebas unitarias por gio
Tema 9   pruebas unitarias por gioTema 9   pruebas unitarias por gio
Tema 9 pruebas unitarias por gioRobert Wolf
 
Cómo lograr mejores pruebas
Cómo lograr mejores pruebasCómo lograr mejores pruebas
Cómo lograr mejores pruebasAndreína Romero
 

Similaire à Unit Testing Fundamentals Explained in 40 Characters (20)

TDD: ¿Cómo escribir código testeable?
TDD: ¿Cómo escribir código testeable?TDD: ¿Cómo escribir código testeable?
TDD: ¿Cómo escribir código testeable?
 
Gwt III - Avanzado
Gwt III - AvanzadoGwt III - Avanzado
Gwt III - Avanzado
 
Junit y Jmock
Junit y JmockJunit y Jmock
Junit y Jmock
 
Construccion a través de compontes
Construccion a través de compontesConstruccion a través de compontes
Construccion a través de compontes
 
P R A C T I C A2
P R A C T I C A2P R A C T I C A2
P R A C T I C A2
 
Introducción a Unit Testing y TDD
Introducción a Unit Testing y TDDIntroducción a Unit Testing y TDD
Introducción a Unit Testing y TDD
 
Taller: Prueba Unitaria con JUnit en NetBeans
Taller: Prueba Unitaria con JUnit en NetBeansTaller: Prueba Unitaria con JUnit en NetBeans
Taller: Prueba Unitaria con JUnit en NetBeans
 
_5 - Prácticas 3 - Constructor. El método mágico..pdf
_5 - Prácticas 3 - Constructor. El método mágico..pdf_5 - Prácticas 3 - Constructor. El método mágico..pdf
_5 - Prácticas 3 - Constructor. El método mágico..pdf
 
REVIEWCLEANCODE9-11_GROUP4_FINAL.pptx
REVIEWCLEANCODE9-11_GROUP4_FINAL.pptxREVIEWCLEANCODE9-11_GROUP4_FINAL.pptx
REVIEWCLEANCODE9-11_GROUP4_FINAL.pptx
 
Pruebas de aceptación 15 11_2013
Pruebas de aceptación 15 11_2013Pruebas de aceptación 15 11_2013
Pruebas de aceptación 15 11_2013
 
Java básico
Java  básicoJava  básico
Java básico
 
Clase 11 De Septiembre 2009
Clase 11 De Septiembre 2009Clase 11 De Septiembre 2009
Clase 11 De Septiembre 2009
 
Bases de Datos en Java - Intro a JDBC
Bases de Datos en Java - Intro a JDBCBases de Datos en Java - Intro a JDBC
Bases de Datos en Java - Intro a JDBC
 
Guia practica secuenciales eclipse java 01
Guia practica secuenciales eclipse java 01Guia practica secuenciales eclipse java 01
Guia practica secuenciales eclipse java 01
 
Tema 9 pruebas unitarias por gio
Tema 9   pruebas unitarias por gioTema 9   pruebas unitarias por gio
Tema 9 pruebas unitarias por gio
 
JQuery Mvc
JQuery   MvcJQuery   Mvc
JQuery Mvc
 
Java 7- Java Day Guatemala
Java 7- Java Day GuatemalaJava 7- Java Day Guatemala
Java 7- Java Day Guatemala
 
5.instrucciones de control en java parte2
5.instrucciones de control en java parte25.instrucciones de control en java parte2
5.instrucciones de control en java parte2
 
Ajax
AjaxAjax
Ajax
 
Cómo lograr mejores pruebas
Cómo lograr mejores pruebasCómo lograr mejores pruebas
Cómo lograr mejores pruebas
 

Plus de Jordi Gerona

Netty from the trenches
Netty from the trenchesNetty from the trenches
Netty from the trenchesJordi Gerona
 
Google Guava - Core libraries for Java & Android
Google Guava - Core libraries for Java & AndroidGoogle Guava - Core libraries for Java & Android
Google Guava - Core libraries for Java & AndroidJordi Gerona
 
Clean code via dependency injection + guice
Clean code via dependency injection + guiceClean code via dependency injection + guice
Clean code via dependency injection + guiceJordi Gerona
 
Mitos y otras criaturas startuperas (webbar)
Mitos y otras criaturas startuperas (webbar)Mitos y otras criaturas startuperas (webbar)
Mitos y otras criaturas startuperas (webbar)Jordi Gerona
 
Dependency Injection con Guice - GTUG
Dependency Injection con Guice - GTUGDependency Injection con Guice - GTUG
Dependency Injection con Guice - GTUGJordi Gerona
 

Plus de Jordi Gerona (6)

Netty from the trenches
Netty from the trenchesNetty from the trenches
Netty from the trenches
 
Google Guava - Core libraries for Java & Android
Google Guava - Core libraries for Java & AndroidGoogle Guava - Core libraries for Java & Android
Google Guava - Core libraries for Java & Android
 
Clean code via dependency injection + guice
Clean code via dependency injection + guiceClean code via dependency injection + guice
Clean code via dependency injection + guice
 
Mitos y otras criaturas startuperas (webbar)
Mitos y otras criaturas startuperas (webbar)Mitos y otras criaturas startuperas (webbar)
Mitos y otras criaturas startuperas (webbar)
 
Mercurial
MercurialMercurial
Mercurial
 
Dependency Injection con Guice - GTUG
Dependency Injection con Guice - GTUGDependency Injection con Guice - GTUG
Dependency Injection con Guice - GTUG
 

Unit Testing Fundamentals Explained in 40 Characters

  • 1. Unit Testing @jordi9 4 diciembre 2010
  • 2. roadmap Definición Primer test Excusas Tipos de tests <3 Mockito Código testeable Q & A #bcngtug http://bitbucket.org/jordi9/gtug-unit-testing http://slideshare.net/giro9
  • 3. definición Código (método) que ejecuta un otro código para comprobar su validez.  ... todos hemos escrito unit tests (o algo parecido) características Automático y repetible Fácil de implementar. Cualquiera puede ejecutarlo &quot;apretando un botón&quot; Debe ser  rápido  (<1ms)
  • 4. nuestro primer test frameworks xUnit family: SUnit, JUnit, NUnit, PHPUnit... Nos facilitan como escribir un test, ejecutarlo y obtener resultados. (ejemplos en JUnit) esquema básico de un test Class Under Test (CUT, SUT, @Unit ...) Precondición - Ejecución - Postcondición postcondición...?  Assert assertTrue(boolean); assertEquals(expected, actual); (...) Hamcrest assertThat(foo, is(&quot;foo&quot;));  assertThat(bar, is(not(&quot;foo&quot;)));  assertThat(list, hasSize(9)); 
  • 6. test con junit public class StringsTest {        @Test     public void stripAllHTMLForAGivenText() {         String html = &quot;<a>Link</a>&quot;;         assertThat(Strings.stripHTML(html), is(&quot;Link&quot;));     }       } public class Strings {      public static String stripHTML(String input) {         return input.replaceAll(&quot;</?+(b)[ˆ<>]++>&quot;, &quot;&quot;);     }   } unit test
  • 7. tipos de test by @mhevery
  • 9. unit test...? // Class under test CreditCardProcessor creditCardProcessor; @Test public void chargeCreditCard() {         creditCardProcessor = new CreditCardProcessor();    CreditCard c = new CreditCard(&quot;9999 0000 7777&quot;, 5, 2009);    creditCardProcessor.charge(c, 30.0);    assertThat (creditCardProcessor.balance(c), is(-30.0)); } public CreditCardProcessor() { }    Mi tarjeta tenía 30 Euros menos!  
  • 10. test con dependencias / mocks Dependencias falsas: mocks frameworks fases &quot;expect&quot; - &quot;replay&quot; - &quot;verify&quot;
  • 12. preparando un test @Before @After Se ejecutan por cada test unitario public class DatabaseTest {    @Before  public void prepareFakeDatabase() {}    @After  public void cleanupFakeDatabase() {} } @BeforeClass @AfterClass Se ejecutan una vez por un conjunto de test public class DatabaseTest {    @BeforeClass  public static void prepareRealDatabase() {}    @AfterClass  public static void cleanupRealDatabase() {} }
  • 13. más opciones junit testeando excepciones @Test(expected=IllegalArgumentException.class) public void emptyInputShouldRaiseAnException() {   Strings.stripHTML(&quot;&quot;); } tests con timeout @Test(timeout=1000) public void timeoutFirst() {   Strings.veryLongMethod(&quot;foo&quot;); } ignorar un test @Ignore(&quot;Some very good reason&quot;) @Test(timeout=1000) public void timeoutFirst() {   Strings.veryLongMethod(&quot;foo&quot;); }
  • 15. detectar código no testeable new 's encapsulados Coste de construcción Estado global API's que engañan
  • 16. new 's encapsulados class House {    Kitchen kitchen = new Kitchen();    Bedroom bedroom;    House() {    bedroom = new Bedroom();    } }
  • 17. new 's encapsulados class House {    Kitchen kitchen = new Kitchen();    Bedroom bedroom;    House() {    bedroom = new Bedroom();    } } class HouseTest {    @Test    public void thisIsReallyHard() {      House house = new House();      // Oops... y si quiero utilizar otra cocina u otra      // habitación?    } }
  • 18. new 's encapsulados fixed class House {    Kitchen kitchen;    Bedroom bedroom;    @Inject // Guice!    House(Kitchen kitchen, Bedroom bedroom) {      this.kitchen = kitchen;      this.bedroom = bedroom;    } }
  • 19. new 's encapsulados fixed class House {    Kitchen kitchen;    Bedroom bedroom;    @Inject // Guice!    House(Kitchen kitchen, Bedroom bedroom) {      this.kitchen = kitchen;      this.bedroom = bedroom;    } } class HouseTest {    @Test    public void thisIsCoolAndFlexible() {      Kitchen kitchen = new FooKitchen();      Bedroom bedroom = new InexpensiveBedroom();      House house = new House(kitchen, bedroom); // yay!    } }
  • 20. Coste de construcción class Car {    Engine engine;    Car(File file) {      String model = readEngineModel(file); // expensive method      engine = new EngineFactory().create(model);    } } Para instanciar un objeto:     Tienes que navegar por todo lo que se haga en la constructora.     No puedes sobrescribirla.
  • 21. Coste de construcción class Car {    Engine engine;    Car(File file) {      String model = readEngineModel(file); // expensive method      engine = new EngineFactory().create(model);    } } class CarTest {    public void noSeamForFakeEngine() {      // Aggh! Ficheros en los unit tests...      File file = new File(&quot;engine.config&quot;);      Car car = new Car(file);    // Quiero utilizar otro motor pero no puedo por culpa    // de la fábrica...    } } Para instanciar un objeto:     Tienes que navegar por todo lo que se haga en la constructora.     No puedes sobrescribirla.
  • 22. Coste de construcción class Car {    Engine engine;        Car(Engine engine) {      this.engine = engine;    } } @Provides  // más Guice! Engine providesEngine(EngineFactory engineFactory,                      @EngineModel String model) {    return engineFactory.create(model); }
  • 23. Coste de construcción class Car {    Engine engine;        Car(Engine engine) {      this.engine = engine;    } } @Provides  // más Guice! Engine providesEngine(EngineFactory engineFactory,                      @EngineModel String model) {    return engineFactory.create(model); } @Test public void nowWeHaveACleanDesign() {    Engine fakeEngine = new FakeEngine();    Car car = new Car(fakeEngine); }    Hacer el mínimo trabajo posible en la constructora
  • 24. Estado global Repetir el mismo proceso y obtener un resultado diferente... ugh! síntomas Orden de los tests importa (prohibido!) No se pueden ejecutar los tests en paralelo ejemplos En la propia JVM tenemos malos ejemplos:    System.currentTime();    new Date();    Math.random() Testear el código anterior es muy difícil.
  • 25. APIs engañosas Dependencias ocultas... recuperemos el ejemplo de antes @Test public void chargeCreditCard() {         CreditCard cc = new CreditCard(&quot;9999 0000 7777&quot;, 5, 2009);    cc.charge(30.0); } java.lang.NullPointerExpection    at org.donky.gtug.C reditCard.charge()
  • 26. APIs engañosas @Test public void chargeCreditCard() {          CreditCardProcessor.init();    CreditCard cc = new CreditCard(&quot;9999 0000 7777&quot;, 5, 2009);    cc.charge(30.0); } java.lang.NullPointerExpection    at org.donky.gtug.C reditCardProcessor.init()
  • 27. APIs engañosas @Test public void chargeCreditCard() {    OfflineQueue.start();     CreditCardProcessor.init();    CreditCard cc = new CreditCard(&quot;9999 0000 7777&quot;, 5, 2009);    cc.charge(30.0); } java.lang.NullPointerExpection    at org.donky.gtug.OfflineQueue .start()
  • 28. APIs engañosas @Test public void chargeCreditCard() {    Database.connect(...);    OfflineQueue.start();     CreditCardProcessor.init();    CreditCard cc = new CreditCard(&quot;9999 0000 7777&quot;, 5, 2009);    cc.charge(30.0); } La API de CreditCard nos engaña:    No expone sus dependencias de manera clara.    Pretende no necesitar la CreditCardProcessor pero lo hace.    Aun pierdo 30 Euros! Si tu código depende del orden en que se inician los Singletons... está documentado en alguna parte? Quien no se ha encontrado esto nunca?;) La solución es Dependency Injection: Te fuerza el orden correcto en tiempo de compilación.
  • 29. una solución mejor @Test public void chargeCreditCard() {    db = new Database(...);    queue = new OfflineQueue( db );    ccProc = new CreditCardProcessor( queue );    CreditCard cc = new CreditCard( ccProc , &quot;9999 0000 7777&quot;);    cc.charge(30.0); }
  • 30. muchísimas más cosas! más frameworks DbUnit WebDriver / Selenium 2 MockRunner Android: ActivityInstrumentationTestCase           ActivityUnitTestCase metodologías Test Driven Development (<3) Acceptance Test utilidades Test coverage: Cobertura / Clover Testability Explorer
  • 32. Q & A jordi @donky.org @jordi9

Notes de l'éditeur

  1. Introduir eventuo, els seus inicis, alguna caracterísitca? escollir tecnologies, descobrir Guice i com va canviar el meu punt de vista
  2. parlar d&apos;un test com pensar el que volem o esperem que passi.
  3. parlar d&apos;un test com pensar el que volem o esperem que passi.
  4. parlar d&apos;un test com pensar el que volem o esperem que passi.
  5. parlar d&apos;un test com pensar el que volem o esperem que passi.
  6. parlar d&apos;un test com pensar el que volem o esperem que passi.
  7. parlar d&apos;un test com pensar el que volem o esperem que passi.
  8. parlar d&apos;un test com pensar el que volem o esperem que passi.
  9. parlar d&apos;un test com pensar el que volem o esperem que passi.
  10. parlar d&apos;un test com pensar el que volem o esperem que passi.
  11. parlar d&apos;un test com pensar el que volem o esperem que passi.
  12. parlar d&apos;un test com pensar el que volem o esperem que passi.
  13. parlar d&apos;un test com pensar el que volem o esperem que passi.
  14. parlar d&apos;un test com pensar el que volem o esperem que passi.
  15. parlar d&apos;un test com pensar el que volem o esperem que passi.
  16. parlar d&apos;un test com pensar el que volem o esperem que passi.
  17. parlar d&apos;un test com pensar el que volem o esperem que passi.
  18. parlar d&apos;un test com pensar el que volem o esperem que passi.
  19. parlar d&apos;un test com pensar el que volem o esperem que passi.
  20. parlar d&apos;un test com pensar el que volem o esperem que passi.
  21. parlar d&apos;un test com pensar el que volem o esperem que passi.
  22. parlar d&apos;un test com pensar el que volem o esperem que passi.
  23. parlar d&apos;un test com pensar el que volem o esperem que passi.