Ir al contenido
wannacode

Por qué fallan los programas

En resumen: Una persona comete un error, el error deja un defecto en el requisito o en el código, y un defecto que se ejecuta se convierte en un fallo que ve el cliente. Las pruebas buscan fallos, pero no pueden demostrar que no hay defectos.

Problema

¿Quién se equivocó?

La tienda lanza el código promocional «OTONO10»: 10 € de descuento, una vez por cliente. Una semana después, contabilidad ve a un cliente que lo usó en tres pedidos. 30 € en vez de 10 €.

El programador dice: «Lo hice como estaba escrito». En el requisito dice «una vez por pedido». La analista dice: «Así me lo dijo el dueño». El dueño está seguro de que dijo «por cliente».

¿Quién se equivocó? Esa es la pregunta equivocada. Es más útil ver que son tres cosas distintas que ocurren una detrás de otra.

La idea

Error, defecto, fallo

  • Un error (error, mistake) es una acción humana: alguien entiende, escribe o hace algo mal. La analista anota «por pedido».
  • Un defecto (defect, también bug o fault) es una imperfección en un producto de trabajo, dejada por el error. El defecto aquí está en el requisito. Después pasa al código, porque el programador construye fielmente lo escrito.
  • Un fallo (failure) es el momento en que el sistema hace algo distinto de lo esperado mientras funciona. El cliente usa el código tres veces.

La dirección es siempre esta: error → defecto → fallo. El cliente solo ve el fallo. Las pruebas empiezan por él y van hacia atrás.

No todo defecto se convierte en fallo. Si nadie prueba el código una segunda vez, el defecto sigue ahí sin que se vea.

Más precisamente, para curiosos

Así los da el programa de ISTQB CTFL v4.0.1 (sección 1.2.3, «Errores, defectos, fallos y causas raíz»). Un fallo también puede venir de las condiciones del entorno, sin error humano: la radiación o un campo electromagnético pueden dañar el firmware. En la tienda es raro.

En el trabajo, la palabra «bug» significa las tres cosas, y por eso las conversaciones se enredan. «Hay un bug en el código promocional» puede ser el fallo que vio el cliente, o la línea de código que lo causa. En este curso, defecto es siempre la imperfección en el producto de trabajo.

La idea

La causa raíz

¿Por qué se equivocó la analista? Porque el cliente lo dijo por teléfono y nadie lo anotó. Tampoco había un ejemplo: «María hace un pedido hoy con el código y otra vez mañana. ¿Qué pasa?». Con un ejemplo así, «una vez por cliente» y «una vez por pedido» habrían dado respuestas distintas en voz alta.

Esa es la causa raíz (root cause): por qué ocurrió el error. Corregir el requisito y el código arregla este defecto. Corregir la causa raíz (los requisitos se escriben con ejemplos y el dueño los confirma) protege también de los siguientes del mismo tipo.

El objetivo del análisis no es encontrar a un culpable. El objetivo es un proceso que no permita el error una segunda vez.

Pruébalo

Ordena la cadena

Ordénalo desde la causa hasta lo que ve contabilidad.

  1. El cliente dice por teléfono «el código vale una vez por cliente», nadie lo anota
  2. Un cliente usa el código en tres pedidos y recibe tres descuentos
  3. El requisito dice «una vez por pedido»
  4. La analista escribe de memoria «una vez por pedido»

Pruébalo

¿Error, defecto o fallo?

1. El requisito de devolución dice «en 14 días», sin decir desde cuándo.
2. El programador está cansado y escribe «rechaza desde 11 unidades» en vez de «más de 10».
3. Un cliente pone 11 unidades de un producto en el carrito y hace el pedido.
4. Un pedido que ya se envió se puede cancelar, porque al código le falta la comprobación del estado. Hasta ahora nadie lo ha intentado.

La idea

Un caso de prueba

¿Cómo se detecta el fallo antes que el cliente? Pones el sistema en una situación determinada, haces algo y comparas con lo que debería pasar. Escrito, eso es un caso de prueba (test case):

Parte Para el código promocional
Precondiciones El cliente ya usó «OTONO10» en un pedido pagado.
Entrada y acciones Un pedido nuevo de 40 €, con el mismo código.
Resultado esperado Se rechaza el código: «Este código ya se usó». El total sigue en 40 €.

La parte más importante es el resultado esperado, y viene del requisito, no del programa. Si lo copias de lo que hace hoy el programa, el test confirmará también sus errores.

En el módulo de escenarios el mismo caso se escribirá como «Dado … Cuando … Entonces …». La idea es la misma: un inicio, una acción, una expectativa.

Más precisamente, para curiosos

El glosario de ISTQB define el caso de prueba como un conjunto de precondiciones, entradas, acciones (cuando corresponda), resultados esperados y postcondiciones, desarrollado a partir de una condición de prueba. Una condición de prueba es lo que compruebas («el código promocional vale una vez por cliente»), y los casos de prueba son los ejemplos concretos de ella. Aquí un caso de prueba es algo que también puede ejecutar una persona. Los tests en código de los otros cursos son la misma idea, escrita para una máquina.

La idea

Una prueba muestra, no demuestra

La tienda tiene 200 tests para el carrito y todos pasan. ¿Significa eso que el carrito no tiene defectos?

No. Significa que esos 200 casos funcionan. Prueba a enumerarlos todos: 10 unidades de cada uno de 500 productos, con código promocional o sin él, con cada total, con cada forma de envío. Hay más combinaciones de las que ejecutarás en toda tu vida.

Este es el primero de los siete principios de las pruebas (testing principles): las pruebas pueden mostrar que hay defectos, pero no que no los hay. Un test que pasa reduce la probabilidad de un defecto oculto. No la deja en cero.

La idea

Seis principios más, seis historias

2. Las pruebas exhaustivas son imposibles. No se pueden ejecutar todas las combinaciones del carrito. Por eso se eligen las más importantes: por riesgo, por límites (49,99 €, 50,00 €), con las técnicas del módulo «Técnicas de diseño de pruebas».

3. Probar pronto ahorra tiempo y dinero. La pregunta «¿y con justo 50 €?» en la reunión cuesta un minuto. Después del lanzamiento cuesta una corrección, un test nuevo, una versión nueva y clientes enfadados.

4. Los defectos se agrupan. La mayoría de los defectos de la tienda están en los códigos promocionales y en la cancelación de pedidos: donde hay muchas reglas. Ahí pruebas más.

5. Las pruebas se desgastan. Los mismos tests, ejecutados durante meses, solo detectan lo que siempre han detectado. Los defectos nuevos están en otra parte. Los tests se actualizan y se añaden otros nuevos.

6. Las pruebas dependen del contexto. Una tienda y el software de un hospital no se prueban igual. Incluso el sitio web y la aplicación móvil de una misma tienda tienen riesgos distintos.

7. La falacia de la ausencia de defectos. Un sistema sin defectos conocidos aún puede estar equivocado: si hace lo escrito y lo escrito no es lo necesario. Aquí la verificación pasó, y la validación nunca se hizo.

Más precisamente, para curiosos

Los principios son de ISTQB CTFL v4.0.1, sección 1.3. En inglés: testing shows the presence, not the absence of defects; exhaustive testing is impossible; early testing saves time and money; defects cluster together; tests wear out; testing is context dependent; absence-of-defects fallacy.

En los programas más antiguos, el quinto se llamaba «paradoja del pesticida» (pesticide paradox): como los insectos que se acostumbran al veneno. La agrupación de defectos (el cuarto) es un ejemplo del principio de Pareto: una pequeña parte de los módulos contiene una gran parte de los defectos.

Ejercicio

¿Qué principio?

1. Reconoce el principio. Cada historia es de la tienda. ¿Cuál de los siete principios describe?

1. La tienda prueba el carrito con Chrome en una computadora. La aplicación móvil de la misma tienda la prueba con teléfonos, una red débil y un corte en mitad del pago.
2. Siete de los diez defectos del año pasado están en los códigos promocionales. La tester empieza el nuevo ciclo por ahí.
3. Un conjunto de 40 tests del envío lleva un año en verde. El mes pasado hubo tres fallos en el envío a una oficina, que los tests no cubren.
4. La nueva página de pago no tiene ni un solo defecto conocido. Aun así, los clientes abandonan, porque pide registrarse antes de pagar.
5. La pregunta «¿y con justo 50 €?» se hace en la reunión sobre el requisito. Corregirlo lleva un minuto, en vez de una semana tras el lanzamiento.

Test

Ponte a prueba

1. ¿Qué dirección es la correcta?
2. Los 200 tests pasan. ¿Qué puedes decir?
3. ¿Qué NO forma parte de un caso de prueba?
4. Un defecto en un código que nunca se ejecuta es…
5. ¿Por qué se busca la causa raíz?

Creado por Ivo Gergov como parte de la campaña de Evo Tech por una educación accesible en programación ·