Probando aplicaciones AngularJS

67
Testing Angular Apps Por Rodrigo Pimentel

Transcript of Probando aplicaciones AngularJS

Page 1: Probando aplicaciones AngularJS

Testing Angular AppsPor Rodrigo Pimentel

Page 2: Probando aplicaciones AngularJS

Sobre mi

GitHub: github.com/rodrigopivi Twitter: @amaru_rod LinkedIn: https://pe.linkedin.com/pub/rodrigo-pimentel/b7/430/550

Page 3: Probando aplicaciones AngularJS

Ustedes y el panorama

Page 4: Probando aplicaciones AngularJS
Page 5: Probando aplicaciones AngularJS

Test driven development (TDD)

• Escribir las pruebas primero

• Hacer que las pruebas pasen

• Re-factorizar

Page 6: Probando aplicaciones AngularJS
Page 7: Probando aplicaciones AngularJS
Page 8: Probando aplicaciones AngularJS

• Entender el requisito es FUNDAMENTAL

• Escribir la prueba y comprobar que falla - Traducir el requisito - Imagina nombres de funciones y modelos que necesitas y escribe la prueba como si existieran- Declarar los métodos previamente imaginados sin código - Verificar que la prueba falla

Page 9: Probando aplicaciones AngularJS

• Hacer que la prueba pase - Escribir el código de producción - Mantener simplicidad- Modular es mejor- El test pasa, el requisito se cumple

• Refactorizar- Don’t Repeat Yourself (DRY) - Buscar reusabilidad - Correr todos los tests

Page 10: Probando aplicaciones AngularJS

1

2

Page 11: Probando aplicaciones AngularJS

Behavior Driven Development (BDD)

• Es una rama del TDD, que se centra en escribir especificaciones conductivas

• Proporciona herramientas verbales para definir los requerimientos y expectativas

• Facilita la comunicación entre Product Owners y Developers

• Detalles del comportamiento y flujo funcional, no detalles de la UI y sus componentes

Page 12: Probando aplicaciones AngularJS
Page 13: Probando aplicaciones AngularJS

Ejemplo de BDD

Cucumber

Jasmine también es BDD

Page 14: Probando aplicaciones AngularJS

Unit Tests

• Una prueba unitaria es una forma de comprobar el correcto funcionamiento de un módulo de código

• Sirve para asegurar que cada uno de los módulos funcione correctamente por separado

Page 15: Probando aplicaciones AngularJS

En que consiste escribir tests unitarios?

• MODULARIZAR!

• Probar bloques de funcionalidad isolada

• Escribir código que sea predecible y fácil de mantener

• Pensar en el código y los datos que necesita

• Predecir la salida de datos en base a la entrada

Page 16: Probando aplicaciones AngularJS

Ejemplo de Unit test en Jasmine

Page 17: Probando aplicaciones AngularJS
Page 18: Probando aplicaciones AngularJS

Como debuggear Unit Tests con Karma

• En produccion, se usa Protractor para correr tests, pero no para debutar

• Es necesario instalar un Chrome/Firefox launcher

• Para debuggear, se usa manualmente el comando> karma start —browsers Chrome

Page 19: Probando aplicaciones AngularJS

Las limitaciones de Unit Tests

Page 20: Probando aplicaciones AngularJS

End to end tests (E2E)

• Verificar que los componentes integrados de la aplicación funcionan como es esperado

• Se prueba a la aplicación entera en un escenario real

• Puede incluir escenarios que incluyen la comunicación con la base de datos, red, hardware y otras aplicaciones

Page 21: Probando aplicaciones AngularJS
Page 22: Probando aplicaciones AngularJS

En que consiste escribir tests E2E?

• Probar la aplicación en un escenario real

• Comprobar la integración correcta de los componentes

• Predecir el "Flujo" desde el comienzo hasta el final

• Simular la interacción del usuario final

• Cada "test case" a un bloque necesita: - Establecer el “estado" (flujo de pasos previos) - Declarar el flujo de pasos a probar- Declarar el estado final esperado

Page 23: Probando aplicaciones AngularJS

E2E Testing con Jasmine & Angular

Page 24: Probando aplicaciones AngularJS

El examen practico

Page 25: Probando aplicaciones AngularJS

http://plnkr.co/edit/prwChY

Practica:

Page 26: Probando aplicaciones AngularJS

Clase 2

Page 27: Probando aplicaciones AngularJS

- En que se diferencia Unit testing de E2E testing?

- Cual es la diferencia entre BDD y TDD?

- Que tests se escriben primero, empezando un proyecto?

- Quien se debe encargar de escribir unit tests y quien se debe encargar de escribir BDD tests?

Repaso

Page 28: Probando aplicaciones AngularJS

Overview de las herramientasAUTOMATIZACION FTW!

Page 29: Probando aplicaciones AngularJS

Gulp

• Automatizar el proceso de build

• Hilos o sorbetes, para conectar nuestro proceso de build

• Puedes conectar hilos con hilos

Page 30: Probando aplicaciones AngularJS
Page 31: Probando aplicaciones AngularJS
Page 32: Probando aplicaciones AngularJS

Karma

• Es un JS Test runner, no un testing framework

• Corre en NodeJS

• Necesita una configuración para establecer el entorno donde ejecutar los tests

• Compatible con browsers

Page 33: Probando aplicaciones AngularJS

Que necesitamos de un test runner?

• Debe ser veloz

• Debe poder usar browsers reales

• Debe ser confiable

• Se debe poder integrar con otras herramientas

Page 34: Probando aplicaciones AngularJS

Protractor• Herramienta para E2E testing

• Necesita una la aplicación corriendo en un servidor (puede ser nuestro dev server)

• Necesita un servidor webdriver corriendo (para controlar el browser)

• Ejecutar nuestros Jasmine tests

Page 35: Probando aplicaciones AngularJS

Phantom JS

• Simula un browser

• Veloz

• Es una aplicación NodeJs

• Util para Unit testing, limitado para E2E

Page 36: Probando aplicaciones AngularJS

Demo y Code Review

Page 37: Probando aplicaciones AngularJS

Clase 3

Page 38: Probando aplicaciones AngularJS

Repaso• Que herramientas se utiliza para automatizar el

build?

• Para que sirve Karma?

• En que se diferencia Protractor de PhantomJS?

• Como hacer “break point” en un test usando Karma?

Page 39: Probando aplicaciones AngularJS

Código Spaghetti

Page 40: Probando aplicaciones AngularJS

Component Based Development (CBD)

“Component based development, is a branch of software engineering that emphasizes the

separation of concerns in respect of the wide-ranging functionality available. It is a reuse-based approach to defining, implementing and composing independent components”

Page 41: Probando aplicaciones AngularJS

Desarrollo basado en componentes

• Es el futuro (React, WebComponents, Polymer, Angular 2)

• Fácil de mantener

• Amigables con metodologias de testing

• DRY

Page 42: Probando aplicaciones AngularJS

Componentes

• Reusables

• Independientes

• Documentados

• Ejemplos de uso

• Extensibles

Page 43: Probando aplicaciones AngularJS

Angular y Jasmine

Page 44: Probando aplicaciones AngularJS

Herramientas Angular• Directivas

• Servicios

• Fabricas

• Controladores

• Filtros

• Constantes

• Templates

Page 45: Probando aplicaciones AngularJS

Angular digest cycle

Page 46: Probando aplicaciones AngularJS

$scope• Es un objeto que referencia al modelo de la aplicación

• Es un contexto para ejecutar expresiones

• Representan una estructura jerárquica hasta el $rootScope

• Pueden observar cambios con $watch

• Pueden propagar y escuchar eventos - $emit, $broadcast, $on

Page 47: Probando aplicaciones AngularJS

$apply• Método que prove cada $scope

• Se usa para propagar cambios en el modelo a la vista

• Se usa cuando actualizamos el modelo fuera del control de Angular (eventos del browser, timeouts, XHR, etc)

• Fuerza un digest cycle

Page 48: Probando aplicaciones AngularJS

$compile• Compila un string o un elemento DOM

• Produce una función template

• La función generada se usa para enlazar un $scope y el template

• Camina por el árbol DOM y compila directivas conocidas

Page 49: Probando aplicaciones AngularJS

$timeout

• Función envoltura para setTimeout()

• Retorna una promesa

• $timeout.cancel(promise)

• En tests: $timeout.flush() para sincronizar

Page 50: Probando aplicaciones AngularJS

mock $httpBackend

• Falso $httpBackend para correr tests sin backend

• Imitar un backend y proporcionar respuestas para cada ruta

• Util para servicios que usan $http

Page 51: Probando aplicaciones AngularJS
Page 52: Probando aplicaciones AngularJS

Hay que usar jasmine.Ajax!

“Y si no estamos usando $http?”

Page 53: Probando aplicaciones AngularJS

Agregar a bower.json Agregar a los archivos de karma.conf.js

Usando Jasmine Ajax con Karma

Page 54: Probando aplicaciones AngularJS

Jasmine spyOn()

Page 55: Probando aplicaciones AngularJS

Como debuggear con Protractor?

• Se usa browser.pause(); en test.

• La terminal de Protractor se detiene.

• Usar ‘c’ para continuar

• Usar ‘repl’ para entrar en el modo interactivo

• En el modo interactivo se pueden usar los comandos Webdriver para dirigir el browser

Page 56: Probando aplicaciones AngularJS

E2E Tests con Protractor

Page 57: Probando aplicaciones AngularJS

https://github.com/rodrigopivi/angularComponentStarter

“Mi start project para angular components”

Page 58: Probando aplicaciones AngularJS

Practica• Descargar y correr el proyecto ejemplo

https://github.com/rodrigopivi/angularComponentStarter

• Escribir pruebas e2e para verificar la directiva show-more-or-less - Click para expandir y verificar - Click para contraer y verificar

• Extender la app y hacer un controller o servicio que solicita data de una api. - Debe usar algo como $http.get(‘/hola’) …

• Escribir un test unitario que use $httpBackend para simular el backend y probar el servicio/controller creado

Page 59: Probando aplicaciones AngularJS

Clase 4

Page 60: Probando aplicaciones AngularJS

Repaso• Que herramientas se usan para correr los tests

E2E?

• Que es el desarrollo basado en componentes?

• Que es y para que sirve el uso de $scope, $compile y $apply?

• Como debuggear un test con Protractor?

Page 61: Probando aplicaciones AngularJS

Comunicación entre componentes angular

• Usar $broadcast y $emit evitando usar $watch en lo posible

• Usar un namespace adecuado para los eventos

• Usar un ID del componente para los eventos (para evitar conflictos con otros componentes redundantes)

Page 62: Probando aplicaciones AngularJS

Probando un File Upload• Usar <input type=“file”> y enlazar el input con un

modelo en el $scope

• El input retorna un objeto FileList que es una lista de objetos File

• Hay limitaciones de seguridad para manejar objetos File y FileList

• Usar una directiva que convierta FileList en un arreglo de Files

Page 63: Probando aplicaciones AngularJS

Probando un File Upload

Page 64: Probando aplicaciones AngularJS

Karma para proporcionar fixtures

Page 65: Probando aplicaciones AngularJS

Code review a un componente complejo

Page 66: Probando aplicaciones AngularJS

EXAMEN FINAL• Actualizar a la ultima version del starter kit

- Hacer un fork del proyecto de Github: github.com/rodrigopivi/angularComponentStarter - Clonar el fork- Mover node_modules y vendor del antiguo proyecto (evitar descargar)

• Escribir “pruebas unitarias” para ExamComponent - Simular el backend usando $httpBackend - Brindar el método GET para la ruta ‘demo/getStoredCount.json’ que provea 2 valores diferentes para 2 tests unitarios - Escribir pruebas para el Servicio y Directiva

• Escribir “pruebas E2E” - probar clicks en diferentes botones - verificar que todos comparten el mismo valor

Page 67: Probando aplicaciones AngularJS

github.com/rodrigopivi<3

“Muchas GRACIAS!”