• Save
Pruebas Automatizadas
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

Pruebas Automatizadas

on

  • 6,115 views

Preview de los slides para el curso "Automate Testing" ...

Preview de los slides para el curso "Automate Testing"

Los slides completos del curso "Automate Testing" para .NET se encuentran en
http://www.slideshare.net/snahider/automate-testing-net

Statistics

Views

Total Views
6,115
Views on SlideShare
6,113
Embed Views
2

Actions

Likes
8
Downloads
0
Comments
0

2 Embeds 2

http://testingbaires.com 1
http://www.linkedin.com 1

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Pruebas Automatizadas Presentation Transcript

  • 1. AutomateTesting
    Email: snahider@gmail.com
    Blog: http://snahider.blogspot.com
    Twitter: @snahider
    Angel Núñez Salazar
  • 2. Tipos de Test
    Es una nomenclatura caótica y no existe una sola categoría.
    Alcance: Unidades, Componentes, Sistemas
    Etapa: Integración, aceptación, regresión
    Enfoque: Performance, funcionales
    Visibilidad: White / Black box
    El tipo de test se convierte en un atributo.
  • 3. Sistema
    Tipos de pruebas según su alcance
    +
    Integración
    Unitarios
    -
    Alcance
  • 4. Unit TestingAutomate Testing
    Email: snahider@gmail.com
    Blog: http://snahider.blogspot.com
    Twitter: @snahider
    Angel Núñez Salazar
  • 5. Pruebas Unitarias
    No pruebes el auto completo si aún no sabes si funcionan los engranes.
  • 6. Prueba Unitaria (Micro Test)
    Una prueba unitaria es un fragmento automatizado de código, escrito y mantenido por los desarrolladores, que invoca un método o función para verificar ciertas suposiciones sobre el comportamiento de una única clase.
  • 7. Nuestro Objetivo
    Probar las unidades lógicas o caminos que existen dentro de una clase.
  • 8. Independencia (Aislamiento)
    Se realizan de manera separada al resto de la aplicación, de sus dependencias y no acceden a recursos del sistema.
    • No se comunica con la base de datos.
    • 9. No depende de archivos de configuración.
    • 10. No ejercita la clase y todas sus dependencias en simultáneo.
  • Demostración
    Veremos el funcionamiento de las pruebas unitarias dentro de la aplicación open sourceCodeCampServer
  • 11. Beneficios de las pruebas unitarias
    Realizar cambios es mucho más sencillo.
    Nuevas funcionalidades no rompen las existentes.
    El proceso de desarrollo se vuelve más flexible.
    Los problemas se encuentran temprano en el ciclo de desarrollo.
    El diseño mejora debido a que el código es forzado a ser más desacoplado y testeable.
    Código que funciona ahora, funcionará en el futuro.
    La necesidad de pruebas manuales se reduce.
  • 12. UnitTesting Frameworks
    Frameworks que nos proveen todos los mecanismos necesarios para ejecutar la lógica específica a nuestra prueba sin preocuparnos por la infraestructura necesaria.
    • .NET: NUnit, MSTest, XUnit.net, Mbunit…..
    • 13. Java: JUnit, TestNG, Easyb, JTiger …..
    • 14. Ruby: Test::Unit, Rspec, Shoulda …..
  • EjercicioCrear test unitarios para una clase
    Crear los test unitarios para una lista del tipo pila "Stack" (Last In - FirstOut)
  • 15. Organización de un Proyecto
    Mantener las pruebas separadas del código de producción.
    Una clase de prueba por cada clase de producción. (Test Fixture per class)
    Proyecto de Producción
    Proyecto con las pruebas
    Referencia al proyecto de producción
    Test Framework
  • 16. Organización de un Proyecto
    Mantener las pruebas separadas del código de producción.
    Una clase de prueba por cada clase de producción. (Test Fixture per class)
    Directorio de producción
    Directorio con las pruebas
    Test Framework
  • 17. Creando una prueba
    Las pruebas se encuentran dentro de una clase marcada con un atributo
    Las pruebas son métodos marcados con un atributo
    La prueba pasa al menos que el assert falle o se produzca un error
  • 18. Creando una prueba
    Las pruebas se encuentran dentro de una clase.
    Las pruebas son métodos marcados con una anotación.
    La prueba pasa al menos que el assert falle o se produzca un error
  • 19. Asserts
    Métodos a través de los cuales podemos verificar el éxito o fracaso de nuestras pruebas.
    Múltiples sobre escrituras para verificar diversos casos.
    Si la verificación falla, nos devuelven un mensaje con información para poder solucionar el problema.
    Assert.AreEqualfailed. Expected: <2>, Actual:<0>
    Podemos agregar mensajes adicionales para que sean mostrados en caso el test falle.
    Assert.AreEqualfailed. Expected: <2>, Actual: <0>. 1+1 deberíaser 2
  • 20. Ejecutando las pruebas
    • Utilizando la barra de herramientas de pruebas.
    • 21. Hot Keys:
    • 22. Ejecutar las pruebas dentro del contexto actual (Ctrl+R,T)
    • 23. Ejecutar todas las pruebas (Ctrl+R,A)
  • Ejecutando las pruebas
    • Utilizando la barra de herramientas.
    • 24. Menú contextual sobre la clase/package/proyecto y seleccionar "RunAs -> Junit Test".
    • 25. Hot Keys: "Run As JUnit Test" (Alt+Shift+X,T)
  • Nombre de las Pruebas
    Debe tener las siguientes características:
    • Expresar un requerimiento específico.
    • 26. Incluir las entradas/estado inicial y el resultado esperado para dichas entradas.
    [NombreMétodo_EstadoEnPrueba_ComportamientoEsperado]
    Las convenciones nos permiten contar con reglas o plantillas que todo el equipo puede seguir para lograr un rápido entendimiento acerca de las pruebas.
  • 27. Estructura de una prueba
    Creamos todas las precondiciones y entradas necesarias.
    ARRANGE
    Realizamos la acción del objeto que estamos probando.
    ACT
    ASSERT
    Verificamos los resultados esperados.
  • 28. Nuestra segunda Prueba
    Realizar la prueba unitaria que verifique :
    «El Stack no se encuentra vacío si contiene un elemento»
  • 29. Don't repeat yourself
    Para aumentar nuestra productividad utilizaremos un snippet para las pruebas
    • Extensión Manager: Instalar SnippetDesigner
    • 30. Menu: File->New->File
    • 31. Categoría SnippetDesigner: Seleccionar CodeSnippet
  • Don't repeat yourself
    Para aumentar nuestra productividad utilizaremos un snippet para las pruebas
    • Menu: Window->Preferences
    • 32. Categoría Java->Editor->Templates
    • 33. Click en el botón New..
  • EjercicioCompletar las siguientes pruebas
    Al ingresar y sacar un elemento, el stack está vacío.
    Al ingresar dos y sacar uno, el stack no está vacio.
    Al ingresar y sacar un elemento, el elemento debe ser igual al ingresado.
    Al ingresar dos y obtener un elemento, el elemento debe ser igual al segundo ingresado
    Al ingresar dos y obtener dos, el segundo elemento obtenido es igual al primero que se ha ingresado.
  • 34. Set Up y TearDown
    Métodos que nos permiten crear y limpiar datos que son comunes a todas las pruebas.
    Set Up For Unit Test
    Unit Test
    Tear Down For Unit Test
    • Set Up (Constructor de las pruebas): Inicializar datos que son comunes a todos las pruebas.
    • 35. Tear Down (Destructor de las pruebas): Limpiar datos que afecten la ejecución entre prueba y prueba.
  • Set Up y Tear Down en Test Fixtures
    Establecer un estado una única vez al inicio de todos los test y una única vez al finalizar todos.
    Set Up For Test Fixture
    Set Up For Unit Test
    Unit Test
    Tear Down For Unit Test
    Tear Down For Test Fixture
  • 36. Ejemplos Set Up y Tear Down
    Unit Test
    Test Fixtures
  • 37. Ejemplos Set Up y Tear Down
    Unit Test
    Test Fixtures
  • 38. Probando Excepciones
    Forma Tradicional
    Utilizando Atributos
  • 39. Probando Excepciones
    Forma Tradicional
    Utilizando Atributos
    ExceptedException Rule
  • 40. EjercicioProbar una Excepción y utilizar un Set Up
    Crear una prueba para verificar que al obtener un elemento y el stack se encuentre vacío, se lance una excepción.
    Crear un método SetUp para remover el código duplicado de los test.
  • 41. Propiedades de una prueba unitaria
    Fast: Unos cuantos milisegundos en ejecutarse.
    Independent: Enfocarse en una única unidad de código.
    Repeatable: Ejecutarse de manera repetitiva sin intervención.
    Self-validating: Sin necesidad de reexaminar los resultados.
    Transparent: Comunicar claramente lo que se busca probar.
  • 42. Test DoublesAutomate Testing
    Email: snahider@gmail.com
    Blog: http://snahider.blogspot.com
    Twitter: @snahider
    Angel Núñez Salazar
  • 43. Testeabilidad
    La testeabilidad es un atributo de calidad del códigoque permite que las pruebas automatizadas sean realizadas de manera fácil y efectiva.
    La testeabilidad por lo general es señal de un buen diseño.
    Si queremos que un código sea testeable, debemos escribir pensando en la testeabilidad.
    No cualquier código puede ser probado de manera unitaria.
  • 44. EjercicioRevisar las pruebas realizadas a un código "no testeable"
    ¿Cuál es el problema del código de producción?"Es un código muy acoplado"
  • 45. ¿Cuál es el problema?
    Las clases de alto nivel no deben depender directamente de clases de bajo nivel sino de abstracciones de estas clases.
  • 46. Inversión de Dependencias
    Las clases de alto nivel no deben depender directamente de clases de bajo nivel sino de abstracciones de estas clases.
  • 47. Inyección de Dependencias
    Proveer las instancias de las clases dependencia desde fuera del ámbito de la clase.
    Outside
  • 48. EjercicioRefactorizar el código para mejorar su testeabilidad.
    Utilizar inyección e inversión de dependencias para desacoplar el código.
  • 49. ¿ Cuál es el siguiente paso ?
    Ahora que las clases no dependen de una implementación específica, debemos hacer que los test decidan cual es la dependencia a usar y la inyecten a la clase que se está probando.
  • 50. EjercicioModificar los test para realizar pruebas unitaras a clases con dependencias.
    Crear una nueva clase más simple que reemplace a la original solo para los propósitos de las pruebas.
  • 51. El Mundo Real
    BD
    Other
    Class
    Other
    Class
    Act
    Other
    Class
    Test
    ClassUnder Test
    FileSystem
    Assert
    Other
    Class
    Other
    Class
  • 52. ¿Cuál es el problema?
    Responsabilidades de la clase
    Creación de jerarquía de objetos
    Lógica de Negocios
  • 53. Encontrando la solución
    Responsabilidades de una clase externa
    Responsabilidades de la clase
    Creación de jerarquía de objetos
    Lógica de Negocios
  • 54. Encontrando la solución
    Simple
    Class
    Act
    Simple
    Class
    Test
    ClassUnder Test
    Assert
    Simple
    Class
  • 55. Test Doubles
    Test Double
    Test Double
    Son todos aquellos objetos que han sido creados para reemplazar a los objetos reales con el propósito de hacer pruebas
  • 56. IsolationMockingFrameworks
    • Crear test doubles de manera más simple, rápida y sin errores.
    • 57. Evitar escribir código repetitivo.
    • 58. .NET: Moq,RhinoMock, Typemock
    • 59. Java: Mockito, EasyMock, Jmock
    • 60. Ruby: RSpecBuilt-in, Mocha
  • Tipos de Test Doubles
    Stubs
    Mocks
    Dummies
    Fakes
  • 61. Test Doubles: Stubs
  • 62. Test Doubles: Stubs
    • Reemplaza una dependencia existente en el sistema de tal manera que el test no tenga que lidiar directamente con esa dependencia.
    • 63. La prueba tiene el control sobre este test double, por lo que puede indicarle respuestas predefinidas a ciertas llamadas.
    • 64. Son utilizados cuando nuestro método en prueba depende de un valor que es retornado por otro componente.
  • EjercicioUtilizar un stub para realizar pruebas unitarias
    Revisar las pruebas anteriormente creadas e identificar el stub.
    Utilizar una framework para reemplazar el stub creado de forma manual.
  • 65. StateTesting VS InteractionTesting
    StateTesting
    (ResultDriven) Verificamos si un resultado final es el esperado.Ejm: que una propiedad ha cambiado su valor.
    InterationTesting
    (ActionDriven)Verificamos si una determinada acción se ha producido. Ejm: que se ha enviado un mensaje hacia otro objeto.
  • 66. Test Doubles: Mocks
    Nos permiten verificar si un objeto ha enviado o recibido un determinado mensaje de otro objeto. (Si un objeto ha interactuado correctamente con otro objeto)
  • 67. Test Doubles : Mocks
    • No devuelve resultados predefinidos, sino está pendiente que el objeto en prueba interactúe con el de una manera esperada.
    • 68. El Assert ya no se ejecuta sobre la clase en prueba sino sobre el mock.
    • 69. Lo usamos para probar acciones que no pueden ser observadas a través de la API pública de la clase que se está probando.
  • EjercicioUtilizar un mock para realizar pruebas unitarias
    Revisar las pruebas anteriormente creadas e identificar el mock.
    Utilizar una framework para reemplazar el mock creado de forma manual.
  • 70. Como los diferenciamos fácilmente
    Stub: El Test Double que permite que el test pueda terminar su ejecución.
    Mock: El Test Double sobre el cuál se realiza un aserto.
  • 71. Explorando el API de Moq
    • Creando un Test Double
    • 72. Stubbing
    • 73. ArgumentMatchers
    • 74. Stubbingcon excepciones
    • 75. Verificar comportamiento
  • Explorando el API de Mockito
    • Creando un Test Double
    • 76. Stubbing
    • 77. ArgumentMatchers
    • 78. Stubbingcon excepciones
    • 79. Verificar comportamiento
  • Otros Test Doubles
    Dummy
    Objetos que se encuentran instanciados pero nunca se utilizan, usualmente para llenar una lista de parámetros.
    Fake
    Reemplazan al real por razones diferentes a verificar salidas o comportamientos. Tienen la misma funcionalidad pero más sencilla
  • 80. EjercicioRealizar pruebas unitarias a clases con dependencias
    IsEnabled debe retornar verdadero si el nivel del mensaje está antes al nivel del logger.
    IsEnabled debe retornar falso si el nivel del mensaje está después al nivel del logger.
    Writedebe enviar un email al administrador si el nivel es ERROR.
    Write debe escribir en el appender si el logger está habilitado.
  • 81. CodeCoverage
    Medida de calidad del software.
    Valor cuantitativo que indica el número de áreas de nuestra aplicación que han sido ejercitadas por un conjunto de casos de prueba.
    • .NET: NCover, PartCover, Visual Studio
    • 82. Java: Clover, EMMA, Cobertura
    • 83. Ruby: RCov
  • ¿ Tenemos que lograr 100% de Coverage ?
    El coverage no nos dice si hemos cubierto los caminos más riesgosos o si los caminos cubiertos han valido el esfuerzo.
    Lograr un balance costo - beneficio.
    Cuál es el valor adecuado no es una respuesta simple y depende de muchos factores.
    • Usualmente 80% es un buen número.
    • 84. Valor proporcional a la complejidad ciclomática.
    ¿ Será suficiente pasar una única vez por un camino?
  • 85. Costo vs Beneficiode las pruebas unitarias
    Algoritmos
    Código complicado – Necesita refactorizar
    Alto
    Beneficio de la prueba
    ≈ Código no obvio
    Código Trivial
    Coordinadores
    Bajo
    Bajo
    Alto
    Costo de la prueba
    ≈ Número de dependencias
    Steven Sanderson Blog: http://bit.ly/lNGDjq
  • 86. EjercicioMedir el CodeCoverage en una aplicación.
    Medir el codecoverage utilizando las herramientas integradas dentro de los IDES.
    Analizar los resultados e identificar las áreas que no han sido ejercidas por ninguna prueba.
  • 87. ¿ Como escribimos código que sea difícil de probar ?
  • 88. «No hay ningún secreto en cómo escribir los tests,solo hay secretos en cómo escribir código testeable.»
    MiskoHevery
  • 89. Como podemos mejorar la testeabilidad
    • Aislar las dependencias e inyectarlas.
    • 90. No realizar trabajo en el constructor.
    • 91. Preferir la composición sobre la herencia.
    • 92. Evitar métodos y clases estáticas o el patrón singleton.
  • No realizar trabajo en el constructor
    Mientras más trabajo hagamos en el constructor, más difícil será crear el objeto para hacer pruebas con el.
  • 93. No realizar trabajo en el constructor
    • Señales de que existe este problema:
    • 94. El operador New en el constructor.
    • 95. Cualquier tipo de llamada estática.
    • 96. Cualquier tipo de lógica (condicionales, iteraciones).
    • 97. Necesidad de llamar a un método «init» luego de la construcción del objeto.
    • 98. Tener un constructor para pruebas y otros para producción.
    • 99. Si el constructor realiza bastante trabajo, estaremos forzados a realizar todo ese trabajo en los tests.
  • CompositionoverInheritance
    Composition
    Herencia
    La herencia crea una fuerte relación entre la clase padre y las subclases; las subclases deben conocer muchos detalles de implementación de la clase padre. (Alta Dependencia)
  • 100. CompositionoverInheritance
    • El propósito de la herencia es el polimorfismo y no la reutilización.
    • 101. Si no estamos sobrescribiendo, probablemente estemos abusando de la herencia.
    • 102. Elegir la composición por defecto.
  • Evitar Métodos Estáticos
    Los métodos estáticos son código procedural y no Orientado a Objetos.
    Al momento de ejecutar un test unitario, instancio la clase e intercambio sus dependencias reales con testdoubles. El problema con código procedural es que no hay nada que inyectar ya que no existen objetos y por lo tanto los tests no tienen control sobre estos.
  • 103. Integration TestingAutomate Testing
    Email: snahider@gmail.com
    Blog: http://snahider.blogspot.com
    Twitter: @snahider
    Angel Núñez Salazar
  • 104. Pruebas de Integración
    Se encargan de realizar pruebas a dos o más módulos dependientes de software.
  • 105. ¿ Cuando es una prueba de Integración ?
    Cuando involucra una o más clases en simultaneo.
    Cuando el código se comunica fuera de las fronteras de su propio proceso.(base de datos, la red, el sistema de archivos)
  • 106. ¿ Porqué pruebas de integración?
    • En algún momento los componentes tendrán que comunicarse entre si y hablar con el mundo exterior.
    • 107. Una buen conjunto de pruebas unitarias es aún más efectivo si es acompañado de otros tipos de test.
    • 108. Cada tipo de test es una nueva capa de protección en nuestro sistema.
    • 109. El balance y aplicación efectiva de todos los tipos de test es lo que te dará beneficios.
  • Database Testing
    ¿Porqué?
    • Las BDs son parte complementaria de las aplicaciones y almacenan datos que son activos importantes.
    • 110. Las BDs usualmente contienen lógica y realizan funcionalidad crítica para las organizaciones.
    Es esencial contar con un conjunto de pruebas automatizadas que validen la integridad y funcionamiento de la base de datos.
  • 111. Las BDs son un terreno complicado.
    Malas herramientas.
    Los cambios se conservan.
    Actitud de los especialistas en BD.
    Diferencia entre el modelo conceptual de la aplicación y el modelo de la bb.
  • 112. ¿ Qué probar ?
    Aplicación
    Inside
    • Tablas, Vistas
    • 113. StoreProcedures, Triggers
    • 114. Integridad Referencial, Cascadas
    • 115. Defaults, Constraints, Sizes
    Base Datos
    Outside
    Inside
    • Conectividad
    • 116. Registro de datos
    • 117. Lectura de datos
    • 118. ORM ( Metadata, Mappings)
    Outside
    (Data Access Interface)
  • 119. Prerrequisito: Sandboxes
    Un punto importante para tener pruebas repetibles y no erráticas es que cada prueba no se superponga.Esta tarea es más difícil si solo existe una única base de datos y todos ejecutando pruebas contra ella.
    DevelopmentSandbox
    DevelopmentSandbox
    IntegrationSandbox
    Demo/TestSandbox
    ProductionSandbox
    Proveer una base de datos diferente para cada actor o ambiente donde se vaya a ejecutar el conjunto de pruebas.
  • 120. ¿ Cómo probar ?
    La ClaveComenzar cada prueba con la base de datos en un estado conocido.
    Los Pasos
    1.- Inicializar el estado de la base de datos.
    2.- Ejecutar la prueba.
    3.- Restablecer (limpiar) el estado para la siguiente prueba.
  • 121. Inicializar el estado de la BD
    Pruebas Autosuficientes
    Cada prueba manipula los datos de la BD en la forma que ella lo requiera.
    • Usualmente utilizado junto a un ORM.
    • 122. Se puede combinar con patrones como: test data builder, objectmother.
    • 123. Menor impacto en el tiempo de ejecución de las pruebas en comparación a las otras estrategias (cada pruebas inicializa solo lo que necesita)
  • Inicializar el estado de la BD
    Fuente de datos externa
    Mantener archivos externos con datos que serán cargados cuando sea necesario (Archivos planos, XML).
    • Casi siempre con la ayuda de frameworks. Ejm: DBUnit.
    • 124. Las frameworks permiten utilizar funcionalidad más avanzada.
    • 125. Necesita una organización para los archivos (por tabla, por conjunto de pruebas, por prueba).
    • 126. El mantenimiento de la pruebas es más difícil ya que también se tienen que mantener los archivos externos.
    • 127. Mayor impacto en el tiempo de ejecución de la prueba.
  • Restablecer el Estado
    Nuke and Pave
    Antes de cada prueba eliminar todo y volverlo a crear. (datos, tablas, datos + tablas)
    • Fácil de implementar.
    • 128. Gran impacto en el tiempo de ejecución de la prueba. (poco escalable si existen muchas pruebas y datos)
  • Restablecer el Estado
    Transaction - Rollback
    Realizar cada prueba dentro de una transacción y al finalizar su ejecución realizar un rollback para desechar los cambios.
    • Usualmente fácil de implementar.
    • 129. Poco impacto en el tiempo de ejecución de las pruebas.
    • 130. No se puede utilizar en todos los tipos de pruebas donde intervengan una base de datos.(pruebas que inician otros procesos)
  • Usando una BD en Memoria
    Podemos remplazar la base de datos real por una en memoria para los propósitos de las pruebas.
    • La principal razón es que son muy rápidas, tanto en la inicialización de estado, ejecución de la prueba y restauración del estado.
    • 131. Esto es posible si la capa de acceso a datos da la seguridad de funcionar de la misma manera independientemente de la base e datos que se utilice.
  • EjercicioRealizar pruebas de BD utilizando"Fuente de Datos Externa""Nuke and Pave"
    Implementar los enfoques "Fuentes de datos Externa" y "Nuke and Pave" dentro de un conjunto de pruebas utilizando DbUnit.
    Crear una prueba que verifique una búsqueda por filtros.
    Crear una prueba que verifique la creación y eliminación de un objeto.
  • 132. EjercicioRealizar pruebas de BD utilizando"Pruebas Autosuficientes""Transaction - Rollback"
    Implementar los enfoques "Pruebas Autosuficientes" y "TransactionRollback" .
    Analizar que factores adicionales se deben considerar cuando se utiliza un ORM.
  • 133. Notas