Top Banner
Testing Angular Apps Por Rodrigo Pimentel
67

Probando aplicaciones AngularJS

Apr 16, 2017

Download

Software

Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
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!”