Resumen Testing
Resumen Testing
del Testing
El testing es el proceso de ejecución
de un programa con la intención de
encontrar errores.
Casos de prueba
Aprendamos a redactarlo…
Casos de prueba
Características de un buen caso de prueba
Deben ser simples
Se deben crear casos de prueba que sean lo más simples posibles
ya que otra persona que no sea el autor puede ejecutarlos. Utilizar
un lenguaje asertivo para facilitar la comprensión y que la
ejecución sea más rápida.
El título debe ser fuerte
Solo leyendo el título, cualquier probador debería comprender el
objetivo del caso de prueba.
Tener en cuenta al usuario final
El objetivo final es crear casos de prueba que cumplan con los
requisitos del cliente y que sean fáciles de usar.
Casos de prueba
Características de un buen caso de prueba (continuación)
No asumir
No asumir la funcionalidad y las características de la aplicación
mientras se prepara el caso de prueba. Se debe ser fiel a los
documentos de especificación y ante cualquier duda, hay que
consultar.
Asegurar la mayor cobertura posible
Escribir casos de prueba para todos los requisitos especificados.
Autonomía
El caso de prueba debe generar los mismos resultados siempre,
sin importar quien lo pruebe.
Evitar la repetición de casos de prueba
Si se necesita un caso de prueba para ejecutar otro, indicar el
caso de prueba por su ID.
Casos de prueba
¿Qué debe contener un caso de prueba?
Casos de prueba
¿Qué debe contener un caso de prueba? (continuación)
Casos de prueba
Casos de prueba
Ciclo de vida
de las pruebas
de software
No existe un proceso de prueba
único y universal, pero existen
actividades de prueba comunes que
nos ayudan a organizarnos para
alcanzar los objetivos establecidos.
El proceso de prueba en contexto
Planificación Implementación
Análisis Conclusión
Diseño
Planificación
En esta actividad se definen los objetivos y el enfoque de la prueba dentro de las
restricciones impuestas por el contexto.
Algunas subactividades realizadas son:
● Determinar el alcance, los objetivos y los riesgos.
● Definir el enfoque y estrategia general.
● Integrar y coordinar las actividades a realizar durante el ciclo de vida del
software.
● Definir las especificaciones de técnicas, tareas de prueba adecuadas, las
personas y otros recursos necesarios.
Planificación
Documentos de salida:
● Plan de prueba —general y/o por nivel de prueba—.
Seguimiento y control
El objetivo de esta actividad es reunir información y proporcionar retroalimentación y
visibilidad sobre las actividades de prueba. Como parte del control, se pueden tomar
acciones correctivas, como cambiar la prioridad de las pruebas, el calendario y
reevaluar los criterios de entrada y salida.
Documento de salida:
● Informe de avance de la prueba.
Análisis
Durante esta actividad se determina “qué probar”.
Documento de salida:
● Contratos de prueba que contienen las condiciones de prueba.
Diseño
Durante esta actividad se determina “cómo probar”.
Algunas subactividades realizadas son:
● Diseñar y priorizar casos de prueba y conjuntos de casos de prueba de alto
nivel.
● Identificar los datos de prueba necesarios.
● Diseñar el entorno de prueba e identificar la infraestructura y las herramientas
necesarias.
● Capturar la trazabilidad entre la base de prueba, las condiciones de prueba, los
casos de prueba y los procedimientos de prueba.
Documento de salida:
● Casos de prueba de alto nivel diseñados y priorizados.
Implementación
Se completan los productos de prueba necesarios para la ejecución de la prueba,
incluyendo la secuenciación de los casos de prueba en procedimientos de prueba.
Documento de salida:
● Procedimientos y datos de prueba.
● Calendario de ejecución.
● Test suite.
Ejecución
Durante esta actividad se realiza la ejecución de los casos de prueba.
1 Primero, se debe hacer clic en el botón del ojo para crear nuestras
variables de entorno.
2 El siguiente paso es completar los datos del entorno y de las variables. ¿Cómo?
Debug o depuración 2
¿Qué es
1 “debug”?
Debug o depuración 3
Llamamos debuggear o depurar
al proceso de encontrar, analizar y
remover las causas de fallos en el
software.
Se realiza la ejecución paso a paso
de cada instrucción del programa
para analizar las variables y sus
valores.
Debug o depuración
2 Breakpoints
Debug o depuración 5
Un breakpoint es un punto de
interrupción en nuestro código para
detener la ejecución del programa en
líneas específicas y analizar la situación
del mismo, revisando por ejemplo el
estado de las variables o de la pila de
llamadas en ese momento.
Debug o depuración 6
Debug
Se puede realizar el debug de una aplicación utilizando:
➔ Las herramientas del desarrollador desde la consola del navegador, ej: Chrome
Dev Tools, Firefox Dev Tools
➔ La opción Debug dentro del framework o IDE utilizado para el desarrollo, ej:
Visual Code, Visual Studio.
Debug o depuración 7
3 Debug en Chrome
Debug o depuración 8
Debug desde la consola de Chrome
Se puede depurar código JavaScript directamente desde la consola de Chrome, siguiendo los
pasos a continuación:
1 Acceder a la consola de Chrome:
● haciendo clic derecho y seleccionando “Inspeccionar” o “Ctrl + Mayús + I”
● presionando la tecla F12(en algunas pcs)
● haciendo clic el menú lateral derecho, ir a “Más herramientas” y seleccionar “Herramientas
para desarrolladores”
Debug o depuración 9
Debug desde la consola de Chrome(cont.)
Debug o depuración 10
Debug desde la consola de Chrome(cont.)
Debug o depuración 11
Debug desde la consola de Chrome(cont.)
Debug o depuración 12
Interfaz de debug
Cuando abrimos el menú de debug tanto en Chrome como en el Visual Studio
nos despliega lo siguiente:
Chrome
● Continue/Resume
● Step over
● Step into Visual Studio
● Step out
● Restart
● Stop
Veamos cada parte en más detalle...
Debug o depuración 13
Controles
Icono Función
Step into: Ejecuta la siguiente línea de código, pero si es una función “entra” a
ejecutarla línea por línea.
Debug o depuración 14
Ejemplo
Debug o depuración 15
4 Debug en Visual Studio
Debug o depuración 16
Debug en Visual Studio
1 Dentro de la aplicación, Ir a la funcionalidad que se requiere depurar, desde el
explorador de soluciones
Debug o depuración 17
Debug en Visual Studio(cont.)
2 Colocar un breakpoint en la línea de código requerida.
Breakpoint
Al hacer clic a la izquierda del número de Contenido
línea, establecemos un breakpoint. El contenido de nuestro código.
Número de línea
Nos indica el número de línea en el que está el código.
Debug o depuración 18
Debug en Visual Studio(cont.)
3 Iniciar el Debug, haciendo clic en F5 o ingresando en Ejecutar(Run) -> Start Debugging
Debug o depuración 19
Debug en Visual Studio(cont.)
Si es la primera vez que se va a realizar debugging sobre la aplicación, se debe ingresar al
menú “Add configuration…” y agregar la configuración de Chrome para ejecutar la
aplicación. Esto crea el archivo launch.json en el cual se debe configurar en “file” la
dirección del archivo .html que inicia la aplicación:
Debug o depuración 20
Debug en Visual Studio(cont.)
4 Debido a que se utiliza Chrome para realizar el debugging, es necesario realizar una
acción en la aplicación
Debug o depuración 21
Control de variables
Como podemos ver, en el breakpoint nuestra variable vale “2” y eso está
reflejado en el menú de debug a la izquierda.
Debug o depuración 22
Título del ppt
¿Qué tipos de
prueba se pueden
hacer en cada
ambiente?
1. Pruebas según el ambiente
2. DEV
Agenda 3. QA
4. UAT
5. STG
Tipos de prueba
Pruebas según el
1 ambiente
Tipos de prueba
Tipos de prueba
según ambiente DEV DEV
-Pruebas unitarias o de
5
PROD 1 componente
-Pruebas de integración
STG AMBIENTE
-Pruebas de mantenimiento DE PRUEBA QA
-Pruebas de seguridad 4 2 QA
-Pruebas funcionales
-Pruebas de rendimiento
STG 3
-Pruebas de casos de uso
-Pruebas de carga, estrés y -Pruebas de exactitud
escalabilidad -Pruebas de adecuación
-Pruebas de infraestructura
UAT -Pruebas de sistema
-Pruebas de gestión de la -Pruebas de regresión
-Pruebas de confirmación
memoria, compatibilidad e UAT - Pruebas de Humo
interoperabilidad -Pruebas de aceptación - Pruebas de Cordura
-Pruebas de migración de -Pruebas exploratorias
datos -Pruebas de usabilidad
-Pruebas de accesibilidad
Tipos de prueba
En las siguientes pantallas no desarrollaremos el ambiente
PROD debido a que:
Tipos de prueba
2 DEV
Tipos de prueba
DEV
Pruebas unitarias o de componente: También se conocen
como pruebas de módulo. Se centra en los componentes que
se pueden probar por separado. Tiene como objetivo
encontrar defectos en el componente y verificar que los
comportamientos funcionales y no funcionales del
componente son los diseñados y especificados.
Tipos de prueba
3 QA
Tipos de prueba
QA
Pruebas funcionales: Incluye pruebas que evalúan las
funciones que el sistema debe realizar. Los requisitos
funcionales pueden estar descritos en productos de trabajo
tales como especificaciones de requisitos de negocio, épicas,
historias de usuario, casos de uso y especificaciones
funcionales. También pueden estar sin documentar.
Tipos de prueba
QA
Pruebas de adecuación: Implican evaluar y validar la
eficiencia de un conjunto de funciones para la consecución de
las tareas especificadas previstas. Estas pruebas pueden
basarse en casos de uso.
Tipos de prueba
QA
Pruebas de regresión: Implican la realización de pruebas
para detectar efectos secundarios no deseados, luego de
cambios hechos en una parte del código que puedan afectar
accidentalmente el comportamiento de otras partes del
código.
Tipos de prueba
QA
Pruebas de cordura: Es una prueba de regresión acotada que
se centra en una o unas pocas áreas de funcionalidad. Se
utiliza para determinar si una pequeña sección de la aplicación
sigue funcionando después de un cambio menor.
Tipos de prueba
4 UAT
Tipos de prueba
UAT
Pruebas de aceptación: Se centra normalmente en el
USER
comportamiento y las capacidades de todo un sistema o
producto. Además, pueden producir información para evaluar
ACCEPTANCE
el grado de preparación del sistema para su despliegue y uso
por parte del cliente (usuario final). UAT
TESTING
Pruebas exploratorias: Se diseñan, ejecutan, registran y
evalúan de forma dinámica pruebas informales (no
predefinidas) durante la ejecución de la prueba. Los resultados
de la prueba se utilizan con el objetivo de aprender más sobre
el componente o sistema y crear pruebas para las áreas que
pueden necesitar ser probadas con mayor intensidad.
Tipos de prueba
UAT
Pruebas de usabilidad: Evalúan la facilidad con la que los
usuarios pueden utilizar o aprender a utilizar el sistema para
lograr un objetivo específico en un contexto dado.
Tipos de prueba
5 STG
Tipos de prueba
STG
Pruebas de mantenimiento: Se centra en probar los cambios en el
sistema, así como en probar las piezas no modificadas que podrían
haberse visto afectadas por los cambios. El mantenimiento puede incluir
lanzamientos planificados y no planificados.
Pruebas de seguridad: Las pruebas de seguridad se podrían definir
como el conjunto de actividades que se llevan a cabo para encontrar
fallas y vulnerabilidades en el sistema, buscando disminuir el impacto de
ataques y pérdida de información importante.
Pruebas de rendimiento: Se implementan y se ejecutan para evaluar
las características relacionadas con el rendimiento del destino de la
prueba, como los perfiles de tiempo, el flujo de ejecución, los tiempos de
respuesta y la fiabilidad y los límites operativos. También se pueden
realizar en STG.
Tipos de prueba
STG
Pruebas de carga, estrés y escalabilidad: Una prueba de carga
garantiza que un sistema pueda controlar un volumen de tráfico
esperado. Una prueba de estrés es en la que se somete al sistema a
condiciones de uso extremas para garantizar su robustez y
confiabilidad. Las pruebas de escalabilidad garantizan la escalabilidad
de un sistema, es decir, que pueda soportar el incremento de demanda
en la operación. También se pueden realizar en QA encontrando el
correspondiente escalar con respecto a un ambiente de PROD.
Pruebas de infraestructura: Incluyen todos los sistemas informáticos
internos, los dispositivos externos asociados, las redes de Internet, la
nube y las pruebas de virtualización.
Pruebas de gestión de la memoria: Evalúan el estado y la integridad
de la memoria del sistema para identificar problemas potenciales.
Tipos de prueba
STG
Pruebas de compatibilidad: Incluyen las pruebas para comprobar
que el sistema es compatible con todos los navegadores de Internet y
todos los sistemas operativos del mercado.
Tipos de prueba
Tipos de prueba
Gestión de defectos
1. Proceso general
2. Escribir un informe
Índice de defectos
Gestión de defectos
Proceso
1 general
Gestión de defectos
Proceso de gestión de defectos
02 Registrar
Varía según el contexto del
Detectar
componente o sistema, nivel de
prueba y modelo de desarrollo
elegido.
01 03
Clasificación/
Resolución Investigación y
04 seguimiento
Gestión de defectos
Objetivos
Gestión de defectos
Escribir un informe
2 de defectos
Gestión de defectos
¿Cómo escribir un buen informe?
Si el defecto se reporta eficientemente, las
probabilidades de que sea solucionado
rápidamente es mayor. Entonces, la solución de
un defecto dependerá de la eficiencia con que se
reporte.
Gestión de defectos
¿Qué condiciones debemos tener en cuenta?
Gestión de defectos
Reportar cada paso realizado
Ser específico.
para reproducirlo.
No se debe escribir suposiciones o
Toda la información que podamos
ideas sobre lo que está ocurriendo u
darle al desarrollador para que pueda
otra cosa que no sea la información reproducir la falla siempre será
relevante para poder reproducir el bienvenida, no debemos obviar
defecto. ningún paso que sea relevante para
llegar al error en cuestión.
Gestión de defectos
¿Cuáles son los problemas más comunes
con los informes de defectos?
● Redactar un defecto de manera excesivamente coloquial y ambigua.
● Dar solo una captura del defecto sin indicar qué se estaba haciendo cuando sucedió.
● No incluir en la descripción del defecto cuál era el resultado esperado para los pasos
realizados.
● No leer el defecto reportado siguiendo los pasos uno mismo para ver que la
descripción es clara.
1. Response: es la información
en plano devuelta por el
servidor. Con esto podemos
dar una revisión temprana
de los datos de la aplicación.
2. Tiempo y tamaño de la
respuesta: con estos datos
podemos ver si el sistema
está cumpliendo uno de los
requisitos no funcionales, tal
como el rendimiento.
3. Código de respuesta:
cuando solicitas información al
servidor, este puede contestar
distintos códigos de estado que
te informan qué pasó con tu
solicitud.
El código 200 nos indica que la
solicitud se realizó con éxito.
5. Headers: información
sobre la solicitud
procesada.
un formulario.
"bs": "real-time tutorials"
}
}
5. Haz clic en ENVIAR para mandar la solicitud al servidor que aloja la URL.
1. Response: es la información
en plano devuelta por el
servidor, la cual nos sirve para
validar si la creación fue
exitosa.
Generalmente este método
devuelve los datos del usuario
creado o un mensaje de
creación exitosa.
2. Tiempo y tamaño de la
respuesta: con estos datos
podemos ver si el sistema está
cumpliendo uno de los
requisitos no funcionales, tal
como el rendimiento.
Unit Testing
1 Generalidades
Unit Testing
El objetivo principal es aislar cada
unidad del sistema para identificar,
analizar y corregir los defectos.
Unit Testing
Generalidades
La prueba de componente, a menudo, se realiza de forma aislada del resto del
sistema, dependiendo del modelo de ciclo de vida de desarrollo de software y del
sistema, lo que puede requerir objetos simulados, virtualización de servicios,
arneses, stubs y controladores.
Este tipo de pruebas puede cubrir:
Unit Testing
Proceso
En general, cuando no se sigue un enfoque
<Your Code>
TDD, el proceso es el siguiente: Modify & Fix
1. Se crea el código del software.
2. Se definen los resultados esperados. Expected Result
3. Se ejecuta el test.
a) Si el test pasa, se confirma el Automate
Test
resultado esperado. & Simplicity
b) Si el test falla, se modifica el
código para solucionar el defecto
Success/ Confirmation Failure
encontrado
Unit Testing
Ventajas
Estas son algunas de las ventajas de realizar pruebas de componente o unit test
dentro de un proyecto:
Unit Testing
Ventajas
Unit Testing
Las pruebas unitarias inapropiadas harán que los
defectos se propaguen hacia pruebas de nivel
superior y esto conducirá a un alto costo de
reparación de defectos durante las pruebas del
sistema, las pruebas de integración e incluso las
pruebas de aceptación de usuario. Si se realizan las
pruebas unitarias adecuadas en el desarrollo inicial,
al final se ahorra esfuerzo, tiempo y dinero.
Unit Testing
2 Frameworks
Unit Testing
Frameworks
Las pruebas unitarias pueden ser de dos tipos:
Manuales Automatizadas
Se puede emplear un Se necesita de un framework
documento instructivo automatizado para escribir los
paso a paso. scripts de prueba.
Unit Testing
¿Qué se necesita para automatizar los unit test?
TEST RUNNER ASSERTION LIBRARY
JEST es un framework que incluye tanto el test runner como la assertion library
Unit Testing
Frameworks más utilizados
Junit: herramienta de prueba de uso gratuito que se utiliza para el lenguaje
de programación Java. Proporciona afirmaciones para identificar el método
de prueba. Esta herramienta prueba los datos primero y luego los inserta
en el fragmento de código.
Unit Testing
Frameworks más utilizados
EMMA : es un conjunto de herramientas de código abierto para
analizar y reportar código escrito en lenguaje Java. Emma admite
tipos de cobertura como método, sentencia, bloque básico. Está
basado en Java, por lo que no tiene dependencias de bibliotecas
externas y puede acceder al código fuente.
Unit Testing
Framework para JavaScript
Para JavaScript vamos utilizar el framework JEST. Si queremos configurarlo,
debemos instalar:
1. NodeJS (https://nodejs.org/)
2. Un IDE (el recomendado es Visual Studio Code -
https://code.visualstudio.com/)
3. JEST (https://jestjs.io/)
Unit Testing
Unit Testing
Introducción
a Selenium
1. ¿Qué es Selenium?
Índice 2. Selenium IDE
Introducción a Selenium
¿Qué es Selenium?
Introducción a Selenium
¿Qué es Selenium?
Selenium es una herramienta de código abierto para la automatización de pruebas de
navegadores web. Proporciona la posibilidad de grabar y/o reproducir, editar y depurar casos
de pruebas que permitirán ejecutarlas repetidamente cuando sea necesario. Selenium ofrece
tres productos con distintos propósitos:
Introducción a Selenium
Selenium IDE
Introducción a Selenium
Selenium WebDriver
Es una herramienta que permite automatizar pruebas UI
(User Interface) o interfaz de usuario de aplicaciones web.
Algunos de los lenguajes que soportan Selenium
WebDriver Java, C#, Python, Ruby, PHP, JavaScript.
Es útil para poder simular la manera en que los usuarios
reales interactúan con alguna aplicación web. Para ello,
Selenium WebDriver provee una serie de métodos para
accionar y validar cualquier elemento dentro de una
interfaz gráfica.
Introducción a Selenium
Selenium Grid
Permite diseñar pruebas automatizadas para aplicaciones web
en diversas plataformas. Asimismo, posibilita la ejecución de
pruebas en diversos servidores en paralelo. Es por esto por lo
que reduce el tiempo de ejecución y el costo, debido a la
ejecución de las pruebas en varios navegadores y en diversos
sistemas operativos. Selenium Grid cuenta con dos
componentes: Selenium Hub y Remote Control.
Introducción a Selenium
2 Selenium IDE
Introducción a Selenium
Selenium IDE
Se trata de un entorno de pruebas de software para aplicaciones basadas en la web
que permite realizar tareas de Record&Play de flujos de pruebas.
Los flujos grabados quedan contenidos en un script que se puede editar y
parametrizar para adaptarse a los diferentes casos, y lo que es más importante, su
ejecución se puede repetir tantas veces como se quiera.
Permite referenciar objetos del DOM en base al ID, CSS, nombre o a través de XPath.
Introducción a Selenium
Selenium IDE - Instalación
1 Descargar Selenium IDE para Chrome:
https://www.selenium.dev/selenium-ide
Introducción a Selenium
Selenium IDE - Instalación
2 Presionar la opción “Añadir a Chrome”.
Introducción a Selenium
Selenium IDE - Instalación
3 Ejecutar Selenium IDE desde el panel de la aplicación:
Introducción a Selenium
Selenium IDE - Ejemplo Record & Play
Introducción a Selenium
Selenium IDE - Ejemplo Record & Play
3. Ingresar nombre del proyecto.
Introducción a Selenium
Selenium IDE - Ejemplo Record & Play
4. Ingresar URL de la página web y
presionar la opción “Start Recording”
para iniciar la grabación de la prueba:
Introducción a Selenium
Selenium IDE - Ejemplo Record & Play
5. Se abrirá el navegador con la página web indicada. Para nuestro ejemplo,
posicionarse en el campo “Correo electrónico” e ingresar un mail. Luego, en
el campo contraseña, ingresar una, y por último, hacer clic en “Iniciar sesión”.
Por último, presionar la opción STOP de Selenium IDE e ingresar el nombre
del caso de prueba.
Introducción a Selenium
Selenium IDE - Ejemplo Record & Play
A continuación se adjunta video con los pasos realizados para grabar el caso
de prueba de login de Facebook.
https://drive.google.com/file/d/1EKCu7rPBx7HSf5T_mo_p3V62en_8npT0/view?
usp=sharing
Introducción a Selenium
Selenium IDE - Ejemplo Record & Play
Introducción a Selenium
Selenium IDE - Ejemplo Record & Play
Hay distintas formas de localizar los elementos en la web. Puede ser por id o name entre
otros. En el ejemplo del login vemos que se localizan por el id:
Introducción a Selenium
Selenium IDE - Ejemplo Record & Play
Podemos observar que se localizó el botón de inicio de sesión con id. Al reproducir este
caso de prueba, una vez que llega a ejecutarlo entra en un lapso sin dar respuesta. Por lo
tanto, se asume que se localizó de manera incorrecta el elemento, en este caso, el botón de
inicio de sesión.
Este caso de componentes de páginas web que tienen un id dinámico se presenta con
frecuencia. Para resolver esta inconsistencia se debe buscar otro forma de ubicar el
componente.
Introducción a Selenium
Selenium IDE - Ejemplo Record & Play
Se debe inspeccionar el elemento y validar, si es posible, la localización por otro
parámetro. En este caso, se puede localizar por name. Entonces, en Selenium se
debe modificar el target a name:
WEB
Selenium
Introducción a Selenium
Introducción a Selenium
Matchers más
usados con Jest
Matchers en Jest
Jest usa los matchers para probar los diferentes valores que puede tener el código.
Vamos a partir de un ejemplo de una porción de código desarrollada que permite
realizar las operaciones matemáticas básicas y aplicarle diferentes matchers:
Matchers - Jest
.toBe
Usado para comparar valores primitivos (enteros, flotantes, etc.).
expect(sumar(1,1)).toBe(2);
});
expect(restar(1,1)).toBe(0);
});
});
Matchers - Jest
.toEqual
Usado para comparar objetos y todas sus propiedades:
describe('Common matchers', () => {
const datos = {
edad: 10
const datos2 = {
edad: 10
expect(datos).toEqual(datos2); });
});
Matchers - Jest
.toBeLessThan
El valor es menor que:
test('Resultado menor que...', () => {
expect(restar(5,3)).toBeLessThan(3);
});
.toBeLessThanOrEqual
El valor es menor o igual que:
test('Resultado menor o igual que...', () => {
expect(restar(5,3)).toBeLessThanOrEqual(2);
});
Matchers - Jest
.toBeGreaterThan
expect(sumar(5,5)).toBeGreaterThan(9);
});
.toBeGreaterThanOrEqual
El valor es mayor o igual que:
expect(multiplicar(2,5)).toBeGreaterThanOrEqual(10);
});
Matchers - Jest
Más ejemplos
A nuestro código de ejemplo le vamos a agregar otras operaciones de lógica, las
cuales nos permitirán comparar valores booleanos, indefinidos y nulos.
Matchers - Jest
.toBeTruthy
El valor es verdadero:
expect(isTrue).toBeTruthy();
});
.toBeFalsy
El valor es falso:
expect(isFalse).toBeFalsy();
});
Matchers - Jest
.toBeUndefined
El valor es undefined:
expect(isUndefined).toBeUndefined();
});
.toBeNull
El valor es null:
test('Resultado Null...', () => {
expect(isNull).toBeNull();
});
Matchers - Jest
Arrays y strings
Para continuar, también veremos algunos matchers que se utilizan para trabajar con
arrays y strings. Para eso a nuestro código le agregamos las siguientes líneas:
const provincias = ['Álava','Girona','Huelva','Jaén','La Rioja','Madrid','Navarra'];
const expReg = {
email: '[email protected]',
telefono: '919784852'
Matchers - Jest
.toContain
Contiene el elemento dentro del array:
test('Madrid existe en el array', () => {
expect(arrProvincias()).toContain(‘Madrid’);
});
.toHaveLength (array)
El array tiene la longitud:
expect(arrDias()).toHaveLength(7);
});
Matchers - Jest
.toHaveLength (string)
También podemos usar este matcher para ver la longitud de un string:
const exp = objExpReg();
.toMatch
Comprueba que un texto coincida con una expresión regular:
const exp = objExpReg();
Matchers - Jest
¡Sigamos aprendiendo!
Si queremos conocer más detalles o
conocer toda la lista de matchers que
se puede usar con Jest, podemos verlo
en la documentación oficial:
https://jestjs.io/docs/expect.
Matchers - Jest
Matchers - Jest
Partes de un informe de defectos
Atributo Descripción Ejemplo
1) Ingresar a la
Los pasos a seguir para llegar al defecto
aplicación.
encontrado.
2) Dejar en blanco el
Pasos a campo nombre.
reproducir 3) Dejar en blanco el
campo password.
4) Hacer click en el
botón “Ingresar”.
● Para codificar los test con Postman debemos de conocer un poco el API que
nos ofrecen. Cada uno de los test es ejecutado con el objeto pm y en
concreto con el método .test(). Así, para cada uno, tendremos la siguiente
estructura:
1
● Otro método importante es el que nos permite realizar una comprobación
de contenido, este es pm.expect.
2
● Con esta prueba estamos validando que el código de respuesta de la API sea
200. Si esto es correcto el test devolverá PASS: eso significa que el servicio
está respondiendo según lo esperado.
3
3. Agreguemos otra de las pruebas más usadas. En esta compararemos el
resultado esperado con el resultado real.
● Podemos cambiar el nombre de la prueba por defecto por el que más nos
guste. En este caso lo reemplazamos por “Verificar si Leanne Graham tiene el
ID de usuario 1”, dado que este es el primero usuario de la lista devuelta por
el API. También debemos actualizar el cuerpo de la función reemplazando
jsonData.value con jsonData[0].name; así obtendremos el primer elemento
de la lista.
4
● Al hacer clic en ENVIAR se mostrará el resultado.
● Se observa que nuestro test nos devolvió un estado “PASS”. De esta manera
validamos que el contenido de la response es el esperado. Así, podremos ir
validando diferentes datos y viendo si nuestra petición nos devuelve los
datos deseados.
5
● Por último, se observa que al momento de enviar la petición se ejecutan
todos los test relacionados a esta. De esta manera, podemos crear un set de
test vinculados a cada petición y verificar rápidamente su estado.
6
Repaso de
JavaScript
1. Variables
2. Tipos de datos
3. Operadores
Índice 4. Funciones
5. Condicionales
6. Ciclos
2
1 Variables
3
Las variables son espacios de
memoria en la computadora donde
podemos almacenar distintos tipos de
datos.
Tipos de variables
En JavaScript existen estos tipos de variables:
● let
● const
Para declarar una variable escribimos el tipo y el nombre que le queremos dar a la
variable:
let contador;
{}
const url;
5
Declaración de una variable
let nombreSignificativo;
let Nombre
La palabra reservada let - Solo puede estar formado por letras, números y los
le indica a JavaScript que símbolos $ (pesos) y _ (guion bajo).
vamos a declarar una - No pueden empezar con un número.
variable de tipo let. - No deberían contener ñ o caracteres con acentos.
Es una buena práctica que los nombres de las variables usen el formato
Camel case, como variableEjemplo en vez de variableejemplo
o variable_ejemplo. Recordá que JavaScript es un lenguaje que hace
diferencia entre MAYÚSCULAS y minúsculas.
6
Asignación de un valor
7
Asignación de un valor
La primera vez que declaramos una variable es necesaria la palabra reservada let.
Una vez que la variable ya fue declarada, le asignamos valores sin let.
8
Declaración con const
Las variables const se declaran con la palabra reservada const.
Al contrario de let, una vez que les asignemos un valor, no podremos cambiarlo.
email = "[email protected]";
{} // Error de asignación, no se puede cambiar
// el valor de un const
9
Declaración con let o const
Como dijimos antes, tanto let como const son accesibles dentro del bloque donde son
declaradas.
Por esta razón solo podemos declararlas una vez. Si volvemos a declararlas, JavaScript
nos devolverá un error.
let contador = 0;
let contador = 1;
// Error de re-declaración de la variable
{}
const email = "[email protected]";
const email = "[email protected]";
// Error de re-declaración de la variable
10
Declaración con var
Existe otra forma de declarar variables que ya no se utiliza y no lo veremos en la
materia, pero que puede ser que la encuentres en códigos que tengan algunos años.
Estas variables se declaran de una manera similar, con la diferencia que utilizamos la
palabra reservada var.
{} var contador = 1;
La principal diferencia entre var y let es que var será accesible de manera global por
todo nuestro código y no estará limitado el acceso a solo el bloque de código donde fue
declarado como es el caso de let.
Por convención y buenas prácticas es recomendado el uso de let.
Los bloques de código son normalmente determinados por las llaves { }.
11
“
Las palabras reservadas como var, let y
const solo pueden utilizarse para el
propósito que fueron creadas.
No pueden ser utilizadas como:
nombre de variables, funciones,
métodos o identificadores de objetos.
12
2 Tipos de datos
13
“
Los tipos de datos le permiten a
JavaScript conocer las características
y funcionalidades que estarán
disponibles para ese dato.
” 14
Numéricos (number) Como JavaScript está
escrito en inglés,
let edad = 35; // número entero usaremos un punto
para separar los
let precio = 150.65; // decimales decimales.
{}
let malaDivision = "35" / 2; // NaN - Not a Number, no es
un número aunque es un valor de “tipo” number
Cadenas de caracteres (string)
let nombre = 'Mamá Luchetti'; // comillas simples
{} let ocupacion = "Master of the sopas"; // comillas
dobles tienen el mismo resultado
16
Undefined (valor sin definir)
Indica la ausencia de valor.
Las variables tienen un valor indefinido hasta que les asignamos uno.
17
Array
0 1 2
Para acceder a un elemento puntual de un array, nombramos al array y, dentro de
los corchetes, escribimos el índice al cual queremos acceder.
pelisFavoritas[2];
{}
// accedemos a la película Alien, el índice 2 del array
18
Objeto literal
let tenista = {
nombre: 'Roger',
edad: 38,
activo: true,
{}
saludar: function() {
return '¡Hola! Me llamo Roger';
}
};
Ejecución de un método de un objeto
Para ejecutar un método de un objeto usamos la notación objeto.metodo().
La palabra reservada this hace referencia al objeto en sí donde estamos parados. Es
decir, el objeto en sí donde escribimos la palabra.
Con la notación this.propiedad accedemos al valor de cada propiedad interna de ese
objeto.
let tenista = {
nombre: 'Roger',
apellido: 'Federer',
saludar: function() {
{}
return '¡Hola! Me llamo ' + this.nombre;
}
};
console.log(tenista.saludar()); // ¡Hola! Me llamo Roger
NaN (Not-A-Number)
Indica que el valor pasado no es un número.
22
3 Operadores
23
“
Los operadores nos permiten
manipular el valor de las variables,
realizar operaciones y comparar sus
valores.
” 24
De asignación
Asignan el valor de la derecha en la variable de la izquierda.
Aritméticos
Nos permiten hacer operaciones matemáticas, devuelven el resultado de la
operación. Siempre devolverán el resultado numérico.
10 + 15 // Suma → 25
10 - 15 // Resta → -5
{}
10 * 15 // Multiplicación → 150
15 / 10 // División → 1.5
25
Aritméticos (continuación)
Nos permiten hacer operaciones matemáticas, devuelven el resultado de la
operación.
15 5 15 2
0 3 1 7
26
De concatenación
Sirven para unir cadenas de texto. Devuelven otra cadena de texto.
Template literals
Existe otra forma de armar strings a partir de variables, y es con los template literals
utilizando backtick en lugar de comillas y las variables entre llaves a continuación del
símbolo $. En este ejemplo lo escribiríamos así: `Me llamo ${nombre} ${apellido}`
27
De comparación simple
Comparan dos valores, devuelven verdadero o falso.
10 == 15 // Igualdad → false
{}
10 != 15 // Desigualdad → true
De comparación estricta
Comparan el valor y el tipo de dato también.
En el primer caso, el valor es 10 en ambos ejemplos, pero los tipos de datos son
number y string. Como estamos comparando que ambos —valor y tipo de dato—
sean iguales, el resultado es false.
28
De comparación (continuación)
Comparan dos valores, devuelven verdadero o falso.
Siempre debemos escribir el símbolo mayor (>) o menor (<) antes que el
igual (>= o <=). Si lo hacemos al revés (=> o =<), JavaScript lee primero el
operador de asignación = y luego no sabe qué hacer con el mayor (>) o el
menor (<).
29
Lógicos
Permiten combinar valores booleanos, el resultado también devuelve un booleano.
Existen tres operadores y (and), o (or), negación (not).
AND (&&) → todos los valores deben evaluar como true para que el resultado sea
true.
30
OR ( || ) → al menos un valor debe evaluar como true para que el resultado sea
true.
!false // true
{}
!(20 > 15) // false
31
4 Funciones
32
Una función es un bloque de código que nos
permite agrupar una funcionalidad para
usarla todas las veces que necesitemos.
Normalmente, realiza una tarea específica y
retorna un valor como resultado.
Estructura básica
function sumar (a, b) {
{} return a + b;
}
● Palabra reservada: Usamos la palabra function para indicarle a JavaScript que vamos a escribir una
función.
● Nombre de la función: Definimos un nombre para referirnos a nuestra función al momento de querer
invocarla.
● Parámetros: Escribimos los paréntesis y, dentro de ellos, los parámetros de la función. Si hay más de
uno, los separamos usando comas ,. Si la función no lleva parámetros, igual debemos escribir los
paréntesis sin nada adentro ().
● Cuerpo: Entre las llaves de apertura y de cierre escribimos la lógica de nuestra función, es decir, el
código que queremos que se ejecute cada vez que la invoquemos.
● El retorno: Es muy común, a la hora de escribir una función, que queramos devolver al exterior el
resultado del proceso que estamos ejecutando. Para eso utilizamos la palabra reservada return seguida
de lo que queramos retornar.
Funciones declaradas
Son aquellas que se declaran usando la estructura básica. Pueden recibir un
nombre, escrito a continuación de la palabra reservada function, a través del
cual podremos invocarla.
Las funciones con nombre son funciones nombradas.
function saludar(nombre) {
{} return 'Hola' + nombre;
}
Funciones expresadas
Son aquellas que se asignan como valor de una variable. En este caso, la función
en sí no tiene nombre, es una función anónima.
Para invocarla podremos usar el nombre de la variable que declaremos.
function saludar() {
// todo el código que escribamos dentro
{} // de nuestra función, tiene scope local
}
// No podremos acceder desde afuera a ese scope
Scope global
En el momento en que declaramos una variable fuera de cualquier función, la
misma pasa a tener alcance global.
Es decir, podemos hacer uso de ella desde cualquier lugar del código en el que
nos encontremos, inclusive dentro de una función, y acceder a su valor.
{} (a, b) => a + b;
Como ya vimos, si la función tiene una sola línea de código, y esta misma es la que
hay que retornar, no hacen falta las llaves ni la palabra reservada return.
44
Nos permiten evaluar condiciones
y realizar diferentes acciones según el
resultado de esas evaluaciones.
45
Condicional simple
Versión más básica del if. Establece una condición y un bloque de código a
ejecutar en caso de que sea verdadera.
if (condición) {
{} // código a ejecutar si la condición es verdadera
}
46
Condicional con bloque else
Igual al ejemplo anterior, pero agrega un bloque de código a ejecutar en caso de
que la condición sea falsa.
Es importante tener en cuenta que el bloque else es opcional.
if (condición) {
// código a ejecutar si la condición es verdadera
{} } else {
// código a ejecutar si la condición es falsa
}
Los condicionales 47
Condicional con bloque else if
Igual que el ejemplo anterior, pero agrega un if adicional. Es decir, otra condición
que puede evaluarse en caso de que la primera sea falsa.
Podemos agregar todos los bloques else if que queramos, solo uno podrá ser
verdadero. De lo contrario, entrará en acción el bloque else, si existe.
if (condición) {
// código a ejecutar si la condición es verdadera
} else if (otra condición) {
{} // código a ejecutar si la otra condición es verdadera
} else {
// código a ejecutar si todas las condiciones son falsas
}
48
6 Ciclos
49
Los ciclos nos permiten repetir
instrucciones de manera sencilla.
Podemos hacerlo una determinada
cantidad de veces o mientras se cumpla
una condición.
Ciclo FOR
Consta de tres partes que definimos dentro de los paréntesis. En conjunto,
nos permiten determinar de qué manera se van a realizar las repeticiones y
definir las instrucciones que queremos que se lleven a cabo en cada una de
ellas.
for (inicio; condición ; modificador) {
{} //código que se ejecutará en cada repetición
}
Los ciclos
Ciclo WHILE
Tiene una estructura similar a la de los condicionales if/else, palabra reservada +
condición entre paréntesis. Sin embargo, el while Loop revalúa esa condición
repetidas veces y ejecuta su bloque de código hasta que la condición deja de
ser verdadera.
while (condicion) {
//código que se ejecutará en cada repetición
{} // Hace algo para que la condición eventualmente se deje
de cumplir
}
Estructura básica WHILE
Tomando el ejemplo utilizado con el for, veamos como sería utilizando while.
let vuelta = 1
while(vuelta <= 5) {
{} console.log('Dando la vuelta número ' + vuelta);
vuelta++ //al final de cada vuelta sumara 1 a vuelta
};
let vuelta = 1
while(vuelta <= 5) {
{} console.log('Dando la vuelta número ' + vuelta);
vuelta++
};
let vuelta = 5
do{
console.log('Dando la vuelta número ' + vuelta);
{}
vuelta++ //Se suma 1 a vuelta por lo tanto vuelta = 6
} while(vuelta <= 5); //al vuelta ser 6 la condición retorna
false y se termina el bloque de código
Validación Vs Verificación
7 prim
Business analyst / Analista de negocio: Se encarga de detectar los factores clave del
negocio y es el intermediario entre el departamento de sistemas y el cliente final.
QA: La principal función es probar los sistemas informáticos para que funcionen
correctamente de acuerdo a los requerimientos del cliente, documentar los errores
encontrados y desarrollar procedimientos de prueba para hacer un seguimiento de los
problemas de los productos de forma más eficaz y eficiente.
Si bien cada actor tiene un rol definido, es necesario un trabajo en comunión entre los 3
actores. Es decir, es necesario que trabajen como equipo. Por eso, utilizamos la analogía
con una mesa de 3 patas, pues si falta alguna de ellas, la mesa no podría estar de pie.
● En algunas empresas de software pequeñas o “start up” es posible que una misma
persona tenga más de un rol.
● Además, algo importante dentro de las metodologías de desarrollo ágiles, es la
reunión de los 3 amigos. Es una sesión en la que participan estos tres roles y cada
uno de ellos da su punto de vista respecto al software que está bajo desarrollo. Aquí,
más que nunca se pone en manifiesto el funcionamiento de la mesa.
Son aquellos casos de prueba que validan flujos no contemplados dentro de los requisitos
de un sistema bajo prueba.
Casos de uso
Antes de realizar el diseño de los casos de prueba, lo que se debe llevar a cabo es el
análisis de los documentos que van a ser la base para la generación de esos casos de
prueba. Estos documentos van a asegurar los requisitos del cliente. Generalmente, estos
requisitos se encuentran escritos como casos de uso. Un tester debe comprender qué es
un caso de uso y cómo diseñar los casos de prueba a partir de estos.
Niveles y tipos de prueba
En toda actividad es importante conocer el marco global, es decir, tener esa visión general
para no perder de vista dónde estamos y cómo seguimos. En este módulo, para lograr esta
visión global, comenzaremos por conocer cómo se relacionan en forma lógica y cronológica
las actividades que se desarrollan a lo largo del ciclo de vida de las pruebas de software
(STLC).
Prueba de integración:
Prueba de sistema:
Prueba de aceptación:
Enfoque tradicional y enfoque agil:
Pruebas funcionales:
Pruebas no funcionales:
● Pruebas de sanidad
● Pruebas de aceptación
● Pruebas de sistema
Pruebas No funcionales: Puede que tengamos un sistema funcionando, pero el usuario está
experimentando otro tipo de problemas que no son detectados por las pruebas anteriores.
Factores como lentitud, problemas con la combinación de colores que producen poca legibilidad,
claridad, usabilidad y seguridad, son los que testeamos en este tipo de prueba.
● Pruebas de rendimiento
● Pruebas de portabilidad
● Pruebas de usabilidad
● Pruebas de carga
● Pruebas de estrés
Pruebas estructurales: Éstas pruebas están basadas en la estructura interna del sistema o en
su implementación. La estructura interna puede incluir código, arquitectura, flujos de trabajo y/o
flujos de datos dentro del sistema.
● Prueba unitaria
● Prueba de integración
Pruebas asociadas al cambio: Este tipo de pruebas están asociadas a los cambios que se
producen debido a nuevos requerimientos o cambios en requerimientos existentes. Estos
cambios son más frecuentes en ciclos de vida de desarrollo iterativos e incrementales —por
ejemplo, Agile—.
● Prueba de confirmación (Re-test)
● Prueba de regresión
Técnica caja negra: En este tipo de técnicas el elemento es estudiado desde el punto de vista
de las entradas que recibe y las salidas o respuestas que produce, sin tener en cuenta su
funcionamiento interno.
● Partición de equivalencia
● Análisis de valores límites
Técnica caja blanca: Método por el cual se mira el código y la estructura del producto que se
va a probar y se usa ese conocimiento para la realización de las pruebas.
● Pruebas de sentencia
● Pruebas de decisión
Forma manual: Las pruebas manuales son ejecutadas directamente por uno o más testers,
simulando las acciones del usuario final, apoyándose de las herramientas necesarias.
Forma automatizada: Las pruebas automatizadas son ejecutadas por testers con habilidades
técnicas, y se apoyan en diversas herramientas para realizar scripts y así, ejecutar las pruebas
automáticamente.
Ejecución de la prueba:
Durante la ejecución de las pruebas, los conjuntos de pruebas se ejecutan luego del
despliegue de cambios en los ambientes de prueba como parte del desarrollo planificado
dentro de un sprint. La ejecución de pruebas incluye las siguientes actividades principales.
Para conocerlas, pasar con el mouse por encima de cada uno de los iconos que se
encuentran a continuación.
1°_ Registrar los identificadores y las versiones de los elementos u objetos de prueba, las
herramientas de prueba y los productos de prueba.
2°_ Ejecutar pruebas de forma manual o utilizando herramientas de ejecución de pruebas.
3°_ Comparar resultados reales con resultados esperados.
4°_ Analizar las anomalías para establecer sus causas probables.
5°_ Informar sobre los defectos en función de los fallos observados.
6°_ Registrar el resultado de la ejecución de la prueba.
7°_ Repetir las actividades de prueba, ya sea como resultado de una acción tomada para una
anomalía o como parte de la prueba planificada.
Las pruebas de humo se ejecutan para evaluar la estabilidad de las compilaciones de software
iniciales o desarrolladas recientemente.
Proceso de revisión
Dentro de las pruebas estáticas, una forma de detectar errores es mediante un proceso de
revisión.
● Revisiones formales: Tienen roles definidos, siguen un proceso establecido y deben ser
documentadas.
● Revisiones Informales: No siguen un proceso definido y no son documentadas
formalmente.
El grado de formalidad del proceso de revisión está relacionado con factores, como el modelo
del ciclo de vida del desarrollo del software, la madurez del proceso de desarrollo, la
complejidad del producto del trabajo que se debe revisar, cualquier requisito legal y/o la
necesidad de un rastro de auditoría.
Requisitos
Una de las revisiones que se realizan en las pruebas estáticas es examinar los requisitos del
software. Pero ¿sabemos qué son los requisitos? ¿Qué tipos de requisitos existen?
Requisitos funcionales
Definen lo que un sistema permite hacer desde el punto de vista del usuario. Estos requisitos
deben estar especificados de manera explícita. Por ejemplo: “El campo de monto acepta
únicamente valores numéricos con dos decimales” (pruebas funcionales y de sistema).
Requisitos no funcionales
Ambientes de trabajo
¿Qué es un ambiente?
Esto nos permitiría desarrollar aplicaciones de forma segura y con entornos diferenciados para
realizar la programación, realizar pruebas, compartir resultados con los clientes y permitirles
realizar pruebas y prácticas; y finalmente publicar una aplicación robusta y estable.
Cada uno de los ambientes son utilizados con un fin específico y presentan ciertas ventajas
sobre los otros en determinado momento del proceso de trabajo.
Niveles de ambientes
Las pruebas unitarias son generalmente pruebas automatizadas escritas y ejecutadas por
desarrolladores de software para garantizar que una sección de una aplicación —conocida como
la "unidad"— cumpla con su diseño y se comporte según lo previsto.
El proceso general para la creación de estos unit test consta de tres partes:
1. Acuerdo o criterio de aceptación donde se definen los requisitos que debe cumplir el
código principal.
2. Escritura del test el proceso de creación, donde se acumulan los resultados a analizar.
3. Confirmación se considera el momento en que comprobamos si los resultados
agrupados son correctos o incorrectos. Dependiendo del resultado, se valida y continúa,
o se repara, de forma que el error desaparezca (debug).
Una unidad puede ser casi cualquier parte del código que se quiera: una línea de código, un
método o una clase. En general, cuanto más pequeño, mejor. Las pruebas más pequeñas
brindan una vista mucho más granular de cómo se está desempeñando el código. También
existe el aspecto práctico de que, cuando se prueban unidades muy pequeñas, se pueden
ejecutar rápidamente.
Por ejemplo, para realizar la prueba de componente de código realizado en JavaScript se puede
crear un framework basado en las siguientes herramientas:
● Mocha (https://mochajs.org/api/index.html)
● Chai (https://www.chaijs.com/guide/)
npm
npm es el sistema de gestión de paquetes por defecto para Node.js. Ustedes dirán,
“¿Paquetes? ¿Es lo que usa Amazon para sus entregas?”.
Este se genera al iniciar un proyecto con el comando “npm init” previamente habiendo
descargado node.js.
Esta configuración contendrá información valiosa para el proyecto como por ejemplo:
● El autor
● El título del proyecto
● La licencia
● El repositorio
● Las dependencias
● Scripts
● Test
● Otros
En conclusión
Node.js se usa para ejecutar JavaScript del lado del servidor, el cual tiene un gestor de paquetes
llamado npm que cuenta con una comunidad gigante que sube constantemente sus paquetes de
código para compartir con otros y por medio de unos comandos, pueden usar esos paquetes de
código en sus proyectos.
Para Testing I, usaremos npm para instalar jest, framework que nos permitirá escribir pruebas
unitarias o de componentes.
Técnicas de prueba de caja blanca
Las técnicas de prueba de caja blanca, también conocidas como pruebas estructurales, se
basan en la estructura interna del objeto de prueba, es decir, que está fuertemente ligado al
código fuente.
Cuando se crean casos de prueba con este tipo de técnicas es aconsejable utilizar también las
técnicas de caja negra como partición de equivalencia y análisis de valores límites. De este
modo se conseguirán datos de prueba que maximicen la cobertura de prueba.
Las siguientes técnicas se utilizan con mayor frecuencia en el nivel de prueba de componentes.
Es aquella prueba en la que se escriben test cases suficientes para que cada decisión en el
programa se ejecute una vez con resultado verdadero y otra con el falso.
● Ejercita las decisiones en el código y prueba el código que se ejecuta basado en los
resultados de la decisión.
● Los casos de prueba siguen los flujos de control que se producen desde un punto de
decisión.
● En el caso de un IF se necesitan dos casos de prueba como mínimo, uno para el valor
VERDADERO y otro para el FALSO de la decisión.
● En el caso de un CASE se necesitan casos de prueba para todos los resultados
posibles, incluido el por defecto.
● Ayuda a encontrar defectos en el código que no fueron practicados por otras pruebas ya
que se deben recorrer todos los caminos de una decisión.
● Cuando se alcanza el 100% de cobertura de decisión, se ejecutan todos los resultados
de decisión. Esto incluye probar el resultado verdadero y también el resultado falso,
incluso cuando no hay una sentencia falsa explícita.
● Lograr una cobertura del 100% de decisión garantiza una cobertura del 100% de
sentencia, pero no al revés.
● La cobertura se mide como:
Entonces el testing back end nos garantiza que los datos contenidos en la base de datos de una
aplicación y su estructura satisfagan los requisitos del proyecto.
Testing de APIs
Hablando en un alto nivel, nuestro trabajo es entender cómo funciona la API, armar una buena
combinación de parámetros de entrada, ejecutar las pruebas contra la API, verificar el resultado
y reportar cualquier desviación en la funcionalidad esperada. Estas pruebas consisten en hacer
peticiones HTTP (get, post, put y delete) y luego verificar la respuesta.
Postman se puede utilizar para automatizar muchos tipos de pruebas, incluidas las unitarias, las
funcionales, de integración, de extremo a extremo, de regresión, las simuladas, etc.
A medida que los programas crecen, también aumenta el riesgo de rotura. Se pueden crear
programas más robustos y resistentes a errores aumentando la cobertura y la frecuencia de las
pruebas. Postman permite reutilizar sus conjuntos de pruebas para simplificar el trabajo de
forma más efectiva y productiva.
Postman Tests permite asegurarnos de que un API funciona como se esperaba. Nos permite
establecer que las integraciones entre los servicios funcionen de manera confiable y verificar
que los nuevos desarrollos no hayan roto ninguna funcionalidad existente. Nos ayuda a verificar
resultados, como el estado exitoso o fallido, la comparación de los resultados esperados, etc.
Esta herramienta nos brinda un conjunto de fragmentos de código javascript con algunas
pruebas por defecto, pero también somos libres de escribir nuestras propias pruebas utilizando
javascript.
● 200: «Todo está bien». Este es el código que se entrega cuando una página web o
recurso actúa exactamente como se espera.
● 201: «Creado». El servidor ha cumplido con la petición del navegador y, como resultado,
ha creado un nuevo recurso.
● 204: «Sin contenido». Este código significa que el servidor ha procesado con éxito la
solicitud, pero no va a devolver ningún contenido.
● 301: «El recurso solicitado ha sido trasladado permanentemente». Este código se
entrega cuando una página web o un recurso ha sido reemplazado permanentemente
por un recurso diferente.
● 302: «El recurso solicitado se ha movido, pero fue encontrado». Este código se utiliza
para indicar que el recurso solicitado se encontró, pero no en el lugar donde se
esperaba.
● 400: «Mala petición». El servidor no puede devolver una respuesta debido a un error del
cliente.
● 401: «No autorizado». Esto es devuelto por el servidor cuando el recurso de destino
carece de credenciales de autenticación válidas.
● 403: «El acceso a ese recurso está prohibido». Este código se devuelve cuando un
usuario intenta acceder a algo a que no tiene permiso para ver.
● 404: «No se encontró el recurso solicitado». Este código significa que el recurso
solicitado no existe y el servidor no sabe si alguna vez existió.
● 500: «Hubo un error en el servidor y la solicitud no pudo ser completada». Este es un
código genérico que simplemente significa «error interno del servidor». Algo salió mal en
el servidor y el recurso solicitado no fue entregado.
● 503: «El servidor no está disponible para manejar esta solicitud en este momento.»
Este código puede ser devuelto por un servidor sobrecargado que no puede manejar
solicitudes adicionales.
Patrones de diseño
Los patrones de diseño son soluciones probadas y documentadas a problemas comunes de
desarrollo de software. También son usados en la automatización de software.
Screenplay:
● Este patrón tiene un enfoque de desarrollo encaminado por el
comportamiento Behaviour Driven Development (BDD). Es una estrategia de
desarrollo que se enfoca en prevenir defectos en lugar de encontrarlos en un
ambiente controlado.
● Presenta un alto desacoplamiento de la interfaz de usuario.
● Propone trabajar en términos de tareas y no de interfaz de usuario.
● Cumple con los principios SOLID.
Page Object:
Los principios SOLID son guías, buenas prácticas, que pueden ser aplicadas en el desarrollo de
software para eliminar malos diseños. Provocan que el programador tenga que refactorizar el
código fuente hasta que sea legible y extensible. Es decir, que pueden ayudar a escribir un
mejor código: más limpio, mantenible y escalable.
Algunos de los objetivos a tener en cuenta estos principios para código son:
● Crear un software eficaz que cumpla con su cometido y que sea robusto y
estable.
● Escribir un código limpio y flexible ante los cambios: que se pueda modificar
fácilmente según necesidad, que sea reutilizable y mantenible.
● Permitir escalabilidad: que acepte ser ampliado con nuevas funcionalidades
de manera ágil.
Las páginas web se representan como clases y los diversos elementos de la página se definen
como variables en la clase. Todas las interacciones de usuario posibles se pueden implementar
como métodos en la clase. Estas interacciones generalmente se dividen en acciones y
validaciones. Las acciones reflejarán aquellos pasos que el usuario debe realizar dentro del sitio
web o aplicación que se encuentra bajo prueba. En cambio, las validaciones serán métodos que
reflejen la confirmación de que el sistema se comporta como se espera luego de una acción
específica.
Selenium WebDriver
Selenium WebDriver es uno de los frameworks más importantes con los que se generan
pruebas automatizadas.
Permite a los usuarios simular interacciones realizadas por los usuarios finales: como insertar
texto en los campos, seleccionar valores de menús desplegables y casillas de verificación, y
mucho más. Además también permite realizar validaciones en el comportamiento de cualquier
componente. Esto nos sirve para verificar el comportamiento esperado que se encuentra
detallado en los casos de prueba diseñados y listos para ser automatizados.
WebDriver utiliza las API de automatización del navegador proporcionadas por los
desarrolladores de los navegadores para controlarlo y ejecutar pruebas. Esto es como si un
usuario real estuviera manipulándolo con la principal diferencia en la velocidad de ejecución,
WebDriver es considerablemente más veloz que una ejecución manual.
Selenium es compatible con muchos lenguajes de programación como Java, C #, Python, etc., y
con múltiples navegadores como Google Chrome, Firefox, Intebrowser driverSelenium
Webdriver se enmarca en tres componentes principales:
● Los tests a ejecutarse (escritos con un lenguaje a elección entre varios como Java, C#,
Node JS, etc);“Client API”.
● Un servidor standalone en donde se ejecutarán los casos de prueba.
● Un browser driver que conectará los scripts generados con la client API con el browser a
través del Selenium Server.
Gráficamente puede verse así:
Es por eso que antes de que los usuarios tengan acceso a cualquier software o función nueva,
debemos ponerlo a prueba a fondo: probar e intentar romperlo. Debemos asegurarnos de que
todo lo que hagan los usuarios, responda según lo diseñado. En resumen, necesitamos un plan
de prueba o también conocido como test plan.
Un plan de prueba es una de las partes más importantes de cualquier proceso de desarrollo de
software. Describe cómo se asegurará de que nuestro producto o función haga lo que se supone
que debe hacer y no se rompa cuando los usuarios más lo necesiten.
5 pasos para crear un Test Plan:
Decidir qué probar y documentar en nuestra estrategia de prueba son las partes más
críticas del plan de prueba. Lo que se incluye en el alcance de las pruebas dependerá de
una serie de factores más allá del producto o la función. Necesitamos profundizar y
pensar en:
A medida que definimos cada prueba diferente que se va a ejecutar, necesitamos saber
cuándo está terminada. Esto implica definir los criterios de aprobación y reprobación para
cada prueba específica, así como algunos ítems mencionados, como los criterios de
salida y suspensión.
Los resultados de nuestro plan de prueba dependen tanto de la función que esté
probando como del entorno en el que se esté probando. Como parte del alcance,
debemos determinar qué combinaciones de hardware, software, sistema operativo y
dispositivo deseamos utilizar.
Una vez que nuestro plan de prueba está en su lugar, hay un proceso específico que
debemos seguir. Pensemos en esto como el ciclo de vida de las pruebas de software
(STLC) que vimos al comienzo de la materia.
Técnicas de prueba
1. Categorías de técnicas de prueba
Agenda 2. Técnicas de caja negra
3. Técnicas basadas en la experiencia
Técnicas de prueba
Categorías de técnicas
1 de prueba
Técnicas de prueba
El objetivo de una técnica de prueba
es ayudar a identificar las
condiciones, los casos y los datos
de prueba.
Técnicas de prueba
Elección de una técnica de prueba
La elección de la técnica de prueba a utilizar depende de los siguientes
factores:
● Tipo y complejidad del componente o sistema
● Estándares de regulación
● Requisitos del cliente o contractuales
● Clases y niveles de riesgo
● Objetivo de la prueba
● Documentación disponible
● Conocimientos y competencias del probador
● Modelo del ciclo de vida del software
● Tiempo y presupuesto
Técnicas de prueba
Clasificación de las técnicas de prueba
Técnicas de caja negra:
Se basan en el comportamiento extraído del análisis de los documentos que
son base de prueba (documentos de requisitos formales, casos de uso,
historias de usuario, etc). Son aplicables tanto para pruebas funcionales como
no funcionales. Se concentran en las entradas y salidas sin tener en cuenta
la estructura interna.
Técnicas de prueba
2 Técnicas de caja negra
Técnicas de prueba
Partición de equivalencia
En esta técnica se dividen los datos en particiones conocidas como clases de equivalencia donde
cada miembro de estas clases o particiones es procesado de la misma manera.
Las características de esta técnica son:
● La “partición de equivalencia válida” contiene valores que son aceptados por el componente
o sistema.
● La “partición de equivalencia no válida” contiene valores que son rechazados por el
componente o sistema.
● Se pueden dividir las particiones en subparticiones.
● Cada valor pertenece a solo una partición de equivalencia.
● Las particiones de equivalencia no válidas deben probarse en forma individual para evitar el
enmascaramiento de fallos.
Técnicas de prueba
Análisis de valores límites
Partición de
Es una extensión de la técnica de partición de equivalencia equivalencia
válida
que solo se puede usar cuando la partición está ordenada, Valor límite Valor límite
y consiste en datos numéricos o secuenciales. mínimo máximo
● Se deben identificar los valores límites mínimo y máximo (o valores inicial y final).
● Se pueden utilizar 2 o 3 valores límites.
● Para 2 valores límites se toma el valor que marca el límite (como valor que corresponde a la
partición válida), y el valor anterior o posterior que corresponda a la partición de
equivalencia inválida.
● Para 3 valores límites se toma el valor que marca el límite, un valor anterior y otro posterior
a ese límite.
● La cobertura se mide de la siguiente manera: Cobertura = Valores límites probados
Valores límites identificados
Técnicas de prueba
Tabla de decisión
Esta técnica se utiliza para pruebas combinatorias,
formadas por reglas de negocio complejas que un sistema
debe implementar. Las características de esta técnica son:
● Se deben identificar las condiciones (entradas) y las acciones resultantes (salidas). Estas
conforman las filas de la tabla.
● Las columnas de la tabla corresponden a reglas de decisión. Cada columna forma una
combinación única de condiciones y la ejecución de acciones asociadas a esa regla.
● Los valores de las condiciones y acciones pueden ser valores booleanos, discretos,
numéricos o intervalos de números.
● Ayuda a identificar todas las combinaciones importantes de condiciones y a encontrar
cualquier desfase en los requisitos. Cobertura = Número de reglas de decisión probadas
● La cobertura se mide de la siguiente manera: Número de reglas de decisión totales
Técnicas de prueba
Transición de estados
Un diagrama de transición de estado muestra los posibles estados del software, así como la forma en que
el software entra, sale y realiza las transiciones entre estados. Las características de esta técnica son:
● Una tabla de transición de estado muestra todas las transiciones válidas y las transiciones
potencialmente inválidas entre estados, así como los eventos, las condiciones de guarda y
las acciones resultantes para las transiciones válidas.
● Los diagramas de transición de estado, normalmente, sólo muestran las transiciones
válidas y excluyen las transiciones no válidas.
● La prueba de transición de estado se utiliza para aplicaciones basadas en menús y es
extensamente utilizada en la industria del software embebido. La técnica también es
adecuada para modelar un escenario de negocio con estados específicos o para probar la
navegación en pantalla.
Cobertura = número de estados o transiciones identificados probados
● La cobertura se mide de la siguiente manera: número total de estados o transiciones identificados en el objeto de prueba
Técnicas de prueba
Técnicas basadas en la
3 experiencia
Técnicas de prueba
Predicción de errores
Esta técnica se utiliza para anticipar la ocurrencia de
equivocaciones, defectos y fallos basados en el
conocimiento del probador.
En base a esa lista se diseñan pruebas que expongan esos fallos y defectos.
Técnicas de prueba
Prueba exploratoria
En esta técnica se diseñan, ejecutan, registran y
evalúan de forma dinámica pruebas informales durante
la ejecución de la prueba.
Los resultados de estas pruebas se utilizan para
aprender más sobre el funcionamiento del componente
o sistema.
Generalmente se utilizan para complementar otras
técnicas formales o cuando las especificaciones son
escasas, inadecuadas o con restricciones de tiempo.
Técnicas de prueba
Prueba basada en listas de comprobación
En esta técnica se diseñan, implementan y ejecutan casos
de prueba que cubren las condiciones que se encuentran en
una lista de comprobación definida.
Se crean basadas en la experiencia y conocimiento de lo que
el probador cree que es importante para el usuario y se
utilizan debido a la falta de casos de prueba detallados.
Durante la ejecución puede haber cierta variabilidad,
dependiendo de quién ejecuta la prueba y condiciones del
contexto. Esto da lugar a una mayor cobertura.
Técnicas de prueba
Técnicas de prueba
Frameworks de
automatización
de pruebas
1. Generalidades
Agenda 2. Tipos de frameworks
Framework de prueba
basado en datos
2. Características de un buen
Plan de pruebas
Test Plan
¿Qué es un Plan
1 de pruebas y cuál
es su utilidad?
Test Plan
Plan de pruebas
Test Plan
Pero entonces, ¿cuáles son los objetivos?
Un plan de prueba garantiza que el software:
Test Plan
Pero entonces, ¿cuáles son los objetivos?
Test Plan
Pero entonces, ¿cuáles son los objetivos?
Test Plan
Pero entonces, ¿cuáles son los objetivos?
Se puede instalar y
ejecutar en todos los
entornos previstos.
Test Plan
Pero entonces, ¿cuáles son los objetivos?
Test Plan
Características
2 de un buen
Plan de pruebas
Test Plan
¿Qué debería incluirse en la
plantilla del plan de prueba?
Cada producto y función tendrá sus propios
criterios, estrategias y necesidades de
prueba específicos, además, el objetivo de la
prueba cambiará la forma en que lo aborda.
Test Plan
¿Qué debería incluirse en la
plantilla del plan de prueba?
Entonces, ¿qué debería (o podría) incluir en mi plan de prueba?
En términos generales, hay algunas áreas principales que son convenientes
incluir y que actuarán como la base del documento:
Test Plan
1. Cobertura: ¿Qué se está probando exactamente?
Test Plan
2. Métodos: ¿Cómo se van a realizar estas pruebas?
A continuación, se debe explicar tan detalladamente
como sea posible: ¿cuál es la estrategia de prueba?
Test Plan
2. Métodos: ¿Cómo se van a realizar estas pruebas?
También se necesita saber cuándo la prueba fue exitosa, es decir:
¿cuáles son los criterios de aprobación/reprobación para cada prueba?
Estos criterios incluyen:
● Criterio de salida: ¿cuándo está bien dejar de probar una función y asumir que la
función tiene éxito en hacer lo que se propuso hacer?
● Criterios de suspensión: ¿cuándo debería pausar una prueba? ¿Existe un umbral de
errores en el que debería dejar de realizar pruebas y empezar a buscar soluciones?
¿Cuáles son los pasos para cerrarlo y documentar lo que se ha hecho hasta ahora?
● Requisitos de reanudación: ¿cómo se sabe cuándo reanudar una prueba en
pausa? ¿Cuáles son los pasos para revisar lo que se ha hecho y retomar?
Test Plan
2. Métodos: ¿Cómo se van a realizar estas pruebas?
Por otro lado, es una buena idea en este punto enumerar las suposiciones y
riesgos.
En otras palabras: ¿qué se supone que va a suceder y cuáles son algunos de
los riesgos durante las pruebas?
Test Plan
3. Responsabilidades: ¿Cuáles
son los resultados deseados?
¿Cuáles son los entregables de prueba
requeridos?
Esto significa los datos que se desean
recopilar, cómo agruparlos en los informes y
los problemas y tareas que se devolverán al
equipo de desarrollo.
Para asegurarse de que no se pierda nada,
cada entrega de prueba debe asignarse a
una persona específica del equipo en una
sección sobre roles y responsabilidades.
Test Plan
Test Plan
Tipos de prueba
Un tipo de prueba es un grupo de actividades de pruebas destinadas a probar las características específicas de un sistema de software,
o de una parte de un sistema, basados en objetivos de pruebas específicas.
1
1. Prueba Funcional 2. Prueba No Funcional 3. Prueba Estructurales 4. Prueba Asociada al Cambio
Definición La prueba funcional de La prueba no funcional Éstas pruebas están Existen 2 tipos de prueba
un sistema incluye prueba “cómo de bien” se basadas en la estructura relacionadas al cambio:
pruebas que evalúan las comporta el sistema. interna del sistema o en ● Prueba de confirmación:
funciones que el sistema su implementación. La Una vez corregido un
debe realizar. Las estructura interna puede defecto, el software se
funciones describen qué incluir código, puede probar con todos
hace el sistema. arquitectura, flujos de los casos de prueba que
trabajo y/o flujos de fallaron debido al defecto,
datos dentro del sistema que se deben volver a
ejecutar en la nueva
versión de software. El
objetivo de una prueba
de confirmación es
confirmar que el defecto
original se ha solucionado
de forma satisfactoria.
● Prueba de regresión: Es
posible que un cambio
hecho en una parte del
código, ya sea una
corrección u otro tipo de
cambio, pueda afectar
accidentalmente el
comportamiento de otras
2
partes del código, ya sea
dentro del mismo
componente, en otros
componentes del mismo
sistema, o incluso en
otros sistemas. La prueba
de regresión implica la
realización de pruebas
para detectar estos
efectos secundarios no
deseados.
Implementa La prueba funcional El diseño y ejecución de la El diseño y la ejecución Especialmente en los ciclos de
ción observa el prueba no funcional puede de este tipo de pruebas vida de desarrollo iterativos e
comportamiento del implicar competencias y pueden implicar incrementales (por ejemplo,
software. conocimientos especiales, competencias o Agile), las nuevas características,
como el conocimiento de conocimientos los cambios en las características
las debilidades inherentes especiales, como la existentes y la refactorización del
a un diseño o tecnología forma en que se código dan como resultado
-por ejemplo: construye el código, cambios frecuentes en el código,
vulnerabilidades de cómo se almacenan los lo que también requiere pruebas
seguridad asociadas con datos, y cómo utilizar las asociadas al cambio.
determinados lenguajes de herramientas de
programación-. cobertura e interpretar
correctamente sus
resultados.
3
Niveles de Se pueden realizar Se pueden realizar pruebas Se puede realizar en el La prueba de confirmación y la
Prueba pruebas funcionales en no funcionales en todos los nivel de componente y de prueba de regresión se realizan
todos los niveles de niveles de prueba integración. en todos los niveles de prueba
prueba.
Cobertura La cobertura funcional La cobertura no funcional La cobertura estructural Los juegos de prueba de
es la medida en que es la medida en que algún es la medida en que regresión se ejecutan muchas
algún tipo de elemento tipo de elemento no algún tipo de elemento veces y generalmente
funcional ha sido funcional ha sido estructural ha sido evolucionan lentamente, por lo
practicado por pruebas, practicado por pruebas, y practicado mediante que la prueba de regresión es un
y se expresa como un se expresa como un pruebas, y se expresa fuerte candidato para la
porcentaje del tipo o porcentaje del tipo o tipos como un porcentaje del automatización.
tipos de elementos de elementos cubiertos. tipo de elemento La cobertura crece a medida que
cubiertos. cubierto. se agregan más funcionalidades
al sistema por lo tanto más
pruebas de regresión
4
Nuestro primer
test unitario
con JavaScript
1. Configurar el framework
Índice 2. Nuestro primer test
3. Agrupar unit tests
Configurar
1 el Framework
Unit Testing
Framework para JavaScript
Para JavaScript vamos a utilizar el framework Jest. Si queremos
configurarlo, debemos instalar:
2. Node.js (https://nodejs.org).
Unit Testing
3. JEST (https://jestjs.io/)
Unit Testing
Nuestro
2 primer test
Unit Testing
Crear nuestro primer unit test
Unit Testing
Configurar Jest como ejecutor de las pruebas:
2
1. Ir al archivo package.json.
2. En la parte de scripts/test debemos
reemplazar “echo “Error: no test
specified” && exit 1” por “jest”. De esta
forma indicamos que vamos a correr test
con nuestro framework Jest.
Unit Testing
2
Unit Testing
Crear la carpeta y archivo de prueba:
3
1. Crear la carpeta __test__ donde se
encontrarán todos los archivos de prueba.
2. Crear el archivo de prueba
NombreArchivo.test.js. Para que Jest
reconozca los archivos de prueba deben
terminar en .test.js. En este caso nuestro
archivo se llamará util.test.js.
Unit Testing
3
Unit Testing
Importar el código a probar: debemos importar la sección del código que
4 queremos probar. En este caso vamos a probar el que se encuentra en el
archivo util.js, ya que ahí se encuentra la lógica de nuestro programa.
Unit Testing
Escribir el código del unit test. Las funciones claves a utilizar son:
5
● test() o it(): donde se define el test. Se debe ingresar un nombre representativo.
● expect(): lo que se desea verificar es parte de la assertion library. En el ejemplo se
quiere verificar la salida que se genera al presionar el botón Agregar Usuario.
Unit Testing
Para ejecutar el test,
6
primero debemos abrir la
terminal y, luego, ejecutar
el comando npm test.
Unit Testing
Se puede configurar que los tests
7 se ejecuten cada vez que se
genera un cambio en el código.
Para ello, debemos ir al archivo
package.json e ingresar jest
--watchAll en el nodo “test” que
está dentro de “scripts”.
Unit Testing
Luego, ejecutar el siguiente
comando: npm test.
Allí, se debe realizar alguna
modificación en el código del
programa (util.js) y, por último, al
momento de guardar el archivo
modificado, se ejecutarán los tests.
Unit Testing
Agrupar
3 unit tests
Unit Testing
Agrupar unit tests
8 Para generar
agrupaciones de unit
tests se utiliza la
siguiente palabra clave:
describe()
Esto será útil para
organizar las pruebas de
acuerdo a las
funcionalidades a probar.
Unit Testing