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

Pruebas Automatizadas

on

  • 5,792 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
5,792
Slideshare-icon Views on SlideShare
5,790
Embed Views
2

Actions

Likes
7
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 Pruebas Automatizadas Presentation Transcript

    • AutomateTesting
      Email: snahider@gmail.com
      Blog: http://snahider.blogspot.com
      Twitter: @snahider
      Angel Núñez Salazar
    • 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.
    • Sistema
      Tipos de pruebas según su alcance
      +
      Integración
      Unitarios
      -
      Alcance
    • Unit TestingAutomate Testing
      Email: snahider@gmail.com
      Blog: http://snahider.blogspot.com
      Twitter: @snahider
      Angel Núñez Salazar
    • Pruebas Unitarias
      No pruebes el auto completo si aún no sabes si funcionan los engranes.
    • 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.
    • Nuestro Objetivo
      Probar las unidades lógicas o caminos que existen dentro de una clase.
    • 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.
      • No depende de archivos de configuración.
      • 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
    • 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.
    • 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…..
      • Java: JUnit, TestNG, Easyb, JTiger …..
      • 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)
    • 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
    • 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
    • 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
    • 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
    • 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
    • Ejecutando las pruebas
      • Utilizando la barra de herramientas de pruebas.
      • Hot Keys:
      • Ejecutar las pruebas dentro del contexto actual (Ctrl+R,T)
      • Ejecutar todas las pruebas (Ctrl+R,A)
    • Ejecutando las pruebas
      • Utilizando la barra de herramientas.
      • Menú contextual sobre la clase/package/proyecto y seleccionar "RunAs -> Junit Test".
      • 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.
      • 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.
    • 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.
    • Nuestra segunda Prueba
      Realizar la prueba unitaria que verifique :
      «El Stack no se encuentra vacío si contiene un elemento»
    • Don't repeat yourself
      Para aumentar nuestra productividad utilizaremos un snippet para las pruebas
      • Extensión Manager: Instalar SnippetDesigner
      • Menu: File->New->File
      • Categoría SnippetDesigner: Seleccionar CodeSnippet
    • Don't repeat yourself
      Para aumentar nuestra productividad utilizaremos un snippet para las pruebas
      • Menu: Window->Preferences
      • Categoría Java->Editor->Templates
      • 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.
    • 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.
      • 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
    • Ejemplos Set Up y Tear Down
      Unit Test
      Test Fixtures
    • Ejemplos Set Up y Tear Down
      Unit Test
      Test Fixtures
    • Probando Excepciones
      Forma Tradicional
      Utilizando Atributos
    • Probando Excepciones
      Forma Tradicional
      Utilizando Atributos
      ExceptedException Rule
    • 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.
    • 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.
    • Test DoublesAutomate Testing
      Email: snahider@gmail.com
      Blog: http://snahider.blogspot.com
      Twitter: @snahider
      Angel Núñez Salazar
    • 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.
    • 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"
    • ¿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.
    • Inversión de Dependencias
      Las clases de alto nivel no deben depender directamente de clases de bajo nivel sino de abstracciones de estas clases.
    • Inyección de Dependencias
      Proveer las instancias de las clases dependencia desde fuera del ámbito de la clase.
      Outside
    • EjercicioRefactorizar el código para mejorar su testeabilidad.
      Utilizar inyección e inversión de dependencias para desacoplar el código.
    • ¿ 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.
    • 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.
    • El Mundo Real
      BD
      Other
      Class
      Other
      Class
      Act
      Other
      Class
      Test
      ClassUnder Test
      FileSystem
      Assert
      Other
      Class
      Other
      Class
    • ¿Cuál es el problema?
      Responsabilidades de la clase
      Creación de jerarquía de objetos
      Lógica de Negocios
    • Encontrando la solución
      Responsabilidades de una clase externa
      Responsabilidades de la clase
      Creación de jerarquía de objetos
      Lógica de Negocios
    • Encontrando la solución
      Simple
      Class
      Act
      Simple
      Class
      Test
      ClassUnder Test
      Assert
      Simple
      Class
    • 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
    • IsolationMockingFrameworks
      • Crear test doubles de manera más simple, rápida y sin errores.
      • Evitar escribir código repetitivo.
      • .NET: Moq,RhinoMock, Typemock
      • Java: Mockito, EasyMock, Jmock
      • Ruby: RSpecBuilt-in, Mocha
    • Tipos de Test Doubles
      Stubs
      Mocks
      Dummies
      Fakes
    • Test Doubles: Stubs
    • Test Doubles: Stubs
      • Reemplaza una dependencia existente en el sistema de tal manera que el test no tenga que lidiar directamente con esa dependencia.
      • La prueba tiene el control sobre este test double, por lo que puede indicarle respuestas predefinidas a ciertas llamadas.
      • 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.
    • 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.
    • 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)
    • Test Doubles : Mocks
      • No devuelve resultados predefinidos, sino está pendiente que el objeto en prueba interactúe con el de una manera esperada.
      • El Assert ya no se ejecuta sobre la clase en prueba sino sobre el mock.
      • 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.
    • 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.
    • Explorando el API de Moq
      • Creando un Test Double
      • Stubbing
      • ArgumentMatchers
      • Stubbingcon excepciones
      • Verificar comportamiento
    • Explorando el API de Mockito
      • Creando un Test Double
      • Stubbing
      • ArgumentMatchers
      • Stubbingcon excepciones
      • 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
    • 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.
    • 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
      • Java: Clover, EMMA, Cobertura
      • 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.
      • Valor proporcional a la complejidad ciclomática.
      ¿ Será suficiente pasar una única vez por un camino?
    • 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
    • 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.
    • ¿ Como escribimos código que sea difícil de probar ?
    • «No hay ningún secreto en cómo escribir los tests,solo hay secretos en cómo escribir código testeable.»
      MiskoHevery
    • Como podemos mejorar la testeabilidad
      • Aislar las dependencias e inyectarlas.
      • No realizar trabajo en el constructor.
      • Preferir la composición sobre la herencia.
      • 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.
    • No realizar trabajo en el constructor
      • Señales de que existe este problema:
      • El operador New en el constructor.
      • Cualquier tipo de llamada estática.
      • Cualquier tipo de lógica (condicionales, iteraciones).
      • Necesidad de llamar a un método «init» luego de la construcción del objeto.
      • Tener un constructor para pruebas y otros para producción.
      • 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)
    • CompositionoverInheritance
      • El propósito de la herencia es el polimorfismo y no la reutilización.
      • Si no estamos sobrescribiendo, probablemente estemos abusando de la herencia.
      • 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.
    • Integration TestingAutomate Testing
      Email: snahider@gmail.com
      Blog: http://snahider.blogspot.com
      Twitter: @snahider
      Angel Núñez Salazar
    • Pruebas de Integración
      Se encargan de realizar pruebas a dos o más módulos dependientes de software.
    • ¿ 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)
    • ¿ Porqué pruebas de integración?
      • En algún momento los componentes tendrán que comunicarse entre si y hablar con el mundo exterior.
      • Una buen conjunto de pruebas unitarias es aún más efectivo si es acompañado de otros tipos de test.
      • Cada tipo de test es una nueva capa de protección en nuestro sistema.
      • 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.
      • 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.
    • 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.
    • ¿ Qué probar ?
      Aplicación
      Inside
      • Tablas, Vistas
      • StoreProcedures, Triggers
      • Integridad Referencial, Cascadas
      • Defaults, Constraints, Sizes
      Base Datos
      Outside
      Inside
      • Conectividad
      • Registro de datos
      • Lectura de datos
      • ORM ( Metadata, Mappings)
      Outside
      (Data Access Interface)
    • 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.
    • ¿ 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.
    • 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.
      • Se puede combinar con patrones como: test data builder, objectmother.
      • 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.
      • Las frameworks permiten utilizar funcionalidad más avanzada.
      • Necesita una organización para los archivos (por tabla, por conjunto de pruebas, por prueba).
      • El mantenimiento de la pruebas es más difícil ya que también se tienen que mantener los archivos externos.
      • 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.
      • 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.
      • Poco impacto en el tiempo de ejecución de las pruebas.
      • 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.
      • 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.
    • 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.
    • Notas