5. Ingeniería de Pruebas LS4128: Ingeniería del Software II DII – Universidad Nebrija Justo N....

26
5. Ingeniería de 5. Ingeniería de Pruebas Pruebas LS4128: Ingeniería del LS4128: Ingeniería del Software II Software II DII – Universidad Nebrija DII – Universidad Nebrija Justo N. Hidalgo Sanz Justo N. Hidalgo Sanz

Transcript of 5. Ingeniería de Pruebas LS4128: Ingeniería del Software II DII – Universidad Nebrija Justo N....

Page 1: 5. Ingeniería de Pruebas LS4128: Ingeniería del Software II DII – Universidad Nebrija Justo N. Hidalgo Sanz.

5. Ingeniería de Pruebas5. Ingeniería de Pruebas

LS4128: Ingeniería del LS4128: Ingeniería del Software IISoftware II

DII – Universidad NebrijaDII – Universidad NebrijaJusto N. Hidalgo SanzJusto N. Hidalgo Sanz

Page 2: 5. Ingeniería de Pruebas LS4128: Ingeniería del Software II DII – Universidad Nebrija Justo N. Hidalgo Sanz.

Ingeniería de Pruebas - Justo HidIngeniería de Pruebas - Justo Hidalgoalgo

22

ContenidosContenidos

• IntroducciónIntroducción• Pruebas UnitariasPruebas Unitarias

– JunitJunit

Utilizaremos los ejemplos que aparecen en el Framework de Utilizaremos los ejemplos que aparecen en el Framework de Junit.Junit.

Page 3: 5. Ingeniería de Pruebas LS4128: Ingeniería del Software II DII – Universidad Nebrija Justo N. Hidalgo Sanz.

Ingeniería de Pruebas - Justo HidIngeniería de Pruebas - Justo Hidalgoalgo

33

IntroducciónIntroducción

• Las pruebas son vitales en cualquier Las pruebas son vitales en cualquier proyecto SW.proyecto SW.

• Deben ser repetibles e Deben ser repetibles e incrementables.incrementables.

• Introducimos un framework de Introducimos un framework de pruebas unitarias.pruebas unitarias.

• Útil también para otro tipo de Útil también para otro tipo de pruebas: sistemas, integración.pruebas: sistemas, integración.

Page 4: 5. Ingeniería de Pruebas LS4128: Ingeniería del Software II DII – Universidad Nebrija Justo N. Hidalgo Sanz.

Ingeniería de Pruebas - Justo HidIngeniería de Pruebas - Justo Hidalgoalgo

44

Pruebas UnitariasPruebas Unitarias

• Durante el flujo de implementación Durante el flujo de implementación de cualquier iteración de cualquier de cualquier iteración de cualquier fase: PRUEBAS UNITARIASfase: PRUEBAS UNITARIAS

1.1. Utilización del main()Utilización del main()

2.2. Utilización de un Framework de Utilización de un Framework de PruebasPruebas

Page 5: 5. Ingeniería de Pruebas LS4128: Ingeniería del Software II DII – Universidad Nebrija Justo N. Hidalgo Sanz.

Ingeniería de Pruebas - Justo HidIngeniería de Pruebas - Justo Hidalgoalgo

55

Utilización del main()Utilización del main()

public class Clase {public class Clase {public void f(String _s) { //… }public void f(String _s) { //… }public void g(int _i) {//…}public void g(int _i) {//…}public void h(Collection _c) {//…}public void h(Collection _c) {//…}public static void main(String args[]) {public static void main(String args[]) {

Clase miClase = new Clase();Clase miClase = new Clase();miClase.f(“string”);miClase.f(“string”);miClase.g(25);miClase.g(25);miClase.h(v);miClase.h(v);

}}

Page 6: 5. Ingeniería de Pruebas LS4128: Ingeniería del Software II DII – Universidad Nebrija Justo N. Hidalgo Sanz.

Ingeniería de Pruebas - Justo HidIngeniería de Pruebas - Justo Hidalgoalgo

66

Framework de PruebasFramework de Pruebas

• Conjunto de paquetes y clases que Conjunto de paquetes y clases que permita automatizar las pruebas permita automatizar las pruebas unitarias.unitarias.

• Framework sencillo y ligero de utilizar.Framework sencillo y ligero de utilizar.

• JUnit es una opción muy utilizada para JUnit es una opción muy utilizada para Java.Java.– Sencillo: realmente, el desarrollador Sencillo: realmente, el desarrollador

podría implementarlo por su cuenta.podría implementarlo por su cuenta.

Page 7: 5. Ingeniería de Pruebas LS4128: Ingeniería del Software II DII – Universidad Nebrija Justo N. Hidalgo Sanz.

Ingeniería de Pruebas - Justo HidIngeniería de Pruebas - Justo Hidalgoalgo

77

JUnit (I)JUnit (I)

• Creado por Kent Beck.Creado por Kent Beck.– Gamma y Fowler también están Gamma y Fowler también están

involucrados.involucrados.

• www.junit.orgwww.junit.org

• Para control de pruebas y trazas, Para control de pruebas y trazas, funciona bien con log4Java (paquete de funciona bien con log4Java (paquete de gestión de trazas del proyecto Jakarta), o gestión de trazas del proyecto Jakarta), o el sistema de trazas estándar de el sistema de trazas estándar de J2SE1.4.xJ2SE1.4.x

Page 8: 5. Ingeniería de Pruebas LS4128: Ingeniería del Software II DII – Universidad Nebrija Justo N. Hidalgo Sanz.

Ingeniería de Pruebas - Justo HidIngeniería de Pruebas - Justo Hidalgoalgo

88

Junit (y II)Junit (y II)

• Utiliza como base el Utiliza como base el patrón Command.patrón Command.

• También el También el Template Method.Template Method.

• Y el Composite.Y el Composite.

Page 9: 5. Ingeniería de Pruebas LS4128: Ingeniería del Software II DII – Universidad Nebrija Justo N. Hidalgo Sanz.

Ingeniería de Pruebas - Justo HidIngeniería de Pruebas - Justo Hidalgoalgo

99

Funcionamiento básico (I)Funcionamiento básico (I)

• Creación de una subclase de Creación de una subclase de junit.framework.TestCasejunit.framework.TestCase

• Sobrecargar el método runTest()Sobrecargar el método runTest()• Para comprobar el valor de un Para comprobar el valor de un

elemento: assertTrue(boolean)elemento: assertTrue(boolean)– O assertEquals(xxx), assertNotNull(xxx), O assertEquals(xxx), assertNotNull(xxx),

assertNotSame(xxx), …assertNotSame(xxx), …– Métodos de junit.framework.AssertMétodos de junit.framework.Assert

Page 10: 5. Ingeniería de Pruebas LS4128: Ingeniería del Software II DII – Universidad Nebrija Justo N. Hidalgo Sanz.

Ingeniería de Pruebas - Justo HidIngeniería de Pruebas - Justo Hidalgoalgo

1010

Funcionamiento básico (y II): Funcionamiento básico (y II): ejemploejemplo

public void testSimpleAdd() {public void testSimpleAdd() {

Money m12CHF= new Money(12, "CHF");Money m12CHF= new Money(12, "CHF");

Money m14CHF= new Money(14, "CHF");Money m14CHF= new Money(14, "CHF");

Money expected= new Money(26, Money expected= new Money(26, "CHF");"CHF");

Money result= m12CHF.add(m14CHF);Money result= m12CHF.add(m14CHF);

assertTrue(expected.equals(result));assertTrue(expected.equals(result));

} }

Page 11: 5. Ingeniería de Pruebas LS4128: Ingeniería del Software II DII – Universidad Nebrija Justo N. Hidalgo Sanz.

Ingeniería de Pruebas - Justo HidIngeniería de Pruebas - Justo Hidalgoalgo

1111

Fixtures (I)Fixtures (I)

• Utilizado con pruebas parecidas Utilizado con pruebas parecidas entre sí, sobre el mismo o similar entre sí, sobre el mismo o similar conjunto de objetos.conjunto de objetos.

• Test fixture: conjunto conocido de Test fixture: conjunto conocido de objetos.objetos.

• La idea es implementar primero el La idea es implementar primero el código del “test fixture”, que luego código del “test fixture”, que luego será utilizado por diferentes pruebas.será utilizado por diferentes pruebas.

Page 12: 5. Ingeniería de Pruebas LS4128: Ingeniería del Software II DII – Universidad Nebrija Justo N. Hidalgo Sanz.

Ingeniería de Pruebas - Justo HidIngeniería de Pruebas - Justo Hidalgoalgo

1212

Fixtures (II): funcionamientoFixtures (II): funcionamiento

• Crear una subclase de TestCaseCrear una subclase de TestCase

• Añadir una instancia para cada parte Añadir una instancia para cada parte del “fixture”.del “fixture”.

• Sobrecargar el método “setUp()” Sobrecargar el método “setUp()” para inicializar los atributos.para inicializar los atributos.

• Sobrecargar “tearDown()” para Sobrecargar “tearDown()” para liberar los recursos almacenados en liberar los recursos almacenados en “setUp”.“setUp”.

Page 13: 5. Ingeniería de Pruebas LS4128: Ingeniería del Software II DII – Universidad Nebrija Justo N. Hidalgo Sanz.

Ingeniería de Pruebas - Justo HidIngeniería de Pruebas - Justo Hidalgoalgo

1313

Fixtures (y III): ejemploFixtures (y III): ejemplo

public class MoneyTest extends TestCase {public class MoneyTest extends TestCase {private Money f12CHF;private Money f12CHF;private Money f14CHF;private Money f14CHF;private Money f28USD;private Money f28USD;protected void setUp() {protected void setUp() {

f12CHF= new Money(12, "CHF");f12CHF= new Money(12, "CHF");f14CHF= new Money(14, "CHF");f14CHF= new Money(14, "CHF");f28USD= new Money(28, "USD");f28USD= new Money(28, "USD");

}}

}}

Page 14: 5. Ingeniería de Pruebas LS4128: Ingeniería del Software II DII – Universidad Nebrija Justo N. Hidalgo Sanz.

Ingeniería de Pruebas - Justo HidIngeniería de Pruebas - Justo Hidalgoalgo

1414

Casos de Prueba (I)Casos de Prueba (I)

1.1. Realización de una prueba concreta Realización de una prueba concreta sobre una o varias clases.sobre una o varias clases.

2.2. Escribir un método Fixture::testXXX()Escribir un método Fixture::testXXX()3.3. Crear una instancia de la clase Crear una instancia de la clase

invocando al constructor que permite invocando al constructor que permite describir el testXXX a ejecutar.describir el testXXX a ejecutar.

4.4. Posteriormente, cada caso se organiza Posteriormente, cada caso se organiza en “suites”.en “suites”.

Page 15: 5. Ingeniería de Pruebas LS4128: Ingeniería del Software II DII – Universidad Nebrija Justo N. Hidalgo Sanz.

Ingeniería de Pruebas - Justo HidIngeniería de Pruebas - Justo Hidalgoalgo

1515

Casos de Prueba (II): Casos de Prueba (II): ejemploejemplo1.1. Implementación del método:Implementación del método:

public void testMoneyMoneyBag() {public void testMoneyMoneyBag() {// [12 CHF] + [14 CHF] + [28 USD] == {[26 CHF][28 USD]}// [12 CHF] + [14 CHF] + [28 USD] == {[26 CHF][28 USD]}

Money bag[]= { f26CHF, f28USD };Money bag[]= { f26CHF, f28USD };

MoneyBag expected= new MoneyBag(bag);MoneyBag expected= new MoneyBag(bag);assertEquals(expected, f12CHF.add(f28USD.add(f14CHF)));assertEquals(expected, f12CHF.add(f28USD.add(f14CHF)));

} }

2.2. Creación de la instancia de prueba:Creación de la instancia de prueba:new MoneyTest("testMoneyMoneyBag");new MoneyTest("testMoneyMoneyBag");

Page 16: 5. Ingeniería de Pruebas LS4128: Ingeniería del Software II DII – Universidad Nebrija Justo N. Hidalgo Sanz.

Ingeniería de Pruebas - Justo HidIngeniería de Pruebas - Justo Hidalgoalgo

1616

Casos de Prueba (III): Casos de Prueba (III): ejemploejemplo

Page 17: 5. Ingeniería de Pruebas LS4128: Ingeniería del Software II DII – Universidad Nebrija Justo N. Hidalgo Sanz.

Ingeniería de Pruebas - Justo HidIngeniería de Pruebas - Justo Hidalgoalgo

1717

Casos de Prueba (y IV): Casos de Prueba (y IV): ejemploejemplo

Page 18: 5. Ingeniería de Pruebas LS4128: Ingeniería del Software II DII – Universidad Nebrija Justo N. Hidalgo Sanz.

Ingeniería de Pruebas - Justo HidIngeniería de Pruebas - Justo Hidalgoalgo

1818

Suites (I)Suites (I)

• Es interesante poder realizar varios Es interesante poder realizar varios casos de prueba juntos.casos de prueba juntos.

• Se utiliza la clase Se utiliza la clase junit.framework.TestSuite.junit.framework.TestSuite.

Page 19: 5. Ingeniería de Pruebas LS4128: Ingeniería del Software II DII – Universidad Nebrija Justo N. Hidalgo Sanz.

Ingeniería de Pruebas - Justo HidIngeniería de Pruebas - Justo Hidalgoalgo

1919

Suites (II). RespuestaSuites (II). Respuesta

• Un caso de prueba devuelve un TestResult:Un caso de prueba devuelve un TestResult:TestResult result= (new MoneyTest("testMoneyMoneyBag")).run();TestResult result= (new MoneyTest("testMoneyMoneyBag")).run();

• Una suite, de la misma manera: Una suite, de la misma manera: TestSuite suite= new TestSuite();TestSuite suite= new TestSuite();suite.addTest(new MoneyTest("testMoneyEquals"));suite.addTest(new MoneyTest("testMoneyEquals"));suite.addTest(new MoneyTest("testSimpleAdd"));suite.addTest(new MoneyTest("testSimpleAdd"));TestResult result= suite.run(); TestResult result= suite.run();

• Otra opción:Otra opción:TestSuite suite= new TestSuite(MoneyTest.class);TestSuite suite= new TestSuite(MoneyTest.class);TestResult result= suite.run(); TestResult result= suite.run();

Page 20: 5. Ingeniería de Pruebas LS4128: Ingeniería del Software II DII – Universidad Nebrija Justo N. Hidalgo Sanz.

Ingeniería de Pruebas - Justo HidIngeniería de Pruebas - Justo Hidalgoalgo

2020

Suites (y III). En general…Suites (y III). En general…

• … … las suites pueden contener las suites pueden contener cualquier objeto que implemente la cualquier objeto que implemente la interfaz junit.framework.Testinterfaz junit.framework.TestTestSuite suite= new TestSuite();TestSuite suite= new TestSuite();

suite.addTest(Justo.suite());suite.addTest(Justo.suite());

suite.addTest(Juan.suite());suite.addTest(Juan.suite());

TestResult result= suite.run(); TestResult result= suite.run();

Page 21: 5. Ingeniería de Pruebas LS4128: Ingeniería del Software II DII – Universidad Nebrija Justo N. Hidalgo Sanz.

Ingeniería de Pruebas - Justo HidIngeniería de Pruebas - Justo Hidalgoalgo

2121

TestRunner (I)TestRunner (I)

• JUnit provee herramientas gráficas para JUnit provee herramientas gráficas para visualizar suites de prueba.visualizar suites de prueba.– Utilizar el método estático “suite()” de una Utilizar el método estático “suite()” de una

forma:forma:public static Test suite() {public static Test suite() {

TestSuite suite= new TestSuite();TestSuite suite= new TestSuite();suite.addTest(new MoneyTest("testMoneyEquals"));suite.addTest(new MoneyTest("testMoneyEquals"));suite.addTest(new MoneyTest("testSimpleAdd"));suite.addTest(new MoneyTest("testSimpleAdd"));return suite;return suite;

}} – … … u otra:u otra:

public static Test suite() {public static Test suite() {return new TestSuite(MoneyTest.class);return new TestSuite(MoneyTest.class);

} }

Page 22: 5. Ingeniería de Pruebas LS4128: Ingeniería del Software II DII – Universidad Nebrija Justo N. Hidalgo Sanz.

Ingeniería de Pruebas - Justo HidIngeniería de Pruebas - Justo Hidalgoalgo

2222

TestRunner (II): ejecuciónTestRunner (II): ejecución

• Classpath: junit.jar y directorio de Classpath: junit.jar y directorio de ejemplosejemplos

• Arranque de aplicación:Arranque de aplicación:– Versión AWT: java Versión AWT: java junit.awtui.TestRunnerjunit.awtui.TestRunner– Versión Swing: java Versión Swing: java junit.swingui.TestRunnerjunit.swingui.TestRunner – Versión Batch: java Versión Batch: java junit.textui.TestRunnerjunit.textui.TestRunner

• junit.textui.TestRunner.run(suite);junit.textui.TestRunner.run(suite);

Page 23: 5. Ingeniería de Pruebas LS4128: Ingeniería del Software II DII – Universidad Nebrija Justo N. Hidalgo Sanz.

Ingeniería de Pruebas - Justo HidIngeniería de Pruebas - Justo Hidalgoalgo

2323

TestRunner (y III): ejecuciónTestRunner (y III): ejecución

Page 24: 5. Ingeniería de Pruebas LS4128: Ingeniería del Software II DII – Universidad Nebrija Justo N. Hidalgo Sanz.

Ingeniería de Pruebas - Justo HidIngeniería de Pruebas - Justo Hidalgoalgo

2424

ResumenResumen

Page 25: 5. Ingeniería de Pruebas LS4128: Ingeniería del Software II DII – Universidad Nebrija Justo N. Hidalgo Sanz.

Ingeniería de Pruebas - Justo HidIngeniería de Pruebas - Justo Hidalgoalgo

2525

ConclusionesConclusiones

• Alta densidad de patronesAlta densidad de patrones– Típico en frameworks madurosTípico en frameworks maduros– Más difícil de cambiarMás difícil de cambiar

• Fácil de usarFácil de usar– Pero muy completo.Pero muy completo.

• Enseña a hacer las cosas bienEnseña a hacer las cosas bien

Page 26: 5. Ingeniería de Pruebas LS4128: Ingeniería del Software II DII – Universidad Nebrija Justo N. Hidalgo Sanz.

Ingeniería de Pruebas - Justo HidIngeniería de Pruebas - Justo Hidalgoalgo

2626

ReferenciasReferencias

• JUnit Cookbook. Beck, K., Gamma, E. JUnit Cookbook. Beck, K., Gamma, E. www.junit.orgwww.junit.org

• JUnit. A Cook’s tour. www.junit.orgJUnit. A Cook’s tour. www.junit.org

• JUnit Test Infected: Programmers JUnit Test Infected: Programmers Love Writing Tests. www.junit.orgLove Writing Tests. www.junit.org

• Design Patterns. Gamma et al. Design Patterns. Gamma et al. Addison-Wesley.Addison-Wesley.