JUnit.pptx

31
Test s Unitari os con JUni t 4

Transcript of JUnit.pptx

Presentacin de PowerPoint

TestsUnitariosconJUnit4TemarioTipos de TestsIntroduccin a JUnitTest ClassTest MethodsCondiciones de aceptacin AssertFixture MethodsTest SuitesTests de TimeoutTests de manejo de excepcionesTest RunnersTests Parametrizados AssertThat y Hamcrest Buenas PrcticasTipos de validacinTipos de Tests(1/3) Clasificacin por Nivel Tests Tests Tests TestsUnitarios.dede deIntegracin.Sistema. Integracin deSistemas. Pruebas Funcionales Tests Tests TestsFuncionales.de Aceptacin. de Regresin (cambios en cdigo funcionan). Alpha testing. Beta testing. ...Tipos de Tests(2/3) Pruebas No-funcionales Tests Tests Tests Tests Tests ...dede de de deRendimientoResistencia, Carga, Seguridad Usabilidad MantenibilidadStressTipos de Tests(3/3) Clasificacin tpicaDesarrolladoren un entorno TDD.Dueo del ProductoTests deAceptacinTestsFuncionalesTestsUnitariosTests de SistemaTests deIntegracinTests Unitarios(1/3)Los tests unitarios son una forma de probar el correctofuncionamiento de un mdulo o una parte del sistema.Con el fin de asegurar el correcto funcionamiento de todos los mdulos por separado y evitar as errores futuros en el momento de la integracin de todas sus partes.La idea es escribir casos de prueba para cada funcin notrivial o mtodo en el mdulo, de forma que cada caso sea independiente del resto.Tests Unitarios(2/3)Ventajas:1.2.3.4.5.Fomentan el cambio.Simplifica la integracin. Documentan el cdigo. Separacin de la interfazy la implementacin.Los errores quedan ms acotados y son msfciles de localizar.Tests Unitarios(3/3)Un buen test unitario tiene que ser repetible ydebe poder ejecutarse de forma automtica.Las Pruebas Automticas reducen el riesgoahorran el coste de repetir los test manualmente.yLos equipos giles, las utilizan como ayudapara responder al cambio de forma rpida y un coste eficiente.aIntroduccin a JUnit(1/3)JUnit es una librera Java que nosayudar en la realizacin de nuestros tests automticos de prueba.Creado por Erich Gammauno de los frameworks de conocidos colectivamentey Kent Beck, estests unitarios como xUnit,originados por C (CUnit)SUnit.Javascript (JSUnit)Objective-C (OCUnit) PHP (PHPUnit)... C++ (CPPUnit) Fortran (fUnit) Delphi (DUnit)Introduccin a JUnit(2/3)JUnit proporciona:Afirmaciones para verificar resultados.Anotaciones para definir mtodos de prueba. Anotaciones para definir mtodos adicionales post prueba.Controlar excepciones, tiempos de espera.Parametrizacin de datos.preyDiferentes Runners para guiar la ejecucin de laspruebas....Introduccin a JUnit(3/3)Los conceptos bsicosdeJUnitson:Test classTest method AssertFixture methodTest suiteTest runnerTest ClassUna Test Class es una clase java que contendr un conjuntode Test Methods.Por ejemplo, para probar los mtodos de una claseCalculadora creamos la clase CalculadoraTest.import org.junit.Test;public class CalculadoraTest {@Testpublic void testXXX() {...}}Test Methods(1/2)Los mtodos de prueba deben [email protected] la anotacinTienenqueserpblicos,sinparmetrosydevolvervoid.JUnit crea una nueva instancia de la test class antes deinvocar a cada @Test method.import org.junit.Test;public class CalculadoraTest {@Testpublic void testSuma() {Calculadora calculadora = new CalculadoraImpl(); double res = calculadora.suma(1, 1); assertEquals(2, res, 0);}}Test Methods(2/2)Los mtodos de test los creamos siguiendo el patrn AAA:1.2.3.Arrange (Preparar)Act (Actuar) Assert (Afirmar)@Testpublic void testSuma() {// ArrangeCalculadora calculadora = new CalculadoraImpl();// Actdouble res = calculadora.suma(1, 1);// AssertassertEquals(2, res, 0);}Condiciones de aceptacin AssertPara realizar validaciones en nuestros mtodos de prueba,utilizamos las condiciones de aceptacin assertXXX(), que proporciona la clase Assert de JUnit.Ejemplos:assertEquals("message", A, B)Validar la igualdad de los objetos A y B, utiliza el mtodo equals().assertSame("message", A, B)Validar que A y B son el mismo objeto, utiliza el operador ==.assertTrue("message", A)Validar que la condicin A es true.assertNotNull("message", A)Validar que el objeto A no es nulo.Fixture MethodsLas clases de tests tienen que programarse eficientementey refactorizarse cuando sea necesario.JUnit nos proporciona anotaciones para definir mtodos adicionales pre/post test. Mediante los que podemosinicializar o finalizar elementos comunes,evitarduplicidades, preparardatos,etc.@BeforeClass@Before@After@AfterClasspublic class CalculadoraTest { Calculadora calculadora;@Beforepublic void inicializa() {calculadora = new CalculadoraImpl();}@Testpublic void testSuma() {double res = calculadora.suma(1, 1);assertEquals(2, res, 0);}}Tests de TimeoutPodemos realizar sencillos test de rendimiento verificandoque un test no exceda un tiempolmite detimeout.ejecucin.ParaelloutilizamoselparmetroEl test fallar, si se demora ms de 100 milisegundos.@Test(timeout=100)public void testProcessTimeout() {...}Tests de manejo de excepcionesSi estamos probando un mtodo que puede lanzarexcepciones, nos es de inters poder verificar, que para lascondiciones oportunas, nuestro cdigo lanzaesperada.laexcepcinParaelloutilizamoselparmetroexpected.El test fallar, si no seproduce la excepcinIllegalArgumentException.@Test(expected=IllegalArgumentExcepcion.class)public void testSumaGetIllegalArgumentException() {...}Ignorar un TestJUnit proporciona una anotacin para indicar queundeterminadotestnoqueremosqueseejecute.Evitar un test no es una buenaprctica, pero sien algunaocasin nos es necesario es mejor utilizar la anotacin@Ignore a simplemente comentar cdigo.Es importante indicar siempre una razon por la que ignoramos un test con el parmetro value.@Ignore(value="Mensaje")@Testpublic void testXXX() {...}Tests RunnersJUnit permite definir cmo se han de ejecutar nuestrostests,medianteelusodediferentesTestsRunners.Utilizamos la anotacin @RunWith@RunWith(value=Parameterized.class)public class CalculadoraImplParameterizedTest {org.junit.runners.JUnit4Runner por defecto.org.junit.runners.ParameterizedEjecuta mltiples veces cada test con diferentes parmetros.org.junit.runners.SuiteRunner de los Test Suiteorg.springframework.test. context.junit4. SpringJUnit4ClassRunnerRunner de Spring para que los tests puedan trabajar con el contenedor IoC.Tests Parametrizados(1/2)Parameterized es un test runner que nos permite ejecutar untest mltiples veces con diferentes juegos de parmetros.@RunWith(value=Parameterized.class)public class CalculadoraImplParameterizedTest {private double esperado, num1, num2;@Parameterspublic static Collection gestTestParameters(){return Arrays.asList(new Integer[][] {{2, 1, 1}, {3, 2, 1}, {4, 3 ,1},});}public CalculadoraImplParameterizedTest(double esperado, double num1, double num2) {this.esperado = esperado; this.num1 = num1; this.num2 = num2;}@Testpublic void testSuma() {CalculadoraImpl calculadora = new CalculadoraImpl(); double calculado = calculadora.suma(num1, num2); assertEquals(esperado, calculado, 0);}}Tests Parametrizados(2/2)AssertThat y Hamcrest(1/2)La librera de matchers Hamcrest nos permiteescribirvalidacionesdeformamsclarayfcil.Adems, con Hamcrest, los errores en losdescriptivos.assert son ms@Testpublic void testSumaHamcrest() {CalculadoraImpl calculadora = new CalculadoraImpl();double calculado = calculadora.suma(num1, num2);assertThat(esperado, is(calculado));}AssertThat y Hamcrest(2/2)Matches Hamcrest mas comunes:anythingis allOf anyOf notinstanceOf, isCompatibleType sameInstancenotNullValue, nullValue hasPropertyhasEntry, hasKey, hasValue hasItem, hasItemscloseTo, greaterThan, lessThan containsString, endsWith, startWith...Buenas PrcticasUn test unitarioUn test unitario sistema.Un test unitariodebe probar exclusivamente el SUT.no puede modificar el estado deltiene que ser pequeo, debe probar unasola funcionalidad, para un nico objeto cada vez.Los nombres de los mtodos de test deben ser los ms claros posibles. No importa que utilicemos nombres largos.Indicar un mensaje en todas las llamadas assert.Deja que los tests mejoren el cdigo.Tipos de validacinRecapitulando, observamos que en nuestros testsunitarios realizamos diferentes tipos de comprobaciones:Validacin de estadoassertEquals ( valorEsperado, valorCalculado )Validacin excepciones@Test ( expected=IllegalArgumentException.class )Validacin rendimiento@Test ( timeout=100 )Validacin interaccinUtilizaremos Dobles (Mocks, Stubs, etc)Caso de ejemplo(1/5)Una Calculadora de Impuestos.public class CalculadoraImpuestosImpl implements CalculadoraImpuestos {public double calculaImpuestoMatriculacion(double valorVehiculo, int cv) {...}}public interface CalculadoraImpuestos {public double calculaImpuestoMatriculacion(double valorVehiculo, int cv);}Caso de ejemplo(2/5)Creamos la clase que contendr las pruebas.import static org.junit.Assert.*;import org.junit.Test;public class CalculadoraImpuestosImplTest {@Testpublic void test() {fail("Not yet implemented");}}Caso de ejemplo(3/5) 1 Regla de negocio:Vehculos con menos de 70CV impuesto 9% Primer test:@Testpublic void testUsoImpuestoEcologicoParaCvMenor70() {CalculadoraImpuestosImpl calculadora = new CalculadoraImpuestosImpl();double valorVehiculo = 10000;int cv = 65;double impuestoEsperado = 900;double impuestoCalculado = calculadora.calculaImpuestoMatriculacion(valorVehiculo, cv);assertEquals("Impuesto para vehiculos de menos de 70 CV debera ser del 9%", impuestoEsperado, impuestoCalculado, 0);}Caso de ejemplo(4/5) 2 Regla de negocio:Un vehculo no puede tener 0CV Segundo test:@Test(expected=IllegalArgumentException.class)public void test0CvGetIllegalArgumentException() {CalculadoraImpuestosImpl calculadora = new CalculadoraImpuestosImpl();calculadora.calculaImpuestoMatriculacion(100.0, 0);}Caso de ejemplo(5/5) Podemos refactorizar la clase de test para evitarduplicidad de cdigo.public class CalculadoraImpuestosImplTest {private CalculadoraImpuestosImpl calculadora;@Beforepublic void inicializa() {calculadora = new CalculadoraImpuestosImpl();}@Afterpublic void finaliza() {calculadora = null;}@Testpublic void testUsoImpuestoEcologicoParaCvMenor70() {double valorVehiculo = 10000;int cv = 65;double impuestoEsperado = 900;double impuestoCalculado = calculadora.calculaImpuestoMatriculacion(valorVehiculo, cv);assertEquals("Impuesto para vehiculos de menos de 70 CV debera ser del 9%," impuestoEsperado,impuestoCalculado, 0);}@Test(expected=IllegalArgumentException.class)public void test0CvGetIllegalArgumentException() {calculadora.calculaImpuestoMatriculacion(100.0, 0);}}