¿Buscas nuestro logo?
Aquí te dejamos una copia, pero si necesitas más opciones o quieres conocer más, visita nuestra área de marca.
Conoce nuestra marca.¿Buscas nuestro logo?
Aquí te dejamos una copia, pero si necesitas más opciones o quieres conocer más, visita nuestra área de marca.
Conoce nuestra marca.dev
Alejandro García Alfonso 08/01/2024 Cargando comentarios…
Desde nuestra área de QSO, estamos constantemente explorando las tecnologías y herramientas más disruptivas. A lo largo de 2023, hemos sido testigos de la irrupción de la inteligencia artificial de manera tan impactante, que no podíamos dejar pasar la ocasión de ver cómo la IA nos ha afectado.
Al iniciar la redacción de este post, reflexioné sobre la mejor manera de abordar la tarea, y llegué a la conclusión de que ChatGPT, usando cualquiera de las versiones actuales de su motor, ejemplificaría cómo la inteligencia artificial potencia la interacción entre seres humanos y máquinas, brindando una experiencia fluida y adaptada. Aun así, estamos en un momento prematuro de este tipo de IA, por lo que, como usuarios de la misma, siempre tenemos que ser críticos con sus respuestas, ya que es frecuente encontrarse con respuestas erróneas o poco coherentes. Además, muestra sensibilidad a sutiles variaciones en las entradas puede hacer que tienda a enfangarse más de la cuenta en ocasiones. Por tanto, sería prudente emplear ChatGPT o cualquier interfaz similar con cautela y un poco de sentido común.
La inteligencia artificial, la IA generativa y los modelos de lenguaje son conceptos interrelacionados, pero distintos en el ámbito de la tecnología. La IA se refiere a la simulación de procesos de inteligencia humana por parte de máquinas, mientras que la IA generativa se basa en la creación de contenido original y nuevo por parte de las máquinas. De modo que la IA tradicional puede estar diseñada para realizar tareas específicas con datos predefinidos y la IA generativa busca generar datos, como texto, imágenes, música u otros tipos de contenido, de manera autónoma y creativa. Por otro lado, los modelos de lenguaje son un caso particular de IA generativa, capaces de comprender y generar texto de forma natural. Los modelos de lenguaje avanzados parecen comprender el contexto, pero su funcionamiento se basa en predecir palabras siguiendo patrones predefinidos
Indudablemente, uno de los ejemplos más notables es ChatGPT. Su impacto en nuestras vidas ha sido asombroso, atrayendo a millones de usuarios desde su inicio y superando en crecimiento incluso a plataformas como Instagram. En tan solo 40 días desde su lanzamiento, ChatGPT logró cautivar a más de 10 millones de usuarios diarios, que aprovecharon su capacidad para responder preguntas en diversos campos. La versatilidad de ChatGPT lo convierte en una herramienta valiosa para mejorar la calidad en diferentes áreas. Su capacidad para generar contenido relevante y coherente puede ser utilizada en multitud de campos de todo tipo y como no, en el desarrollo de software, su habilidad para sugerir líneas de código podría acelerar el proceso de creación y optimización.
No obstante, centrémonos en lo que verdaderamente nos concierne en este post: ¿cómo podemos aprovechar esta tecnología en el ámbito de la calidad?
La aplicación de la IA generativa en el ámbito de la calidad de software se puede aprovechar en tres áreas claves, tal y como la entendemos desde QSO:
En resumen, la integración de la IA generativa en la calidad del software impacta positivamente en la definición de los requerimientos funcionales, potencia la productividad del equipo de desarrollo y mejora la validación exhaustiva de tareas, consolidando así la excelencia en todo el proceso de desarrollo de software.
En este ámbito, una herramienta que empleamos de manera recurrente son las sesiones de refinamiento, conocidas como ’3 amigos’. Estas reuniones culminan con la necesidad de tener una comprensión precisa sobre el objetivo de nuestras tareas, junto con criterios de aceptación exhaustivos. En este contexto inicial, existe una oportunidad para recurrir a la inteligencia artificial como un recurso que facilite la creación de casos de uso y, a partir de estos, la formulación de nuestras pruebas. Para ilustrar este enfoque, consideremos un ejemplo concreto.
Supongamos que estamos diseñando una web que tiene un formulario de registro sencillo con 5 campos: nombre, apellidos, teléfono, email y dirección. No nos engañemos, muchas veces, esta es toda la información que tenemos para un caso como este. Hagámosle la pregunta a la IA:
— Pregunta:
Dado un formulario de html con 5 campos. Nombre, apellidos, email, teléfono y dirección. Quiero generar un set de casos de prueba que cumpla toda la funcionalidad
— Respuesta:
Generar un conjunto completo y exhaustivo de casos de prueba puede ser un proceso complejo y depende en gran medida de la funcionalidad específica que quieras probar en tu formulario HTML. Sin embargo, aquí te proporcionaré un conjunto básico de casos de prueba que abarca diversas situaciones comunes que podrían ser relevantes para un formulario como el que describiste.
Supongamos que tienes un formulario con los siguientes campos: Nombre, Apellidos, Email, Teléfono y Dirección. Y deseas probar funcionalidades como validaciones, envío de datos, etc. Aquí tienes un conjunto de casos de prueba que podrías considerar:
Caso de prueba de campos vacíos:
Caso de prueba de campos obligatorios:
Caso de prueba de longitud máxima:
Caso de prueba de formato de email:
Caso de prueba de formato de teléfono:
Caso de prueba de dirección válida:
Caso de prueba de dirección inválida:
Caso de prueba de entrada válida:
Caso de prueba de límites de entrada:
Caso de prueba de caracteres especiales:
Caso de prueba de campo de email único:
Caso de prueba de validación exitosa:
———————
A medida que se le va dando más información al intérprete, la respuesta tendrá cada vez mayor sentido y se podrá aproximar más a lo que estábamos buscando.
— Pregunta:
Dado un formulario de html con 5 campos. Nombre, apellidos, email, teléfono y dirección. Quiero generar un set de casos de prueba que cumpla toda la funcionalidad. Nombre, apellidos y email son campos obligatorios. El resto son opcionales. Hay 2 botones, uno para enviar y otro para limpiar el formulario y empezar de nuevo. Al enviar el formulario, se le notifica por mail al usuario y en la navegación el usuario llega a una pantalla donde se le indica que revise el correo
— Respuesta:
Entendido, estás buscando un conjunto completo de casos de prueba que cubran todas las funcionalidades de tu formulario HTML. Aquí tienes un conjunto amplio de casos de prueba que abarcan los escenarios que has mencionado:
Campos Opcionales:
Botones:
Notificación por Correo Electrónico:
———————
¿Qué ocurre si ahora queremos trabajar con un modelo de lenguaje como BDD? Este nos servirá como punto de partida para nuestras automatizaciones de pruebas:
— Pregunta:
¿Puedes traducir estos casos de prueba al modelo de lenguaje BDD, con sentencias Given, When, Then en español?
— Respuesta:
Funcionalidad: Validación de Campos Obligatorios
Funcionalidad: Campos Opcionales
Funcionalidad: Botones
Funcionalidad: Notificación por Correo Electrónico
Funcionalidad: Navegación a la Pantalla de Revisión
Estos escenarios utilizan la estructura Given-When-Then para describir las condiciones, las acciones y los resultados esperados en cada caso de prueba. Asegúrate de adaptarlos según las características y el comportamiento específico de tu formulario.
———————
Podemos decir que en este primer escenario hemos podido generar partiendo de una definición de un requisito una serie de criterios de aceptación, pruebas útiles. Como condición, cuanto mayor sea el grado de detalle, mayor debería ser el acierto de la IA a la hora de definir los casos.
En este punto es importante tener en cuenta que se debe conocer muy bien la funcionalidad que se está llevando a cabo. Y la incorporación de una IA de lenguaje como ChatGPT para optimizar la creación de pruebas unitarias constituye un enfoque prometedor. Al centrarnos en un escenario concreto para generar los test unitarios se podrían seguir los siguientes pasos:
Podemos empezar pidiéndole que nos sugiera los test unitarios que se podrían implementar en nuestro caso:
— Pregunta:
¿Podrías ponerme algún ejemplo en python de test unitarios para el formulario de antes?
— Respuesta:
¡Por supuesto! Aquí tienes algunos ejemplos de cómo podrían ser implementados los casos de prueba unitarios en Python utilizando el framework de pruebas unittest:
import unittest
# Supongamos que tienes una clase llamada 'Formulario' que contiene la lógica del formulario
lass TestFormulario(unittest.TestCase):
def test_campos_obligatorios_completos(self):
formulario = Formulario()
resultado = formulario.enviar_formulario('Nombre', 'Apellidos', 'correo@example.com', None, None)
self.assertTrue(resultado)
def test_campos_obligatorios_incompletos(self):
formulario = Formulario()
resultado = formulario.enviar_formulario('Nombre', 'Apellidos', None, None, None)
self.assertFalse(resultado)
def test_limpiar_formulario(self):
formulario = Formulario()
formulario.llenar_campos('Nombre', 'Apellidos', 'correo@example.com', '123456789', 'Dirección')
formulario.limpiar_formulario()
self.assertEqual(formulario.nombre, '')
self.assertEqual(formulario.apellidos, '')
self.assertEqual(formulario.email, '')
self.assertEqual(formulario.telefono, '')
self.assertEqual(formulario.direccion, '')
def test_correo_enviado(self):
formulario = Formulario()
formulario.llenar_campos('Nombre', 'Apellidos', 'correo@example.com', None, None)
resultado = formulario.enviar_formulario()
self.assertTrue(resultado)
self.assertTrue(formulario.correo_enviado)
def test_redireccion_pantalla_confirmacion(self):
formulario = Formulario()
formulario.llenar_campos('Nombre', 'Apellidos', 'correo@example.com', None, None)
resultado = formulario.enviar_formulario()
self.assertTrue(resultado)
self.assertEqual(formulario.pantalla_actual, 'Confirmacion')
if __name__ == '__main__':
unittest.main()
Estos son ejemplos simplificados y genéricos de cómo podrías estructurar tus pruebas unitarias utilizando unittest en Python. Recuerda que debes adaptar estos ejemplos a la estructura y lógica específica de tu código y tu formulario.
———————
La respuesta no siempre es perfecta. De hecho, a menudo es mejorable por el propio usuario, pero sirve como punto de partida para tener en cuenta ciertos casos que posiblemente no se hubieran tenido en cuenta. En nuestro caso queremos seguir profundizando y dando mayor calidad a nuestros test unitarios. Y una manera de mejorar nuestros test es teniendo en cuenta que se pueden pasar unos test de mutación. Vamos a pedirle a nuestro intérprete que nos oriente en este sentido:
— Pregunta:
Teniendo estos test unitarios, quiero pasar un framework de test de mutación, para poder validar la calidad de mis tests. ¿Cómo mejorarías estos test para pasar la mayor cantidad de test de mutación posible?
— Respuesta:
Por supuesto! Para mejorar la capacidad de tus pruebas unitarias para superar pruebas de mutación, aquí tienes algunas estrategias:
Al seguir estas estrategias, puedes aumentar la probabilidad de que tus pruebas unitarias sean robustas frente a las mutaciones, lo que a su vez mejora la calidad de tus pruebas y la detección de posibles errores en tu código.
———————
Es importante saber lo que se está haciendo, como para ser capaces de decidir si la solución planteada es válida o no. En este punto, el desarrollador puede tener una mente mucho más abierta y creativa y proponer diferentes soluciones para un mismo problema. Sin embargo, parece un buen punto de partida el seguir las orientaciones dadas por el asistente.
Hasta este momento, contamos con una base sólida establecida por los casos en BDD, los test unitarios y las recomendaciones de los test de mutación. A partir de esta base, procedamos a consultar a nuestra IA para que nos ayude a generar una tabla de casos de prueba basados en la información que tenemos previamente. Además, nos interesa asignarle una severidad a cada caso.
— Pregunta:
A partir del BDD anterior quiero generar casos de prueba en una tabla que tenga los siguientes campos:
— Respuesta:
Aquí tienes los escenarios BDD que proporcioné anteriormente convertidos en casos de prueba con los campos que mencionaste: Nombre del caso de prueba, Descripción del caso de prueba, Pasos, Resultado y Severidad.
Nombre del caso de prueba | Descripción del caso de prueba | Pasos | Resultado | Severidad |
---|---|---|---|---|
CP1 | Enviar formulario con campos en blanco | Dado que un usuario desea enviar un formulario con campos obligatorios. Cuando el usuario intenta enviar el formulario con todos los campos en blanco. | Se muestra un mensaje de error indicando que el nombre es obligatorio. | Alta |
CP2 | Enviar formulario con nombre y apellidos en blanco | Dado que un usuario desea enviar un formulario con campos obligatorios. Cuando el usuario intenta enviar el formulario con el nombre y apellidos en blanco. | Se muestran mensajes de error indicando que el nombre y apellidos son obligatorios. | Alta |
CP3 | Enviar formulario con nombre, apellidos y email en blanco | Dado que un usuario desea enviar un formulario con campos obligatorios. Cuando el usuario intenta enviar el formulario con el nombre, apellidos y email en blanco. | Se muestran mensajes de error indicando que el nombre, apellidos y email son obligatorios. | Alta |
CP4 | Enviar formulario con todos los campos completos | Dado que un usuario desea enviar un formulario con campos opcionales. Cuando el usuario envía el formulario con todos los campos completos. | El formulario se envía exitosamente. | Media |
CP5 | Enviar formulario con nombre, apellidos, email y teléfono completos | Dado que un usuario desea enviar un formulario con campos opcionales. Cuando el usuario envía el formulario con el nombre, apellidos, email y teléfono completos. | El formulario se envía exitosamente. | Media |
CP6 | Enviar formulario y hacer clic en el botón "Enviar" | Dado que un usuario desea interactuar con los botones del formulario. Cuando el usuario llena el formulario y hace clic en el botón "Enviar". | El formulario se envía. | Baja |
CP7 | Llenar formulario y hacer clic en el botón "Limpiar" | Dado que un usuario desea interactuar con los botones del formulario. Cuando el usuario llena el formulario y hace clic en el botón "Limpiar". | Todos los campos del formulario se borran. | Baja |
CP8 | Enviar formulario y verificar notificación por correo electrónico | Dado que un usuario ha enviado el formulario y espera una notificación por correo electrónico. Cuando el usuario envía el formulario. | Se recibe una notificación por correo electrónico. | Media |
CP9 | Verificar navegación a pantalla de revisión | Dado que un usuario ha enviado el formulario y debe revisar su correo electrónico. Cuando el usuario envía el formulario y sigue las instrucciones para revisar su correo electrónico. | La navegación lleva al usuario a una pantalla de revisión que indica que debe revisar su correo electrónico. | Baja |
Estos casos de prueba cubren los diferentes escenarios que describiste en tu BDD. Puedes ajustar los detalles según las necesidades y características específicas de tu aplicación. La columna de "Severidad" indica la importancia relativa de cada caso de prueba.
———————
El siguiente paso que queremos dar es en la dirección de darle más profundidad a los casos. Queremos llegar un poco más allá. Sobre todo queremos tener algún caso de prueba de seguridad y nos preocupa cumplir con los estándares de accesibilidad.
— Pregunta:
¿Puedes generar más casos de prueba? y añadir además alguno relacionado con seguridad, validación xhtml y cumplimiento del estándar AA en cuanto a accesibilidad
— Respuesta:
Nombre del caso de prueba | Descripción del caso de prueba | Pasos | Resultado | Severidad |
---|---|---|---|---|
CP10 | Enviar formulario con caracteres especiales en el nombre | Dado que un usuario desea enviar un formulario con campos opcionales. Cuando el usuario envía el formulario con un nombre que contiene caracteres especiales. | El formulario se envía exitosamente y los caracteres especiales se manejan correctamente. | Media |
CP11 | Enviar formulario con número de teléfono inválido | Dado que un usuario desea enviar un formulario con campos opcionales. Cuando el usuario envía el formulario con un número de teléfono en un formato incorrecto. | Se muestra un mensaje de error indicando que el número de teléfono es inválido. | Alta |
CP12 | Intento de inyección de SQL en el campo de dirección | Dado que un usuario desea enviar un formulario con campos opcionales. Cuando el usuario intenta introducir un código malicioso de inyección de SQL en el campo de dirección. | Se bloquea el intento de inyección de SQL y se muestra un mensaje de error. | Alta |
CP13 | Validación XHTML del formulario | Dado que se quiere asegurar la validez del XHTML en el formulario. Cuando se verifica el código fuente HTML del formulario con un validador XHTML. | El validador XHTML no muestra errores y el código es válido. | Media |
CP14 | Cumplimiento de estándar de accesibilidad nivel AA | Dado que se busca cumplir con el estándar de accesibilidad nivel AA. Cuando se evalúa el formulario utilizando una herramienta de auditoría de accesibilidad para verificar el cumplimiento del estándar AA. | La herramienta no muestra errores de nivel AA y el formulario cumple con este estándar. | Alta |
———————
Y podríamos estar así todo el día, añadiendo diferentes casuísticas, por ejemplo pruebas de bases de datos, pruebas a nivel del servicio o eventos que se consumen, pruebas de rendimiento, etc. Las posibilidades son infinitas.
Sin embargo, hay una parte importante a la hora de afrontar las pruebas y que es la que más a menudo suele dar problemas antes o después. El set de datos de pruebas que se va a usar. Para nuestro caso sencillo, podemos tener en un criterio escrito los tipos de usuarios que se van a poder logar, los que van a poder solicitar una cuenta, si un usuario ha sido dado de baja, etc.:
— Pregunta:
Para este formulario necesito saber las diferentes casuísticas que voy a necesitar en base a los siguientes criterios: Puede haber usuarios dados de alta que acceden a la app - Puede haber usuarios que estando dados de alta aún no hayan activado su cuenta - etc. Por favor sé creativo con los criterios más normales y genera una lista de los diferentes tipos de usuarios que voy a necesitar pedir al equipo de desarrollo
— Respuesta:
¡Por supuesto! Aquí tienes una lista de diferentes tipos de usuarios que podrías considerar para tu aplicación basándote en los criterios que mencionaste:
———————
Se puede afirmar que el impacto en la tecnología, proporcionado por los motores de IA es innegable en lo que respecta a la calidad. Su capacidad para abordar diversas tareas y su potencial para asistir en la mejora continua convierten a esta herramienta en un recurso valioso en la búsqueda de la excelencia en varios campos.
En el ámbito de la calidad, esta herramienta puede ser aprovechada en todas las áreas del proceso de desarrollo e incluso en la fase de validación, de manera que abarca el ciclo completo de cómo comprendemos la calidad según el círculo de QSO. Es importante considerar que estas soluciones raras veces son perfectas y, por lo general, siempre se pueden mejorar. No obstante, son un recurso excelente para tomar como punto de partida para refinamientos, casos de prueba o automatizaciones.
Los comentarios serán moderados. Serán visibles si aportan un argumento constructivo. Si no estás de acuerdo con algún punto, por favor, muestra tus opiniones de manera educada.
Cuéntanos qué te parece.