Your SlideShare is downloading. ×
0
Unit Testing - GTUG
Unit Testing - GTUG
Unit Testing - GTUG
Unit Testing - GTUG
Unit Testing - GTUG
Unit Testing - GTUG
Unit Testing - GTUG
Unit Testing - GTUG
Unit Testing - GTUG
Unit Testing - GTUG
Unit Testing - GTUG
Unit Testing - GTUG
Unit Testing - GTUG
Unit Testing - GTUG
Unit Testing - GTUG
Unit Testing - GTUG
Unit Testing - GTUG
Unit Testing - GTUG
Unit Testing - GTUG
Unit Testing - GTUG
Unit Testing - GTUG
Unit Testing - GTUG
Unit Testing - GTUG
Unit Testing - GTUG
Unit Testing - GTUG
Unit Testing - GTUG
Unit Testing - GTUG
Unit Testing - GTUG
Unit Testing - GTUG
Unit Testing - GTUG
Unit Testing - GTUG
Unit Testing - GTUG
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Unit Testing - GTUG

754

Published on

0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
754
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
24
Comments
0
Likes
3
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide
  • Introduir eventuo, els seus inicis, alguna caracterísitca? escollir tecnologies, descobrir Guice i com va canviar el meu punt de vista
  • parlar d'un test com pensar el que volem o esperem que passi.
  • parlar d'un test com pensar el que volem o esperem que passi.
  • parlar d'un test com pensar el que volem o esperem que passi.
  • parlar d'un test com pensar el que volem o esperem que passi.
  • parlar d'un test com pensar el que volem o esperem que passi.
  • parlar d'un test com pensar el que volem o esperem que passi.
  • parlar d'un test com pensar el que volem o esperem que passi.
  • parlar d'un test com pensar el que volem o esperem que passi.
  • parlar d'un test com pensar el que volem o esperem que passi.
  • parlar d'un test com pensar el que volem o esperem que passi.
  • parlar d'un test com pensar el que volem o esperem que passi.
  • parlar d'un test com pensar el que volem o esperem que passi.
  • parlar d'un test com pensar el que volem o esperem que passi.
  • parlar d'un test com pensar el que volem o esperem que passi.
  • parlar d'un test com pensar el que volem o esperem que passi.
  • parlar d'un test com pensar el que volem o esperem que passi.
  • parlar d'un test com pensar el que volem o esperem que passi.
  • parlar d'un test com pensar el que volem o esperem que passi.
  • parlar d'un test com pensar el que volem o esperem que passi.
  • parlar d'un test com pensar el que volem o esperem que passi.
  • parlar d'un test com pensar el que volem o esperem que passi.
  • parlar d'un test com pensar el que volem o esperem que passi.
  • Transcript

    • 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)); 
    • 5. ejemplo primer test
    • 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
    • 8. excusas... 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;
    • 11. ejemplo <3 mockito
    • 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;); }
    • 14. ejemplo /etc/junit
    • 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
    • 31. gracias! jordi @donky.org @jordi9
    • 32. Q & A jordi @donky.org @jordi9

    ×