SlideShare una empresa de Scribd logo
Unit Testing @jordi9 4 noviembre 2011
roadmap Definición Primer test Excusas Tipos de tests <3 Mockito Código testeable Q & A #trovitrocks 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. esquema básico de un test System Under Test (SUT) Precondición - Ejecución - Postcondición  setup > excercise > verify > teardown 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() {} }
fixtures  preconditions Transient fresh fixtures Cada test construye su fixture cada vez y para el solo.      Muy fácil de mantener -- Tests totalmente independientes      Sirve como  Test as Documentation + Minimal Fixture      No teardown -- Implicito Persistent fresh fixtures Tests de integración      Caso claro: Tests con base de datos      Teardown Shared fixtures Reutilizamos los fixture entre varios tests pero...      Rompemos la regla de oro:  Keep Tests Independent ... =\      Problemas infinitos:  Erratic Tests ,  Obscure Test    http://goo.gl/oxpca | http://goo.gl/22Q19       Difícil de mantener:  Fragile Fixture  http://goo.gl/TDUw0
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 com.trovit.unittesting.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  com.trovit.unittesting .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  com.trovit.unittesting .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 Continous Integration / Jenkins utilidades Test coverage: Cobertura / Clover Testability Explorer
gracias! jordi9 @trovit.com @jordi9
Q & A jordi9 @trovit.com @jordi9

Más contenido relacionado

PPT
Unit Testing - GTUG
PDF
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
PDF
Testing efectivo con pytest
ODP
Ajax
PDF
Cambia la forma de desarrollar tus aplicaciones web con groovy y grails
PPTX
Concurrencia en Java
DOCX
PDF
Usando Twisted para hacer aplicaciones de escritorio no bloqueantes
Unit Testing - GTUG
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
Testing efectivo con pytest
Ajax
Cambia la forma de desarrollar tus aplicaciones web con groovy y grails
Concurrencia en Java
Usando Twisted para hacer aplicaciones de escritorio no bloqueantes

La actualidad más candente (20)

PDF
DOCX
Test bench en vhdl
PPTX
Reactividad en Angular, React y VueJS
PDF
PEP-3156: Async I/O en Python
PDF
Java ArrayList Iterator
PDF
Deployer PHP. Presentación para #PHPSevilla
PDF
Gulp js php sevilla 28 septiembre 2016
PDF
Concurrencia y nuevas características en C++11
PDF
Ejemplos programacion socket java
PDF
SCJP, Clase 8: Inner Classes
PDF
Sincronizar Threads
PPT
Introduccion A Groovy
PDF
Java HashMap
PDF
PDF
Integrando React.js en aplicaciones Symfony (deSymfony 2016)
DOCX
PDF
Desarrollo web en Nodejs con Pillars por Chelo Quilón
PDF
Magallanes, Herramienta de despliegue PHP sencilla y poderosa
PDF
Construccion de proyectos con gradle
ODP
Viernes Tecnicos DTrace
Test bench en vhdl
Reactividad en Angular, React y VueJS
PEP-3156: Async I/O en Python
Java ArrayList Iterator
Deployer PHP. Presentación para #PHPSevilla
Gulp js php sevilla 28 septiembre 2016
Concurrencia y nuevas características en C++11
Ejemplos programacion socket java
SCJP, Clase 8: Inner Classes
Sincronizar Threads
Introduccion A Groovy
Java HashMap
Integrando React.js en aplicaciones Symfony (deSymfony 2016)
Desarrollo web en Nodejs con Pillars por Chelo Quilón
Magallanes, Herramienta de despliegue PHP sencilla y poderosa
Construccion de proyectos con gradle
Viernes Tecnicos DTrace
Publicidad

Similar a Unit Testing - Trovit (20)

PPTX
TDD: ¿Cómo escribir código testeable?
PPTX
Pruebas Automatizadas
PDF
Testing 101 con Arquillian
PDF
Desarrollo con Java y metodologías agiles
PPTX
REVIEWCLEANCODE9-11_GROUP4_FINAL.pptx
PPT
Test unitarios
PPTX
Unit Testing with Mock Objects
PPTX
Introducción a Unit Testing y TDD
PPT
Junit y Jmock
PDF
Curso TDD Ruby on Rails #06: Mocks y stubs
ODP
Toi Tdd 20080409
PDF
Pruebas software con junit ..
PDF
Test Driven Development
PDF
DeSymfonyDay 2014 - To mock or not to mock - Spanish
PDF
DeSymfonyDay 2014 - To mock or not to mock - Spanish
PDF
DeSymfonyDay 2014 - To mock or not to mock - Spanish
PPT
Seminario de Test Development Driven
PDF
To mock or not to mock
DOCX
Ingenieria de sw Junit
PDF
Taller de Unit Testing y TDD en Java: Parte 1
TDD: ¿Cómo escribir código testeable?
Pruebas Automatizadas
Testing 101 con Arquillian
Desarrollo con Java y metodologías agiles
REVIEWCLEANCODE9-11_GROUP4_FINAL.pptx
Test unitarios
Unit Testing with Mock Objects
Introducción a Unit Testing y TDD
Junit y Jmock
Curso TDD Ruby on Rails #06: Mocks y stubs
Toi Tdd 20080409
Pruebas software con junit ..
Test Driven Development
DeSymfonyDay 2014 - To mock or not to mock - Spanish
DeSymfonyDay 2014 - To mock or not to mock - Spanish
DeSymfonyDay 2014 - To mock or not to mock - Spanish
Seminario de Test Development Driven
To mock or not to mock
Ingenieria de sw Junit
Taller de Unit Testing y TDD en Java: Parte 1
Publicidad

Más de Jordi Gerona (6)

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

Unit Testing - Trovit

  • 1. Unit Testing @jordi9 4 noviembre 2011
  • 2. roadmap Definición Primer test Excusas Tipos de tests <3 Mockito Código testeable Q & A #trovitrocks 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. esquema básico de un test System Under Test (SUT) Precondición - Ejecución - Postcondición  setup > excercise > verify > teardown 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. fixtures  preconditions Transient fresh fixtures Cada test construye su fixture cada vez y para el solo.      Muy fácil de mantener -- Tests totalmente independientes     Sirve como  Test as Documentation + Minimal Fixture     No teardown -- Implicito Persistent fresh fixtures Tests de integración      Caso claro: Tests con base de datos     Teardown Shared fixtures Reutilizamos los fixture entre varios tests pero...     Rompemos la regla de oro: Keep Tests Independent ... =\     Problemas infinitos: Erratic Tests , Obscure Test    http://goo.gl/oxpca | http://goo.gl/22Q19       Difícil de mantener: Fragile Fixture  http://goo.gl/TDUw0
  • 14. 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;); }
  • 16. detectar código no testeable new 's encapsulados Coste de construcción Estado global API's que engañan
  • 17. new 's encapsulados class House {    Kitchen kitchen = new Kitchen();    Bedroom bedroom;    House() {    bedroom = new Bedroom();    } }
  • 18. 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?    } }
  • 19. new 's encapsulados fixed class House {    Kitchen kitchen;    Bedroom bedroom;    @Inject // Guice!    House(Kitchen kitchen, Bedroom bedroom) {      this.kitchen = kitchen;      this.bedroom = bedroom;    } }
  • 20. 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!    } }
  • 21. 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.
  • 22. 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.
  • 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); }
  • 24. 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
  • 25. 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.
  • 26. 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 com.trovit.unittesting.C reditCard.charge()
  • 27. 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  com.trovit.unittesting .C reditCardProcessor.init()
  • 28. 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  com.trovit.unittesting .OfflineQueue .start()
  • 29. 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.
  • 30. 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); }
  • 31. muchísimas más cosas! más frameworks DbUnit WebDriver / Selenium 2 MockRunner Android: ActivityInstrumentationTestCase            ActivityUnitTestCase metodologías Test Driven Development (<3) Acceptance Test Continous Integration / Jenkins utilidades Test coverage: Cobertura / Clover Testability Explorer
  • 33. Q & A jordi9 @trovit.com @jordi9

Notas del editor

  • #3: Introduir eventuo, els seus inicis, alguna caracterísitca? escollir tecnologies, descobrir Guice i com va canviar el meu punt de vista
  • #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.
  • #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.
  • #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.
  • #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.
  • #24: parlar d&apos;un test com pensar el que volem o esperem que passi.
  • #25: parlar d&apos;un test com pensar el que volem o esperem que passi.
  • #26: parlar d&apos;un test com pensar el que volem o esperem que passi.
  • #27: parlar d&apos;un test com pensar el que volem o esperem que passi.
  • #28: parlar d&apos;un test com pensar el que volem o esperem que passi.
  • #29: parlar d&apos;un test com pensar el que volem o esperem que passi.
  • #30: parlar d&apos;un test com pensar el que volem o esperem que passi.
  • #31: parlar d&apos;un test com pensar el que volem o esperem que passi.