El testing es uno de los procesos de la ingeniería de software que permite identificar defectos en el software En este post podes encontrar los fundamentos para poder realizalo de manera practica en cualquier proyecto de desarrollo.
El proceso de testing es la realización de pruebas tecnicas con el objetivo de poder conocer cual es la calidad de los artefactos o piezas de software. Estos procesos son una disciplina de la ingenieria de software y nos permiten realizar la validación y verificación de un software.
La validación y la verificación muchas veces se lo asocia a terminos similares, pero existen diferencias entre los mismos:
🔍Validaciòn: ¿estamos construyendo el producto correcto? Esta pregunta la realizamos para conocer si el producto satisface los requerimientos del usuario.
🔍Verificación: ¿estamos construyendo el producto correctamente? Esta pregunta la realizarmos para conocer si estamos cumpliendo con los requisitos funcionales y no funcionales que se especificaron.
Es importante destacar que a pesar de ejecutar un plan de testing no es posible demostrar que el software esta libre de defectos. Pero realizando el mismo si podemos asegurar que se van a eliminar gran parte de ellos y mitigar los riesgos que pueden producir los mismos en producción.
Un software es un recurso que permite a la industias poder gestionar, controlar y automatizar sus procesos. La industria 4.0 nos impulsa a cambios, en el cual las organizaciones utilizan sistemas para la produccion y la gestión de sus recursos. En los ultimos años los sistemas utilizados se basan en la aplicación de tecnologías y servicios tales como: machine learning, big data, Cloud Computing y IOT.
Actualmente los sistemas estan en cada una de las industrias, como se pueden ver en la siguiente imagen:
Actualmente la mayoria de las industrias utilizan sistemas para su producción, debido a esto la calidad del software en la automatización industrial es un factor clave y el mismo debe ser abordado para evitar tener daños o perdidas economicas para las empresas.
Según la definición que se encuentra en el Glosario estándar de terminología de ingeniería de software de IEEE:
“La calidad del softare es el grado en que un sistema, componente o proceso cumple con los requisitos especificados.”
Muchas veces cuando hablamos de calidad de software y testing lo relacionamos con terminos tales como error, defectos y fallos. Aunque dichos terminos nos parecen similares es necesario conocer que cada uno de ellos tiene un significado diferente. Por lo cual podriamos definirlo como:
Un Error
de un desarrollador 👤, causa un Defecto
en el software 💻, lo cual provoca un Fallo
en el momento en el que la prueba se ejecuta🔀.
Otro termino que tenemos que definir son las pruebas, y este termino lo podemos definir de la siguiente manera:
Las pruebas de software son una estrategia de gestión del riesgo, en las mismas se evalúan si se cumplieron los requisitos.
Las pruebas tambien las podemos definir como un el proceso por el cual se verifica si un componente de software con el fin de detectar la diferencia entre las condiciones existentes y las requeridas.
International Software Testing Qualifications Board (ISTQB) es el comité Internacional de Certificaciones de Pruebas de Software. Este comite desarrollo los 7 principios básicos de la ingeniería de software, los cuales son:
La unica manera de poder demostrar que NO hay defectos en un software es realizando testing. Muchas veces durante el testing descubrimos defectos que nunca pensamos que podrian existir o ya estaban supuestamente resueltos.
Es imposible realizar todas las combinaciónes posibles para hacer pruebas, debido a esto es importante asumir un nivel de riesgo para poder priorizar las pruebas. Este punto es importante evaluarlo cuando se realizar la estrategia del plan de pruebas.
Es importante poder detectar las incidencias en las fases más tempranas de desarrollo. “Un defecto es más costoso de arreglar, cuanto más tarde es hallado.”
Image: Best Strategies for Managing Bugs and Feature Requests 2
Este principio significa que muchas veces los defectos pueden concentrarse en un determinado modulo del producto.
Esto nos permite concentrar las pruebas en estos modulos que son claves para el release, por lo cual es importante conocer cual son estos modulos en el momento que se diseña el plan de pruebas.
Si siempre realizamos los mismos test no vamos a encontrar nuevos defectos, por este motivo es importante realizar una actualización de las pruebas a efectuar.
Este principio refiere a la importancia de mantener actualizado el plan de pruebas ya que el software siempre esta en constante evolución.
Image: QA Automation and the Pesticide Paradox
Si bien pueden haber software similares, la estrategia de testing se debe adaptar al contexto en el cual ese software se va utilizar.
Si un conjunto de pruebas tiene ausencia de error no significa que el software no los tenga, sino lo que significa es que esas pruebas en un determinado contexto no los detectaron.
Las pruebas funcionales
tienen como objetivo comprobar que los sistemas desarrollados funcionen en base a las especificaciones funcionales y requisitos definidos.
A continuación se detallan diferentes tipos de pruebas que se pueden realizar.
La primeras pruebas realizadas son denominadas “pruebas unitarias”
en las cuales se realiza la verificación de la funcionalidad de los componentes de software de manera aislada.
Son las pruebas que deben hacer por medio del testeo de todos los componentes en conjunto, por lo cual a partir de las mimas se pueden conocer cómo se integran los componentes en un sistema.
Existen diferentes enfoques para las pruebas de integración, tales como:
Top - Down:
Las pruebas se realiza partiendo del componente principal en jerarquia, y posteriormente se van incorporando hacia abajo por la jerarquía de control.
Bottom down:
Las pruebas se realiza partiendo primero de los componentes de más bajo nive ly se crean componentes para simular a los componentes que los invocan.
Integración Funcional:
Las pruebas parten de los componentes necesarios para poder ver el funcionamiento de una función elegida del sistema.
Big bang:
Todos los componentes o sistemas están integrados simultáneamente, teniendo como la principal desventaja: es difícil rastrear la causa de las fallas.
Incremental:
Las pruebas incrementales se realizan teniendo en cuenta que los componentes se prueban uno o algunos a la vez, y se van agregando el restante de los componentes hasta que esten todos integrados y probados.
Estas pruebas se realiza en función de los riesgos y especificaciones de los requisitos, procesos de negocio, casos de uso, historias de usuarios u otras descripciones realizadas. Las mismas tienen como objetivo probar el sistema en su conjunto y verificar si se cumplen todas las especificaciones funcionales y tecnicos.
Este es el último nivel, en el cual el cliente valida si el desarrollo realizado cumple con lo solicitado y satisface las necesidades documentadas. Pero existen algunas variantes sobre este tipo de pruebas, tales como:
✅Aceptación de usuarios: Las realizan los usuarios y gestores del aplicativo. Su objetivo es probar su funcionalidad.
✅Aceptación operacional: En estas pruebas se comprueba por ejemplo: la facilidad de instalación, la seguridad, la recuperación de fallos, las tareas de mantenimiento y se realiza una comprobación de las vulnerabilidades de seguridad.
✅Aceptación contractual: Se controla los criterios que se definieron en el contrato, el cumplimiento con estándares legales y de seguridad.
✅Alpha & beta: Muchas veces las pruebas de aceptación del usuario no son posible ya que un software puede ser desarrollado para su posterior venta. En este caso existen dos tipos de pruebas:
Son las pruebas que permiten ver el rendimiento, carga y estrés. Aquí se evalúa como se comporta un sistema bajo una carga creciente y se documenta los tiempo de respuestas. Esta prueba intenta encontrar la falla ante una carga que excede lo permitido por el sistema procesar.
Las pruebas de seguridad evalúan la CIA TRIAD (confidencialidad, integridad y disponibilidad) del software. Se realizan diferentes pruebas para evitar cualquier acceso no autorizado al código del software.
La parte de prueba de usabilidad de una metodología de prueba analiza el aspecto de usabilidad del software para el usuario final . La facilidad con la que un usuario puede acceder al producto constituye el principal punto de prueba.
La usabilidad de se define como la facilidad de las personas a interactuar con un software con el fin de alcanzar un objetivo con el mínimo esfuerzo requerido.
La prueba de compatibilidad es una metodología que permite la prueba del software en diferentes sistemas operativos, plataformas de hardware, navegadores web, dispositivos móviles y otros software. Las pruebas deben validar el correcto funcionamiento como se espera en todas las diferentes combinaciones de hardware y software especificadas.
Un plan de prueba
es un documento detallado que describe la estrategia de prueba, los objetivos, los recursos necesarios, el cronograma y los criterios de éxito una pieza de software específica.
El objetivo principal, por supuesto, es descubrir defectos
que pueda hacer que el software no actúe como se esperaba o que brinde una mala experiencia a sus usuarios.
📍 Entender cómo se realizará el proceso de pruebas y cómo se controlan o mitigan los riesgos.
⌛Permite que el resto del equipo del proyecto pueda conocer cuáles son el alcance de las pruebas y el tiempo que se desarrollaran las mismas.
👥 Definir cuales son las funciones y responsabilidades de cada miembro del equipo, también proporciona cuales son los requisitos que son esenciales para llevar a cabo el proceso de prueba.
📆 El plan de prueba permite proporcionar un cronograma para las actividades de prueba, definiendo una estimación aproximada del tiempo.
📣La planificación permite una mejor comunicación con otros miembros del equipo del proyecto y otras partes interesadas
✔️Asegurar la calidad del entregable a realizar al cliente.
El plan de pruebas debe poder respondernos tres preguntas:
⚒️¿Que vamos a testear?
Esta pregunta refiere a definir cual es el objetivo, alcance y el cronograma de las pruebas a realizar.
🔍¿Como vamos a realizarlo?
Esta pregunta refiere a explicar cual es la estrategia del plan de pruebas. Algunas preguntas que nos pueden ayudar de guia pueden ser las siguientes:
¿ Como es el proceso que se va realizar para hacer pruebas ?
¿ Cuales son las metricas que se van a recopilar y analizar ?
¿ Cuales son las configuraciones a realizar ?
¿ Hay requisitos especiales o procedimientos a tener en cuenta ?
¿ Cuales son los criterios de salida, suspension y reanudación?
💡¿Cuales son los resultados deseados?
Esta pregunta refiere a conocer cual o cuales son los entregables que se deben generar.
A continuación se detalla cuales son los conceptos basicos que deberiamos tener para realizar un plan de pruebas y un template que puede ser utilizado para desarrollar un plan de prueba.
Concepto | Descripción |
---|---|
1. | iD Plan de prueba: Identifica de forma única el plan de prueba y puede incluir el número de versión. |
2. | Introducción: Establece objetivos, alcance, metas, recursos y restricciones presupuestarias. |
3. | Elementos de prueba: Enumera los sistemas y subsistemas que se van a probar. |
4. | Alcance: Todas las características y funcionalidades que se probarán se enumeran aquí. |
5. | Fuera del alcance: Enumera cuales son las características que no deben testear. |
6. | Criterio de aceptación: Ver cual es el criterio de éxito. |
7. | Calendario: Se enumeran los detalles sobre cuándo se realizarán las actividades de pruebas. |
8. | Criterio de suspensión: Cuales son los criterios por los que se puede suspender las pruebas. |
9. | Entregables: Incluye casos de prueba, datos de muestra, informe de prueba, registro de problemas. |
10. | Tarea de pruebas: Describe las dependencias entre las tareas y los recursos necesario. |
11. | Ambientes: Enumera los requisitos de prueba de software, hardware u otros. |
12. | Responsabilidades: Enumera las funciones y responsabilidades asignadas al equipo de pruebas. |
13. | Recursos: Describe las necesidades, dedicación en tiempo y conocimientos necesarios del grupo de testing |
14. | Riesgos: Se enumeran los riesgos generales del proyecto en lo que respecta a las pruebas. |
Los casos de pruebas
o test case
es un conjunto de condiciones previas (requisitos previos), procedimientos (entradas/acciones) y condiciones posteriores (resultados esperados) que un evaluador utiliza para determinar si un sistema bajo prueba satisface los requisitos o funciona correctamente.3
Estos casos deben estar documentados y algunos conceptos que se deberian dejar documentado son los siguientes:
Concepto | Descripción |
---|---|
1. | iD Caso de prueba: Número de identificación de caso de prueba único. |
2. | Requisito Previo: Condiciones que deben cumplirse antes que pueda ejecutarse el caso de prueba. |
3. | Pasos de prueba: Pasos detallados para la ejecución del caso de prueba, la misma debe contener: acción, resultado esperado y datos de entrada. |
4. | Resultados esperados: Cual es el ouput que debería generarse cuando se ejecuta los pasos de pruebas anteriores. |
5. | Resultados reales: Cual es el output que finalmente se generó después de ejecutar los pasos de pruebas anteriores. |
6. | Resultados Final: Definir si pasa o no pasa. |
7. | Comentarios: Agregar información útil tal como capturas de pantallas y descripciones. |
8. | Prioridad: Definir una escala de la prioridad que se le asigna a esta prueba (alto, media, baja o no establecida. |
9. | Vencimiento: Fecha límite en la que debe realizarse esta prueba. |
10. | Modulo: Cual es el modulo o componente sobre el que se va realizar la prueba. |
11. | Tipo: Tipo de prueba que se va realizar la misma puede ser por ejemplo: usabilidad, seguridad, funcionalidad, integración, aceptación, performance, exploratorio, etc. |
12. | Responsable: Persona que realiza la prueba. |
RBT o Pruebas basadas en riesgos (Risk-based testing) son evaluaciones que se realizan para planificar todas las pruebas y tienen las siguientes caracteristcas:
Este tipo de enfoque establece que el esfuerzo y la priorizacion de las pruebas se va a basar proporcionalmente al nivel de riesgo.
Los riesgos más importantes se prueban lo más pronto posible teniendo en cuenta de que se pueda realizar y tener todos los componentes entregados para sus pruebas.
Una de las maneras de poder clasificar los riesgos es utilizando la siguiente matriz.
El siguiente grafico define la clasificación de las pruebas de testing y realiza una clasificación en dos grupos denominado estatico
y dinamico
.
El testing estatico son aquellas técnicas que se utilizan para detectar defectos sin ejecutar código.
Dentro de esta técnica tenemos el examen de artefactos de software para buscar errores tales como características faltantes, requisitos ambiguos o fallas de diseño.
Realizar estas tecnicas trae como beneficio el ahorro de tiempo en fases posteriores del desarrollo, debido a que permite esto permite disminuir los costos .
El análisis dinámico requiere la ejecución del código y permite observar el funcionamiento del software y comparar los resultados.
El testing funcional tambien denominado "caja negra"
esta dentro del analisis dinamico, y como anteriormente las definicmos son las pruebas que permiten comprobar si los componentes desarrollados cumplen con las funcionalidades documentadas en requisito funcionales.
Son las pruebas no funcionales que permiten medir las características de los sistemas, tales como tiempos de respuesta para las pruebas de rendimiento. Estas pruebas nos permiten conocer si existe algún riesgo o acción no esperada en un entorno productivo.
El testing estructural tambien denominado "caja blanca"
es la prueba que valida el funcionamiento interno y la estructura de una pieza de software.
Este tipo de testing se basa en el diseño interno y la implementación del software.
El testing basado en la experiencia son pruebas que derivan de las habilidades y conocimiento que posee el tester, este tipo de pruebas permite que bajo la experiencia de la persona se pueda predecir cuales son los errores que pueden encontrarse.
El proceso para realizar este tipo de pruebas es poder realizar una lista con los posibles defectos y a partir de los esta lista poder diseñar las pruebas.
Estas pruebas pueden ser:
* Pruebas intuitivas: están pruebas estan basadas en solo en la experiencia previa.
* Pruebas exploratorias: estas pruebas permiten explorar posibles errores basado en el conocimiento previo que tienen con sistemas o funcionalidades similares.
Esta técnica de prueba es basada en defectos, y los casos de prueba se diseñan a partir de una categoría de defecto específica conocida como taxonomía de defectos.
Las taxonomías de defectos son listas categorizadas de defectos, las mismas contienen datos sobre tipos de defectos, causas raíz y otros datos relacionados con defectos.
Algunos ejemplos pueden ser:
* 🔍Largo de los input no esta validado
* 🔍Caracteres especiales no fueron validados
* 🔍Fechas inválidas no fueron alertadas
* 🔍URLs invalidas.
Las pruebas de regresión o regression testing se utilizan para validar si la aplicación existente todavía funciona como se esperaba después de haber sido actualizada o modificada.
Estas pruebas son fundamentales cuando se realiza una implementación de nuevas piezas de software y debido a esto es necesario conocer si algo que anteriormente funcionaba, continua funcionando si fallas despues de haber implmentado un nuevo release de la aplicación.
Este tipo de pruebas se pueden realizar de forma manual siguiendo el caso de prueba, aunque debido a que estas pruebas suelen ser repetitivas puede realizarse la atuomatizacion de las mismas .
La automatización de pruebas consiste en el uso de software para ejecutar pruebas. Por lo cual La automatización de pruebas permite incluir pruebas repetitivas.
Los beneficios de automatizar pruebas son:
Estas pruebas se suelen desarrollar en distintos lenguajes de programación como java, c# , PHP o python y se utiliza un framework denominado Selenium
.
Selenium es un framework de automatización web de codigo abierto que te permite ejecutar test en navegadores web. A continuación se va a desarrollar un ejemplo con Python.
Algunas ventajas que tenemos al utilzar Selenium:
Selenium se puede utilizar para:
Aceptación / pruebas funcionales
Reproducir errores
Pruebas de regresión
Vamos a instalar el paquete de Selenium
!pip install selenium
Para ejecutar Selenium necesitamos instalar el ejecutable denominado chromedriver
, este ejecutable va a variar en base al sistema operativo y la version de chrome que tengamos instalado, en el siguiente link podra encontrar cual es la version para el sistema operativo en el cual va desarrollar el script de python.
Para ejecutar la prueba es necesario correr el siguiente codigo que va abrir chome y va a navegar a la pagina google, posteriormente es necesario poder identificar los elementos de la pagina que se quieren analizar.
from selenium import webdriver
# Ubicación del ejecutable
= webdriver.Chrome("/chromedriver")
driver
# Ejecutamos una pagina de inicio
"https://google.com") driver.get(
Selenium Webdriver API admite múltiples formas de identificar elemento
Identificación | Sintaxis |
---|---|
ID | driver.find_element_by_id() |
nombre | driver.find_element_by_name() |
ClassName | driver.find_element_by_class_name() |
TagName | driver.find_element_by_tag_name() |
XPath | driver.find_element_by_xpath() |
CSS Selector | driver.find_element_by_class_name() |
Qué es XPath?
XPath se define como XML path (Ruta XML). Esta estcutructar permite encontrar un elemento de la pagina web.
La sintaxis estándar para crear XPath es:
Xpath=//nombreEtiqueta[@atributo='valor']
//: Selecciona el nodo actual
Nombre Etiqueta: Nombre de la etiqueta del nodo en particular
@: Seleccionar atributo.
atributo: nombre de atributo del nodo.
valor: valor del atributo.
Tipos de path
XPath absoluto: Ejemplo de xpath absoluto /html/body/div[4]/div/div[3]/article[1]/div[2]/a
XPath relativo: Ejemplo de xpath absoluto //*[@id="1442737"]/div[2]/a
Realicemos un ejemplo simulando una prueba de sobre un sitio web, para poder simularlo vamos vamos a ingresar al sitio `https://tuquejasuma.com/ que es un sitio popular de reclamos en Argentina.
En este sitio vamos a ingresar en el buscador el termino "banco nacion"
y hagamos click en el boton buscar para retorna todos los reclamos asociados a esta entidad bancaria.
"https://tuquejasuma.com/")
driver.get(= driver.find_element_by_id("searcher")
element "Banco Nacion")
element.send_keys('//*[@id="breadcrum-search"]/form/button').click() driver.find_element_by_xpath(
El script completo es el siguiente:
from selenium import webdriver
# Ubicación del ejecutable
= webdriver.Chrome("/chromedriver")
driver
# Ejecutamos una pagina de inicio
"https://google.com")
driver.get(
# Ingresamos a la pagina tu queja suma
"https://tuquejasuma.com/")
driver.get(= driver.find_element_by_id("searcher")
element "Banco Nacion")
element.send_keys('//*[@id="breadcrum-search"]/form/button').click() driver.find_element_by_xpath(
Best Strategies for Managing Bugs and Feature Requests: https://brainhub.eu/blog/strategies-for-managing-bugs/↩︎
Software testing fundamentals: https://softwaretestingfundamentals.com/test-case/↩︎
Text and figures are licensed under Creative Commons Attribution CC BY 4.0. The figures that have been reused from other sources don't fall under this license and can be recognized by a note in their caption: "Figure from ...".
For attribution, please cite this work as
Mendez & (2021, Feb. 21). Romina Mendez: Fundamentos de Testing. Retrieved from https://r0mymendez.github.io/posts/2021-03-06-fundamentos-de-testing/
BibTeX citation
@misc{mendez2021fundamentos, author = {Mendez, Romina and , }, title = {Romina Mendez: Fundamentos de Testing}, url = {https://r0mymendez.github.io/posts/2021-03-06-fundamentos-de-testing/}, year = {2021} }