test automation .net

140
Test Automati on Angel Núñez Salazar Email: [email protected] Blog: http://snahider.blogspot.com Twitter: @snahider

Upload: angel-nunez-salazar

Post on 11-Jun-2015

6.154 views

Category:

Technology


3 download

DESCRIPTION

Diapositivas del taller "Test Automation .NET" http://www.openedgetech.com/calendario/490-pruebas-automatizadas-net

TRANSCRIPT

Page 1: Test Automation .NET

TestAutomation

Angel Núñez SalazarEmail:

[email protected]: http://snahider.blogspot.com

Twitter: @snahider

Page 2: Test Automation .NET

Licencia de Uso

"Test Automation .NET" is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported Licensehttp://creativecommons.org/licenses/by-nc-sa/3.0/deed.es

Page 3: Test Automation .NET

Manual TestingUna persona toma el rol del usuario final, navega a través

de las pantallas, intenta diversas formas de uso y combinaciones, compara sus resultados con el

comportamiento esperado y registra sus resultados.

• Consumen mucho tiempo a largo plazo.• Requieren una compleja configuración.• No son reusables.• Alto riesgo de pasar por alto pruebas.• No prueban de manera efectiva diversos contextos.• Visibilidad limitada.

Page 4: Test Automation .NET

Automate Testing

Es el uso de tecnología con el objetivo de automatizar y mejorar(no substituir) determinados procesos manuales de

pruebas.

Provee pruebas repetibles y consistentes, reduciendo el costo y tiempo de las pruebas de regresión.

Fundamental en el Desarrollo de Software Ágil.

Page 5: Test Automation .NET

Manual vs Automatizado

• Reducen el costo y tiempo de las pruebas de regresión.

• Cualquier configuración se encuentra automatizada.

• Completamente reusable.• Sin riesgo de pasar por alto

alguna prueba ya existente.• Enfocan diferentes contexto de

manera más efectiva.• Visibilidad Global.

• Consumen mucho tiempo a largo plazo.

• Requieren una compleja configuración.

• No son reusables.• Alto riesgo de pasar por alto

pruebas.• No prueban de manera

efectiva diversos contextos.• Visibilidad limitada.

Manual Automatizado

Page 6: Test Automation .NET

Diferentes Tipos de Tests

Story TestsPrototypes

Unit TestsIntegration Tests

System Tests

Usability TestingExploratory Testing

User Acceptance Tests

Performance TestingSecurity Testing

Business Facing

Technology Facing

Dev

elop

Pro

duct

Critique Product

Manual

Automated Manual

Automated Manual

Automated

Q1

Q2 Q3

Q4

Page 7: Test Automation .NET

Beneficios del 1er Cuadrante

Proporcionan una capa de seguridad para agregar o modificar características de la aplicación de manera segura.

(sin alterar de manera equivocada el comportamiento existente)

• Pruebas de Regresión.• Soporte a Refactoring.• Calidad Interna.• Hacer más en menos tiempo.• Coraje.

Page 8: Test Automation .NET

Beneficios del 1er Cuadrante

Proporcionan una capa de seguridad para agregar o modificar características de la aplicación de manera segura.

(sin alterar de manera equivocada el comportamiento existente)

• Pruebas de Regresión.• Soporte a Refactoring.• Calidad Interna.• Hacer más en menos tiempo.• Coraje.

Page 9: Test Automation .NET

Pruebas del 1er Cuadrante

Integración

UnitariosAlcance

+

-

UISistema

Page 10: Test Automation .NET

DemostraciónVeremos el funcionamiento de las pruebas unitarias

dentro de la aplicación open source CodeCampServer

Page 11: Test Automation .NET

Información Adicional• Manual tests are Important

http://www.satisfice.com/blog/archives/58

• Agile Testing Matrixhttp://www.exampler.com/old-blog/2003/08/21/

Snahider
Organizar mejor esta diapositiva
Page 12: Test Automation .NET

Unit TestingTest Automation

Angel Núñez SalazarEmail: [email protected]

Blog: http://snahider.blogspot.comTwitter: @snahider

Page 13: Test Automation .NET

Analogía del Automóvil

Page 14: Test Automation .NET

Pruebas Unitarias

No pruebes el auto completo si aún no sabes si funcionan los engranes.

Page 15: Test Automation .NET

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.

Prueba Unitaria (Micro Test)

Page 16: Test Automation .NET

Nuestro ObjetivoProbar las unidades lógicas o caminos que

existen dentro de una clase.

Page 17: Test Automation .NET

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.

Page 18: Test Automation .NET

Frameworks que nos proveen todos los mecanismos necesarios para ejecutar la lógica específica a nuestra prueba sin preocuparnos por la infraestructura necesaria.

o .NET: NUnit, MSTest, XUnit.net, Mbunit …..

o Java: JUnit, TestNG, Easyb, JTiger …..

o Ruby: Test::Unit, Rspec, Shoulda …..

xUnit Frameworks

Page 19: Test Automation .NET

EjercicioCrear test unitarios para una clase

Crear los test unitarios para una lista del tipo pila "Stack" (Last In - First Out)

Page 20: Test Automation .NET

I. Mantener las pruebas separadas del código de producción.II. Una clase de prueba por cada clase de producción.

(Test Fixture per class)

Organización de un Proyecto

Test Framework

Proyecto de Producción

Proyecto con las pruebas

Referencia al proyecto de producción

Page 21: Test Automation .NET

Creando una prueba

Las pruebas se encuentran dentro de

una clase marcada con un atributo

La prueba pasa al menos que el

assert falle o se produzca un error

Las pruebas son métodos marcados

con un atributo

Page 22: Test Automation .NET

• Métodos a través de los cuales podemos verificar el éxito o fracaso de nuestras pruebas.

Asserts

• Si la verificación falla, nos devuelven un mensaje con información para poder solucionar el problema.

• Podemos agregar mensajes adicionales para que sean mostrados en caso el test falle.

Assert.AreEqual failed. Expected: <2>, Actual:<0>

Assert.AreEqual failed. Expected: <2>, Actual: <0>. 1+1 debería ser 2

Page 23: Test Automation .NET

Ejecutando las pruebas• Utilizando la barra de herramientas de pruebas.

• Hot Keys:o Ejecutar las pruebas dentro del contexto actual (Ctrl+R,T)o Ejecutar todas las pruebas (Ctrl+R,A)

Page 24: Test Automation .NET

Nombre de las Pruebas

[NombreMétodo_Condición_ComportamientoEsperado]

Debe tener las siguientes características:• Expresar un requerimiento específico.• Incluir las entradas/estado inicial y el resultado

esperado para dichas entradas.

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.

Page 25: Test Automation .NET

Estructura de una pruebaCreamos todas las precondiciones y entradas necesarias.

Realizamos la acción del objeto que estamos probando.

Verificamos los resultados esperados.

ARRANGE

ACT

ASSERT

Page 26: Test Automation .NET

Nuestra segunda PruebaRealizar la prueba unitaria que verifique :

«El Stack no se encuentra vacío si contiene un elemento»

Page 27: Test Automation .NET

Don't repeat yourselfPara aumentar nuestra productividad utilizaremos un

snippet para las pruebas• Extensión Manager: Instalar Snippet Designer• Menu: File->New->File• Categoría Snippet Designer: Seleccionar Code Snippet

Page 28: Test Automation .NET

EjercicioCompletar las siguientes pruebas

1. Al ingresar y sacar un elemento, el stack está vacío.2. Al ingresar dos y sacar uno, el stack no está vacio.3. Al ingresar y sacar un elemento, el elemento debe

ser igual al ingresado.4. Al ingresar dos y obtener un elemento, el

elemento debe ser igual al último ingresado5. Al ingresar dos y obtener dos, el segundo

elemento obtenido es igual al primero que se ha ingresado.

Page 29: Test Automation .NET

Set Up y Tear Down

Tear Down For Unit Test

Unit Test

Set Up For Unit Test

Métodos que nos permiten crear y limpiar datos que son comunes a todas las pruebas.

o Set Up (Constructor de las pruebas): Inicializar datos que son comunes a todos las pruebas.

o Tear Down (Destructor de las pruebas): Limpiar datos que afecten la ejecución entre prueba y prueba.

Page 30: Test Automation .NET

Set Up y Tear Down en Test FixturesEstablecer un estado una única vez al inicio de todos los test

y una única vez al finalizar todos.

Set Up For Test Fixture

Tear Down For Test Fixture

Tear Down For Unit Test

Unit Test

Set Up For Unit Test

Page 31: Test Automation .NET

Ejemplos Set Up y Tear DownUnit Test Test Fixtures

Page 32: Test Automation .NET

Probando ExcepcionesForma Tradicional

Utilizando Atributos

Page 33: Test Automation .NET

EjercicioProbar una Excepción

y utilizar un Set Up1. Crear una prueba para verificar que al obtener un

elemento y el stack se encuentra vacío, se lance una excepción.

2. Crear un método SetUp para remover el código duplicado de los test.

Page 34: Test Automation .NET

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.

Page 35: Test Automation .NET

Información Adicional• Nunit

http://www.nunit.org/

• MSTests vs NUnit http://www.barebonescoder.com/2010/06/mstest-vs-nunit-with-visual-studio-2010-tdd/

• MSTests vs NUnit: Comparación de atributos http://blogs.msdn.com/b/nnaderi/archive/2007/02/01/mstest-vs-nunit-frameworks.aspx

Snahider
Organizar mejor esta diapositiva
Page 36: Test Automation .NET

Test DoublesTest Automation

Angel Núñez SalazarEmail: [email protected]

Blog: http://snahider.blogspot.comTwitter: @snahider

Page 37: Test Automation .NET

• La testeabilidad es un atributo de calidad del código que 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.

Testeabilidad

Page 38: Test Automation .NET

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"

Page 39: Test Automation .NET

Inversión de DependenciasLas clases de alto nivel no deben depender

directamente de clases de bajo nivel sino de abstracciones de estas clases.

Page 40: Test Automation .NET

EjercicioRefactorizar el código para mejorar

su testeabilidad.Aplicar el principio de inversión de dependencias para

desacoplar el código.

Page 41: Test Automation .NET

Inyección de DependenciasProveer las instancias de las clases dependencia

desde fuera del ámbito de la clase.

Outside

Page 42: Test Automation .NET

EjercicioRefactorizar el código para mejorar

su testeabilidad.Utilizar inyección de dependencias para desacoplar el

código.

Page 43: Test Automation .NET

¿ Cuál es el siguiente paso ?

Ahora que la clases no depende de una implementación específica, los tests pueden decidir cualquier implementación e inyectarla a la clase que

están probando.

Page 44: Test Automation .NET

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.

Page 45: Test Automation .NET

El Mundo Real

Test Class Under Test

OtherClass

OtherClass

OtherClass

BD

FileSystem

OtherClass

OtherClass

Act

Assert

Page 46: Test Automation .NET

¿Cuál es el problema?

Creación de

jerarquía de objetos

Lógica de

Negocios

Responsabilidades de la clase

Page 47: Test Automation .NET

Encontrando la solución

Creación de

jerarquía de objetos

Lógica de

Negocios

Responsabilidades de la clase

Responsabilidades de una clase externa

Page 48: Test Automation .NET

Encontrando la solución

Test Class Under Test

SimpleClass

SimpleClass

SimpleClass

Act

Assert

Page 49: Test Automation .NET

Test Doubles

Son todos aquellos objetos que han sido creados para reemplazar a los objetos reales con el propósito de

hacer pruebas

Test Double

Test Double

Snahider
Poner una definición más clara
Page 50: Test Automation .NET

Isolation Mocking Frameworks• Crear test doubles de manera más simple,

rápida y sin errores.

• Evitar escribir código repetitivo.

o .NET: Moq, RhinoMock, Typemock o Java: Mockito, EasyMock, Jmocko Ruby: RSpec Built-in, Mocha

Page 51: Test Automation .NET

Tipos de Test Doubles

StubsMocks

DummiesFakes

Page 52: Test Automation .NET

Test Doubles: Stubs

Page 53: Test Automation .NET

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.

Page 54: Test Automation .NET

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.

Page 55: Test Automation .NET

State Testing VS Interaction Testing

State Testing (Result Driven) Verificamos si un resultado final es el esperado.Ejm: que una propiedad ha cambiado su valor.

Interation Testing (Action Driven)Verificamos si una determinada acción se ha producido. Ejm: que se ha enviado un mensaje hacia otro objeto.

Page 56: Test Automation .NET

Test Doubles: MocksNos permiten verificar si un objeto ha enviado o

recibido un determinado mensaje de otro objeto. (Si un objeto ha interactuado correctamente con

otro objeto)

Page 57: Test Automation .NET

Test Doubles : Mocks• No devuelve resultados predefinidos, sino está

pendiente que 2 objetos hayan interactuado de 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.

Page 58: Test Automation .NET

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.

Page 59: Test Automation .NET

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.

Page 60: Test Automation .NET

Explorando el API de Moq

o Stubbing

o Verificar comportamiento

o Argument Matchers

o Stubbing con excepciones

o Creando un Test Double

Page 61: Test Automation .NET

Otros Test Doubles

DummyObjetos que se encuentran instanciados pero nunca se utilizan, usualmente para

llenar una lista de parámetros.

FakeRemplazan a la dependencia real por razones diferentes a verificar salidas o comportamientos. Tienen la misma

funcionalidad pero más sencilla

Page 62: Test Automation .NET

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.• Write debe enviar un email al administrador si el

nivel es ERROR.• Write debe escribir en el appender si el logger está

habilitado.

Page 63: Test Automation .NET

Code Coverage

Valor cuantitativo que indica que cantidad del código ha sido ejercitada por un conjunto de casos de

prueba.

o .NET: NCover, Visual Studio, NCrunch, OpenCovero Java: Clover, EMMA, Coberturao Ruby: RCov

Métrica de calidad del software.

Page 64: Test Automation .NET

EjercicioMedir el Code Coverage en una

aplicación.• Medir el code coverage utilizando las herramientas

integradas dentro de los IDES.• Analizar los resultados e identificar las áreas que no

han sido ejercidas por ninguna prueba.

Page 65: Test Automation .NET

¿ 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.

El valor adecuado depende de cada aplicación.– 60% es un valor aceptable.– Valor proporcional a la complejidad ciclomática.

Lograr un balance costo - beneficio.

¿ Será suficiente pasar una única vez por un camino?

Page 66: Test Automation .NET

Costo vs Beneficiode las pruebas unitarias

Algoritmos Código complicado – Necesita refactorizar

Código Trivial Coordinadores

Bajo Alto

Bajo

Alto

Costo de la prueba≈ Número de dependencias

Beneficio de la prueba≈ Código no obvio

Steven Sanderson Blog: http://bit.ly/lNGDjq

Page 67: Test Automation .NET

Stage Team without tests Team with testsImplementation (Coding) 7 days 14 days

Integration 7 days 2 days

Testing and bug fixing Testing, 3 days Fixing, 3 days Testing, 3 days Fixing, 2 days Testing, 1 dayTotal: 12 days

Testing, 3 days Fixing, 1 dayTesting, 1 dayFixing, 1 dayTesting, 1 dayTotal: 8 days

Total Release Time 26 days 24 days

Bugs found in production 71 11

Unit testing puede duplicar el tiempo que toma programar alguna funcionalidad pero el tiempo total de desarrollo del

producto se ve reducido.

¿ Cuanto tiempo más me cuesta utilizar pruebas unitarias ?

Page 68: Test Automation .NET

……. pero no ha sido:

• Estructurado• Consistente• Repetible• Fácil• En todo el código

Todos ya lo venimos haciendo

Page 69: Test Automation .NET

EjercicioPresentando Unit Testing

a tu equipoCuando uno empieza a introducir Unit Testing a su equipo debe estar preparado para responder toda clase de preguntas.

• Cada uno debe pensar en alguna pregunta o algún argumento en contra que le podrían hacer . Ejm:– ¿ Las personas de QA ya no son necesarias ?

• Compartirlo y discutirlo con el resto del grupo.

Page 70: Test Automation .NET

• 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.

Beneficios de las pruebas unitarias

Page 71: Test Automation .NET

Información Adicional• Moq: http://code.google.com/p/moq/

• Ncrunch: http://www.ncrunch.net/

• Mock Static File Class:http://stackoverflow.com/questions/6499871/mock-file-io-static-class-in-c-sharp

Snahider
Organizar mejor esta diapositiva
Page 72: Test Automation .NET

Integration Testing

Test AutomationAngel Núñez Salazar

Email: [email protected]

Blog: http://snahider.blogspot.comTwitter: @snahider

Page 73: Test Automation .NET

Pruebas de Integración

Se encargan de realizar pruebas a dos o más módulos dependientes de software.

Page 74: Test Automation .NET

¿ Cuando es una prueba de Integración ?

I. Cuando involucra dos o más clases en simultaneo.

II. Cuando el código se comunica fuera de las fronteras de su propio proceso.(base de datos, la red, el sistema de archivos)

Page 75: Test Automation .NET

¿ Qué cosas cubren las pruebas de interacción ?

Interacción y Funcionamiento de BDsLectura y creación de documentos (txt, xml,pdf)

Interacción con Web ServicesResolución e inyección de dependencias

Page 76: Test Automation .NET

Database Testing

• 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.

¿Porqué?

Page 77: Test Automation .NET

Las BDs son un terreno complicado.

Malas herramientas.Setups complejos.

Los cambios se conservan.Actitud de los especialistas en BD.

Page 78: Test Automation .NET

Prerrequisito: Sandboxes

Proveer una base de datos diferente para cada actor o ambiente donde se vaya a ejecutar el conjunto de pruebas.

DevelopmentSandbox

DevelopmentSandbox

IntegrationSandbox

Demo/TestSandbox

ProductionSandbox

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.

Page 79: Test Automation .NET

¿ Qué probar ?

Aplicación

Base Datos

Inside

Outside(Data Access Interface)

Page 80: Test Automation .NET

"From Outside" DB Testing

Aplicación

Base Datos

Outside(Data Access Interface)

• Conectividad• SQL Embebido• ORM: Queries, Mappings• Black Box Testing:

o Store Procedureso Tablas, Constraintso Cascades

¿ Que Probar?

Page 81: Test Automation .NET

Estructura de una prueba de BD

Comenzar cada prueba con la base de datos en un estado conocido.

Arrange (Inicializar el estado de la BD)

Act (Ejecutar la prueba)

Teardown (Restablecer el estado de la BD)

Assert (Verificar resultado)

Page 82: Test Automation .NET

Inicializar el estadode la BD

External Data SourceSelf-Contained Test Transaction - Rollback

Restablecer el estadode la BD

Patrones para realizar pruebas de Base de Datos

Nuke and Pave

Page 83: Test Automation .NET

Inicializar el estadode la BD

External Data SourceSelf-Contained Test

Patrones para realizar pruebas de Base de Datos

Page 84: Test Automation .NET

Inicializar el estado de la BDExternal Data Source

Mantener archivos externos con datos que serán cargados cuando sea necesario (Archivos planos, XML, etc).

PROSo Reutilizar un misma fuente de datos en diferentes

pruebas.

CONSo El mantenimiento de la pruebas es más difícil ya que

también se tienen que mantener los archivos externos.

Page 85: Test Automation .NET

Inicializar el estado de la BDExternal Data Source

• Se necesita una organización para los data sources:o Data Source x Data Access Object.o Data Source x Feature (System Testing).o Data Source x Jouney (System Testing).

• Herramientas:o NDbUnit: archivos XML.

Page 86: Test Automation .NET

Inicializar el estado de la BDSelf-Contained Tests

Cada prueba, por si misma y de manera interna, inicializa la BD en un estado conocido.

PROSo Menor impacto en el tiempo de ejecución de las

pruebas en comparación a las otras estrategias

CONSo Un poco difícil de utilizar sin un ORM.

Page 87: Test Automation .NET

Transaction - Rollback

Restablecer el estadode la BD

Patrones para realizar pruebas de Base de Datos

Page 88: Test Automation .NET

Restablecer el estado de la BDTransaction - Rollback

PROSo Usualmente fácil de implementar.o Poco impacto en el tiempo de ejecución de las pruebas.

CONSo No siempre se puede utilizar.

Ejm: Web Testing ( El test inicializa un proceso diferente que se ejecuta en el navegador, por lo tanto el rollback de la prueba no afecta a lo alterado por el navegador)

Realizar cada prueba dentro de una transacción y al finalizar su ejecución realizar un rollback para desechar los cambios.

Page 89: Test Automation .NET

Inicializar y Restablecerel estado de la BD

Nuke and Pave

Patrones para realizar pruebas de Base de Datos

Page 90: Test Automation .NET

Inicializar y Restablecer la BDNuke and Pave

PROSo Fácil de implementar.

CONSo Gran impacto en el tiempo de ejecución de la prueba.

(poco escalable si existen muchas pruebas y datos)

Antes de cada prueba eliminar todo y volverlo a crear. (tablas + datos, solo datos)

Page 91: Test Automation .NET

Inicializar y Restablecer la BDNuke and Pave

• Herramientas:o NDBUnit: Permite eliminar todos los datos de las tablas

antes de realizar las inserciones.

o EF Initializers: Permite recrear toda la BD (tablas y datos) antes de realizar las inserciones.

o Los ORMs ofrecen la funcionalidad de generar toda la BD (tabas y datos) a partir del modelo de las clases.

o SQL Server Snapshots / Oracle Flashback

Page 92: Test Automation .NET

Ejercicio"Raw" ADO.NET Testing

utilizando"External Data Source"

"Nuke and Pave"

Page 93: Test Automation .NET

EjercicioEntity Framework Testing

utilizando"Nuke and Pave"

"Transaction - Rollback"

Page 94: Test Automation .NET

EjercicioEntity Framework Testing

utilizando"Selft-Contained Tests""Transaction - Rollback"

Page 95: Test Automation .NET

Usando una BD en Memoria

o 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.

o 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. Ejm: ORM

Podemos remplazar la base de datos real por una en memoria para los propósitos de las pruebas.

Page 96: Test Automation .NET

"From Inside" DB Testing (Unit Testing)

Aplicación

Base Datos

¿ Que Probar?

Inside

• Tablas, Vistas• Integridad Referencial, Cascadas• Defaults, Constraints, Sizes• Store Procedures, Triggers

Snahider
Indicar que son pruebas unitarias de BD. Cambiar el "¿Que probar por otra cosa? Talvez cambiar el nombre de "Inside y Outside"
Page 97: Test Automation .NET

Tienen todas las características de las xUnit Frameworks tradicionales. Nos permiten escribir pruebas utilizando lenguaje SQL en forma de Store Procedures.

o SQL Server: tSQLt, TSQLUnit …..o Oracle: utPLSQL, PLUTO …..

xUnit DB Frameworks

Page 98: Test Automation .NET

EjercicioUtilizar

"tSQLt xUnit DB Framework" para crear pruebas unitarias a

"SQL Server (T-SQL) Store Procedures"

Page 99: Test Automation .NET

Visual Studio Database Projects

PROSo Development, Testing, Build and Source Control,

Code Analysis, Deployment ……o Entorno integrado dentro del Visual Studio.

CONSo Solo soporta SQL Server.o Varias características (incluyendo Unit Testing) solo

disponibles en las versiones Premium y Ultimate.

Nos permite gestionar el ciclo de vida de la BD e integrarlo con el resto de la aplicación.

Page 100: Test Automation .NET

Testing utilizando VS DB ProjectsEntorno mixto a través del cual creamos pruebas utilizando

SQL pero las ejecutamos a través de MSTests.

Page 101: Test Automation .NET

EjercicioUtilizar

"Visual Studio DB Projects" para crear pruebas unitarias a

"SQL Server (T-SQL) Store Procedures"

Snahider
Opcional
Page 102: Test Automation .NET

Outside DB vs Inside DB• Son más difíciles de escribir y mantener que las pruebas de

caja negra (Outside DB Testing).

En la mayoría de casos es mejor probar el funcionamiento interno de la BD a través de pruebas de caja negra,

• Aplicaciones compuestas principalmente por procedimientos de BD: Batchs, ETL, etc.

• Alternativa a considerar cuando se tienen módulos cuyas pruebas necesitan ser automatizadas, pero gran parte del de la aplicación se encuentra en la BD (Aplicaciones Legacy).

Snahider
Organizar mejor esta diapositiva
Page 103: Test Automation .NET

¿ 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.

Page 104: Test Automation .NET

Información Adicional• tSQt Website: http://tsqlt.org/

• Visual Studio DB Guide:http://vsdatabaseguide.codeplex.com/

• Unit Testing with Oracle SQL Developerhttp://docs.oracle.com/cd/E15846_01/doc.21/e15222/unit_testing.htm

Snahider
Organizar mejor esta diapositiva
Page 105: Test Automation .NET

SystemTesting

Test AutomationAngel Núñez Salazar

Email: [email protected]: http://snahider.blogspot.com

Twitter: @snahider

Page 106: Test Automation .NET

Pruebas de Sistema

¿Funciona el sistema en conjunto?

Page 107: Test Automation .NET

Son pruebas end-to-end que cubren múltiples dependencias e interacciones

para satisfacer los escenarios bajo prueba.

Pruebas de Sistema

Page 108: Test Automation .NET

¿ Qué pruebas de sistema podemos realizar?

Pruebas de Interfaz GráficaPruebas de Aceptación

Smoke TestsPruebas Manuales

Page 109: Test Automation .NET

Problemas de las Pruebas de Interfaz Web

Frágiles: Debido a que cubran muchas cosas hasta un pequeño cambio en la interfaz de usuario podría romper muchas pruebas.

Costosos de Escribir: Escribir una buena prueba de interfaz de usuario que sea útil y mantenible requiere tiempo. Las herramientas de captura usualmente crean pruebas frágiles.

Muy Lentas: Toman un tiempo considerable en ejecutarse. En conjuntos de pruebas grandes, este tiempo se acumula y puede impedir ejecutar las pruebas de manera continua e incluso diaria.

Page 110: Test Automation .NET

Record and Playback

Scripting

Enfoques para realizar UI Testing

Page 111: Test Automation .NET

Record and Playback

• Se realiza a través de plugins en el navegador.

• Es uno de los enfoques más populares en las herramientas comerciales (Muy Caras).

• Muy atractivo inicialmente, especialmente para las personas sin muchas habilidades de programación, debido a su aparente simplicidad.

Grabar las acciones que realiza un usuario en el navegador u otra UI, para repetirlas en forma de tests.

Page 112: Test Automation .NET

Ventajas y DesventajasPROSo Fácil de empezar. o No necesita habilidades de programación.

CONSo Muy frágil: Pequeños cambios en la UI ocasionan que las

pruebas fallen.o Poco mantenible: Generan código poco modular, poco

entendible y no reutilizable.

Poco adecuado para automatización a gran escala.

Page 113: Test Automation .NET

Scripting

• Utilizar una xUnit Framework para la creación de las pruebas y una framework de automatización de UI para la ejecución de acciones en la pantalla.

• Toma más tiempo comenzar pero nos permite organizar las pruebas de la manera más conveniente.

Programar manualmente cada prueba utilizando alguna framework de automatización de UI.

Page 114: Test Automation .NET

Ventajas y DesventajasPROSo Más mantenible: Cambios requieren modificar los tests

en pequeñas áreas.o Reutilización a largo plazo: nuevas pruebas se crean más

rápido.

CONSo Toma más tiempo de manera inicial.o Requiere habilidades de programación.o Requiere construir un API.

Page 115: Test Automation .NET

¿Cuál es más apropiada?Record and Playback• Reproducción de bugs: Comunicar errores

encontrados a través de scripts que permitan reproducirlos.

• Exploratory Testing: Scripts que ayuden en la realización de Testing Exploratorio.

Scripting• Crear una suite de pruebas robusta y mantenible.• Escalar y distribuir las pruebas alrededor de

múltiples ambientes.

Page 116: Test Automation .NET

Page Object PatternRepresentar cada pantalla de la aplicación dentro de su

propia clase.

• Consolidar todo el código para interactuar con un elemento de la pantalla en un único lugar.

• Exponer métodos que reflejen las acciones que un usuario puede realizar en la página.

• Esconder los detalles de como se automatiza el navegador.

Page 117: Test Automation .NET

Page Object - EjemploDe la manera antigua

Page 118: Test Automation .NET

Page Object - EjemploUtilizando Page Object

Page 119: Test Automation .NET

Beneficios• Mejora la mantenibilidad: Si algún elemento de la

página es modificado, solo se tiene que corregir en un único lugar.

• Mejora la legibilidad: Permite representar las pruebas en términos del usuario final.

• Aumenta la reusabilidad.

• Permite escribir tests más rápido.

• Encapsula los detalles de la framework.

Page 120: Test Automation .NET

Selenium 2

Visual Studio Code UI

Telerik Test Studio

Herramientas para Web Testing

Page 121: Test Automation .NET

Selenium 2Conjunto de herramientas para la automatización de pruebas

utilizando los navegadores web.

• Soporta múltiples browser, SO, lenguajes de programación y xUnit Frameworks.

• Posiblemente la solución más ampliamente utilizada.

• Open-Source y gratuita.

Page 122: Test Automation .NET

Selenium IDEEs un plugin para Firefox que nos permite grabar y ejecutar

acciones dentro del navegador.

Page 123: Test Automation .NET

Selenium Web Driver

• Realiza llamadas directas al navegador utilizando el soporte nativo de cada navegador para la automatización.

• Soporte para varios navegadores incluyendo "Movile Browsers".

• Soporte para varios lenguajes de programación: C#, Java, PHP, Python, Ruby y otros.

API simple y orientada a objetos que nos permite comunicarnos con el navegador.

Page 124: Test Automation .NET

Otros ComponentesSelenium GridEjecutar test de manera paralela en red distribuida de computadores o máquinas virtuales.

Selenium Server: Ejecutar tests en máquinas remotas.• Navegadores que no se encuentran instalados o

soportados por la máquina local (IE en Linux).• Utilizar drivers especiales:

o Mobile drivers: Android, IPhone.o HtmlUnit driver (Headless Browser): Reduce

considerablemente el tiempo de ejecución.

Page 125: Test Automation .NET

EjercicioUtilizar

"Selenium Webdriver" para crear pruebas de sistema a un

aplicación de ECommerce

Snahider
Opcional
Page 126: Test Automation .NET

Unit vs Integration vs System

Fácil de escribirRapido al ejecutar

Difícil de escribirLento al ejecutar

Frágiles de romper

Integración

Unitarios

UISistema

Page 127: Test Automation .NET

Información Adicional• Selenium Downloads:

http://seleniumhq.org/download/

• XPath Documentation:http://www.w3schools.com/xpath/default.asp

Snahider
Organizar mejor esta diapositiva
Page 128: Test Automation .NET

Design forTesteabilityTest Automation

Angel Núñez SalazarEmail: [email protected]

Blog: http://snahider.blogspot.comTwitter: @snahider

Page 129: Test Automation .NET

¿ Como escribimos código que sea fácil de probar ?

Page 130: Test Automation .NET

«No hay ningún secreto en cómo escribir los tests,

solo hay secretos en cómo escribir código testeable.»

Misko Hevery

Page 131: Test Automation .NET

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.

Page 132: Test Automation .NET

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.

Page 133: Test Automation .NET

Señales El operador New en el constructor. Cualquier tipo de lógica (condicionales, iteraciones). Construir un grafo complejo de objetos en el constructor. Cualquier cosa adicional a solo asignar parámetros.

Problemas Nos fuerza a realizar trabajo y utilizar dependencias

innecesarias en los tests.

Solución• Pasar los objetos directamente.• Utilizar un objeto "Factory" o "Builder".

No realizar trabajo en el constructor

Page 134: Test Automation .NET

Digging into the Collaborators

No obtener el objeto en interés navegando a través del todo el grafo de objetos.

Cada objeto por el cuál naveguemos será un objeto adicional que debemos instanciar en el setup del tests.

Snahider
Crear un ejemplo de código
Page 135: Test Automation .NET

Señales Parámetros que no son usados directamente, solo son

usados para acceder a otro objeto. Más de un "." en las llamadas de métodos.

Ejm: GetUserManager.GetUser(1).Profile().IsAdmin. Violación a "Law of Demeter".

Problemas Fixture Setup complejo: Tener que instanciar más objetos de

los que son realmente necesarios. Tener que crear mocks que retornen otros mocks.

Solución• Ingresar directamente como parámetro el objeto en interés.

Digging into the Collaborators

Page 136: Test Automation .NET

Evitar Campos y Métodos Estáticos

Al momento de ejecutar un test unitario, instancio la clase y remplazo las dependencias reales con testdoubles.

El problema con código procedural es que no hay nada que podamos remplazar ya que no existe el objeto como tal.

Los métodos estáticos son código procedural y no Orientado a Objetos.

Page 137: Test Automation .NET

Señales Singletons, campos o métodos estáticos.

Problemas Introduce cierto acoplamiento que no permite remplazar e

intercambiar objetos para las pruebas. Los campos singleton mantienen su estado (Global State)

por lo tanto se necesita restablecer ese estado en cada tests. Evita ejecutar tests en paralelo.

Solución• Remplazar los singletons por instancias de objetos.• Delegar el manejo de la vida del objeto al IOC Container.• Encapsular el singleton por un "Wrapper" (Librerías Externas)

No realizar trabajo en el constructor

Page 138: Test Automation .NET

Composition over InheritanceComposiciónHerencia

La herencia crea un fuerte acoplamiento entre la clase padre y las clases hijas.

En ejecución no se puede elegir una herencia diferente, pero si se puede elegir una composición diferente

Snahider
Cambiar el ejemplo de código
Page 139: Test Automation .NET

Señales Herencia como una forma fácil de reutilizar

comportamiento.

Problemas Introduce acoplamiento que no permite remplazar objetos

de la jerarquía de la herencia.

Solución• El propósito de la herencia es el polimorfismo y no la

reutilización. Sino se está tomando ventaja del polimorfismo usar composición.

Composition over Inheritance

Page 140: Test Automation .NET

Información Adicional• Guide Writing Testeable Code:

http://misko.hevery.com/attachments/Guide-Writing%20Testable%20Code.pdf

Snahider
Organizar mejor esta diapositiva