ISTQB Nivel Basico Libro Completo PDF
ISTQB Nivel Basico Libro Completo PDF
Fundamentos de Pruebas
“La primera demostración en el espacio que vamos a hacer nosotros es en el año 2014 en
la Estación Espacial Internacional (ISS). Vamos a montar un pequeño prototipo del motor,
para probarlo y dispararlo en la ISS, y verificar el rendimiento, su fiabilidad y capacidad
de operar tal como estamos prediciendo”
Franklin Chang Díaz, primer astronauta latinoamericano de la NASA e inventor del motor
de cohete VASIMR.
LO-1.1.3 Dar razones por qué las pruebas son necesarias proporcionando ejemplos. (K2)
LO-1.1.4 Describir por qué las pruebas son parte del aseguramiento de la calidad y dar
ejemplos de cómo las pruebas contribuyen a la más alta calidad. (K2)
LO-1.1.5 Explicar y comparar los términos error, defecto, falta, falla y los términos
correspondientes equivocación y “bug” utilizando ejemplos. (K2)
Esta sección, ¿Por qué son necesarias las pruebas?, abordará los siguientes conceptos:
Defecto: Un desperfecto que puede causar que el componente o el sistema falle al realizar
su función requerida, p.ej. una sentencia incorrecta o una definición incorrecta de los datos.
Si es encontrado un defecto durante la ejecución, puede causar una falla del componente o
sistema.
Requisito: Una condición o una capacidad necesitada por un usuario para resolver un
problema o lograr un objetivo que debe ser cumplido o que debe poseer un sistema o un
componente de sistema para satisfacer un contrato, un estándar, una especificación u otro
documento formalmente impuesto.
El software está en todo lugar. Se podría decir que está presente en todos los aspectos y
momentos de la vida de las personas o mejor dicho en casi todos. Algunas veces el software
es obvio, otras veces no. Cuando estamos en un banco o estamos utilizando un cajero
automático, podemos observar el funcionamiento de los sistemas de software. Pero cuando
estamos manejando un auto moderno, es fácil de olvidar que hay más poder computacional
y presencia de software en la mayoría de los autos que en la mayoría de las naves
espaciales construidas hasta la década de los ochenta.
Si bien es fácil de olvidar el software cuando funciona, también es fácil para la mayoría de
nosotros de recordar nuestras experiencias acerca del software que no funcionó. Una serie
de dificultades pueden suceder a varias personas cuando un software contiene defectos.
Empecemos con la compañía u organización que desarrolla o adquiere el software.
Esa compañía puede sufrir daños acerca de su reputación ya sea si es un fabricante o una
compradora de software cuyos clientes sufren.
La compañía puede sufrir altos o impredecibles costos de mantenimiento cuando las fallas
ocurren en la producción.
Pueden ocurrir retrasos inesperados en los ciclos de versiones cuando los problemas son
descubiertos tarde en el ciclo de desarrollo.
Si un gran número de defectos aparecen antes de la versión o después de la versión, esto
puede conducir a una falta de confianza por parte de los interesados del negocio ya sea si
ellos son empleados de la compañía o clientes de la misma.
Por supuesto, que en ciertas situaciones el software con muchos defectos puede resultar en
juicios legales.
Por otro lado, en cuanto al entorno, el software está más y más embebido en sistemas que
controlan procesos industriales, fábricas, plantas de energía y por supuesto automóviles.
Cuando estas aplicaciones no funcionan correctamente, eso puede resultar en un exceso de
contaminación y desperdicio de recursos. Por ejemplo, un sistema podría quemar más
gasolina o consumir más electricidad de lo necesario.
Para los individuos, las sociedades y los estados existen las amenazas de las fallas que son
causadas por los defectos. Las personas pueden perder sus trabajos cuando las fallas en un
software se convierten en un revés económico para su empleador.
En algunos casos las personas pueden perder sus vidas debido al software. Tuvimos
recientemente un incidente en un hospital de Texas, cuando una persona al intentar subir al
elevador mientras las puertas se cerraban, ésta quedó con la mitad de su cuerpo dentro. El
software que controlaba al elevador no evitó correctamente el movimiento con la puerta
parcialmente abierta.
Así mismo la gente puede perder sus derechos civiles como ha pasado cuando las máquinas
de las elecciones computarizadas fracasaron.
Los defectos no son introducidos por pequeñas hadas en los sistemas que vuelan alrededor
de los centros de datos y lanzan los defectos en las computadoras y el código. Para ser
completamente franco al respecto, los defectos están en el sistema porque alguien los
colocó allí. Alguien cometió una equivocación, un error, cuyo resultado fue la inserción de
un defecto o “bug” en el sistema.
Un defecto o un error pueden ser insertados en cualquier momento durante el ciclo de vida.
Pueden ser insertados en los requisitos o en las especificaciones de diseño. Pueden ser
insertados en el código, ya sea en la lógica de negocios o en la interfaz de usuario. Pueden
ser insertados en la documentación, ya sea en la documentación electrónica o impresa.
Ahora, una vez que el defecto es insertado en el sistema, éste podría o no podría de verdad
resultar en una falla. Para que una falla ocurra, la parte defectuosa del sistema tiene que ser
ejecutada. En ese momento el defecto podría provocar que el sistema funcione
incorrectamente. Asumiendo que las precondiciones correctas están vigentes, el sistema
podría fallar al no cumplir con lo que debería hacer en esas condiciones. Si esa falla es
visible o llega a ser visible después, ya sea a un cliente, un usuario u otro interesado del
negocio, ese comportamiento podría resultar en la insatisfacción de la calidad del sistema.
Note que hay mucho uso del verbo condicional “podría”. Bajo muchas circunstancias un
defecto podría existir en el sistema y todavía no ser visible en cuanto al comportamiento
visible, simplemente porque requiere una secuencia específica de acciones antes de la
ejecución del código que contiene el defecto, o los datos específicos que son
proporcionados al código que contiene el defecto o ambos.
La gente tiende a cometer más errores cuando está bajo condiciones de presión de tiempo.
Hoy en día las condiciones de presión de tiempo están omnipresentes en los proyectos de
desarrollo de software y de sistemas.
Es más fácil cometer un error cuando se está tratando de resolver un problema complejo, o
cuando se está utilizando un código que ha llegado a ser complejo a través de los años, o
cuando se está utilizando una infraestructura que es complicada.
En muchos casos, muchas partes diferentes del sistema o de los sistemas de sistemas tienen
que trabajar todas juntas. Los sistemas de sistemas y las tecnologías que los implementan
están cambiando continuamente y deben engranar. Por ejemplo, considere lo que se está
haciendo estos días con las arquitecturas orientadas al servicio. A menudo existen intentos
de hacer disponible los servicios implementados en código de mainframes, frecuentemente
código COBOL antiguo que se ejecuta en mainframes, a veces código que ha estado en los
centros de datos por 20, 30 o más años.
Además, tenemos muchos sistemas que interactúan de punta a punta, donde una transacción
tiene que ser manipulada por una serie de sistemas antes que la transacción se complete
correctamente. Cada operación podría ser simple, pero la secuencia total de operaciones
puede llegar a ser compleja, y esa complejidad puede conducir a expectativas equivocadas
por parte de una o más personas. Esto conduce a un defecto en la interacción o la
secuenciación de las operaciones.
Ahora, muchas fallas ocurren debido a los defectos como fueron descritos en el párrafo
anterior. Sin embargo, estos también ocurren debido a las condiciones del entorno. Por
ejemplo, el calor excesivo en el sistema que ejecuta el código puede provocar fallas
intermitentes en la memoria, el almacenamiento o el CPU. Es decir, el uso incorrecto del
software, si es intencional o accidental, contiene el defecto, o ambos.
Uno podría argumentar que tal vez el sistema debería controlar todas las circunstancias y
los usos previsibles. Sin embargo, dado el conjunto casi infinito de condiciones y entradas
con los que el sistema podría estar confrontado, no es completamente realista esperar que el
uso incorrecto no provoque fallas en algunas circunstancias.
Entonces habiendo considerado los defectos y las fallas, podemos ver que el sistema está
sujeto a varios riesgos.
Los riesgos acerca de los cuales hemos estado hablando hasta ahora se relacionan con la
calidad. Estamos utilizando la calidad en el sentido amplio de: “¿Está listo el sistema para
el cliente, la versión o el siguiente paso en el proceso?” Seremos más precisos en la
utilización de esta palabra importante, calidad, más adelante.
Existen otros riesgos y otras restricciones en los proyectos de software que deben ser
considerados. Por ejemplo, existen riesgos relacionados con el fracaso de implementar
todas las características necesarias. Existen riesgos relacionados con versiones atrasadas.
Existen riesgos relacionados con el presupuesto y con las restricciones de los recursos. Las
pruebas no gestionan mucho estas áreas de riesgos, sino más bien son afectadas por estos
riesgos. Hablaremos después más de este tema.
Sin embargo piense por el momento acerca de las pruebas como un medio de gestionar los
riesgos de calidad. Las pruebas hacen esto de varias formas. Una forma es de proporcionar
la información para guiar el proyecto en el área de los riesgos de calidad. Otra es de
enfocarse en las pruebas acerca de los riesgos de calidad más importantes.
Aún otra es de localizar y dejar a las personas que reparen los problemas importantes.
Las pruebas pueden y algunas veces también deben ser realizadas debido a las regulaciones,
las cuestiones de conformidad, o los contratos. Por ejemplo, las regulaciones Sarbanes-
Oxley son aplicadas en muchas instituciones financieras en los Estados Unidos. Para ciertos
tipos de sitios web, la accesibilidad para personas con discapacidades podría ser necesaria.
Está bien, regresemos a esta pregunta ¿Qué es la calidad? Existen dos definiciones formales
comunes para la calidad las cuales se diferencian claramente.
Una es “la aptitud para el uso”. La otra es “la conformidad con los requisitos”.
Decimos que éstas son claramente diferentes porque la definición “apta para el uso”
implica que aquellos que usan, emplean, adquieren o necesitan el software son aquellos que
deberían determinar si tiene o no calidad. La definición “Conformidad con los requisitos”,
por el contrario, necesita simplemente que el sistema trabaje de la manera especificada en
algún documento. Esto deja abierta la pregunta de que si la definición de la capacidad de
ser correcto (“correctness”) que es proporcionada en el documento es correcta por sí
misma.
¿Cómo se relacionan las pruebas con la calidad? En un párrafo anterior, mencionamos que
las pruebas son como un medio para gestionar los riesgos de calidad. Vayamos un poco
más a fondo.
Suponga que ejecutamos un conjunto de pruebas las cuales encuentran muy pocos defectos.
En tal caso, deberíamos tener un nivel más alto de confianza en el sistema.
Suponga que ejecutamos un conjunto de pruebas y todas esas pruebas pasan, en este caso el
nivel restante del riesgo de la calidad es bajo, con la condición de que las pruebas fueron
diseñadas correctamente.
Suponga que ejecutamos un conjunto de pruebas y esas pruebas fallan. Esas pruebas nos
han proporcionado ahora la oportunidad de mejorar la calidad del sistema. Finalmente, si su
cobertura es adecuada entonces la totalidad del conjunto de pruebas nos dan una buena
evaluación de la calidad del sistema.
Por supuesto, esto nos lleva a la pregunta, “¿Estamos realmente probando las cosas
correctas?” Piense que las características de calidad son importantes para su sistema y por
consecuencia resultará un sistema el cuál es apto para el uso. Las características de calidad
como el rendimiento, la usabilidad, la fiabilidad y la exactitud. ¿Ha pensado en lo que son
todas esas características? ¿Está actualmente probándolas lo suficiente? ¿Cómo lo sabe?
Más adelante en este libro, veremos las formas de determinar las respuestas a esas
preguntas.
LO-1.2.2 Proporcionar ejemplos para los objetivos de las pruebas en las diferentes fases del
ciclo de vida del software. (K2)
Esta sección, ¿Qué son las Pruebas?, abordará los siguientes conceptos clave:
En muchos casos, las pruebas tienen uno o más de los siguientes objetivos generales:
Las pruebas podrían ser llevadas a cabo para encontrar defectos y luego proporcionar a los
programadores la información que ellos necesitan para corregir estos defectos. Los
programadores no resuelven todos los defectos usualmente, pero nuestra información
debería ayudarles a corregir al menos los defectos más importantes.
También es cierto, que las pruebas podrían ser llevadas a cabo para dar a la gente confianza
en el nivel de calidad del sistema. Cuando las compañías adquieren aplicaciones, éstas
ejecutan a menudo pruebas de aceptación para ganar la confianza previa al despliegue de la
aplicación en el centro de datos.
Así mismo las pruebas podrían ser llevadas a cabo para prevenir defectos. Esto le podría
parecer extraño a usted. Sin embargo, las pruebas previenen defectos cuando los probadores
están involucrados en las revisiones y cuando los diseños de las pruebas son completados
en paralelo con la implementación del sistema. Estas actividades de pruebas tempranas
crean ciclos de retroalimentación beneficiosos entre las actividades de pruebas y las
actividades de desarrollo, limpiando los defectos temprano en el ciclo de vida.
Finalmente las pruebas podrían ser llevadas a cabo para proporcionar información, obtener
una visión acerca de lo que realmente importa a la calidad del sistema sometido a pruebas.
¿Estamos listos para enviar? ¿Cuándo estaremos listos para enviar? ¿Cuáles son las áreas
de riesgo que todavía tenemos que abordar? ¿Cuáles son los problemas conocidos más
temidos?
Una vez que empecemos a generar información como esa, la información que conceda una
visión del nivel de calidad, podríamos ir tras el siguiente objetivo, el de ayudar a la gerencia
a comprender la calidad en el contexto de los objetivos más grandes del proyecto. Sólo
cuando la gerencia comprenda nuestros hallazgos y lo que estos significan en cuanto al
proyecto, podemos decir que como probadores estamos ayudando verdaderamente a
gestionar los riegos de calidad.
Esta lista de objetivos no es en absoluto exhaustiva, usted podría ser capaz de pensar en
otros objetivos que tuvo acerca de sus propios proyectos. Si es así, está bien.
Lo importante no es tanto los objetivos de pruebas que son escogidos, sino el alineamiento
de esos objetivos. Muchas cosas pueden salir mal aquí. Usted podría desalinear sus propios
planes y acciones como un profesional de pruebas con los objetivos de las pruebas que son
establecidos por la gerencia. Usted mismo podría verse forzado a tratar de alinear sus
planes y acciones con los objetivos de pruebas los cuales están sólo implícitos, no
declarados por la gerencia, conduciendo a problemas cuando usted se equivoque. Peor aún,
es posible que no haya un sólo conjunto de objetivos de pruebas consistente a través de toda
la gerencia, sino más bien un conjunto de objetivos de pruebas diferente y posiblemente
contradictorio a través de los diferentes jefes y otros accionistas.
Estos problemas de alineación son comunes y son problemas muy dañinos para los grupos
de pruebas.
Los objetivos de las pruebas pueden cambiar dependiendo de la fase o del nivel de pruebas
con el que estemos involucrados. Por ejemplo, considere el objetivo de las pruebas de
encontrar defectos o “bugs”.
Objetivo de prueba: Una razón o propósito para el diseño y la ejecución de una prueba.
Para las pruebas unitarias o de componente, usted podría encontrar defectos en las partes
individuales del sistema sometidos a pruebas antes de que las partes estén totalmente
integradas al mismo.
Para las pruebas de integración o cadena, es posible que quiera encontrar defectos en las
relaciones e interfaces entre los pares y grupos de componentes en el sistema sometido a
pruebas a medida que las partes se juntan.
Para las pruebas de sistema, es posible que quiera encontrar defectos en los
comportamientos, funciones y respuestas generales y particulares del sistema sometido a
pruebas en su totalidad.
Para las pruebas piloto o de aceptación, por lo general no deseamos encontrar defectos en
absoluto. Usualmente es un problema si encontramos defectos. Más bien, queremos
demostrar que el producto está listo para su despliegue o versión, o evaluar la calidad y dar
información acerca del riesgo del despliegue o la versión.
Finalmente, para las pruebas operativas, queremos buscar otra vez un tipo particular de
defectos, especialmente aquellos relacionados con las características no funcionales del
sistema como la fiabilidad o la disponibilidad, usualmente en el entorno en funcionamiento.
Como puede ver, un objetivo general debe ser adaptado a un objetivo específico basado en
el contexto en el cual es aplicado.
Por supuesto, queremos ser probadores de software, efectivos y eficientes, pero muchas
veces somos descuidados cuando usamos estas palabras, “efectivo” y “eficiente”. Veamos
si podemos definirlas estrictamente.
Por efectivo, queremos decir producir un resultado decidido, decisivo o esperado; notable.
Entonces para ser probadores efectivos, debemos seleccionar los objetivos correctos y los
resultados esperados. Para que todos concuerden con que somos efectivos, cada uno tendría
que estar de acuerdo con los objetivos.
Por eficiente, queremos decir productivo del efecto esperado, especialmente productivo sin
pérdida. Entonces para ser probadores eficientes, debemos asignar los recursos
adecuadamente. Los recursos incluirían el tiempo, ambos en cuanto al esfuerzo y la
duración, así como también al dinero y aquellas cosas que cuestan dinero.
Las pruebas, como hemos visto, tienen una serie de objetivos. Uno de esos objetivos es
encontrar defectos. Por supuesto, no encontramos realmente defectos al probar por lo
general. Encontramos fallas que han ocurrido, a menudo debido a defectos.
La depuración es una actividad específica, activada por el descubrimiento de una falla que
creemos que surge de un defecto. Implica la identificación de la causa raíz de un defecto.
Luego, la causa raíz es eliminada y el código reparado. Finalmente, la depuración, realizada
correctamente, incluye algún nivel de pruebas unitarias para comprobar si la reparación fue
correcta.
Una vez que la corrección de un defecto es devuelta al probador quién lo descubrió, ese
probador realiza luego la prueba de confirmación para asegurar que la falla observada
previamente haya sido resuelta. Esta prueba de confirmación es también referida como la
repetición de una prueba en el glosario del ISTQB.
Note que en este proceso hay diferentes responsabilidades. Los probadores prueban,
mientras que los programadores depuran.
Figura 1.1: Encontrar-Depurar-Confirmar
En la figura 1.1 se puede observar una vista gráfica del proceso de pruebas que detecta una
falla, los programadores depuran esa falla y los probadores realizan las pruebas de
confirmación.
Específicamente, el probador lleva a cabo los pasos del 1 al 3 del proceso, mostrados en la
parte superior del diagrama. A su vez, el probador comprueba para ver si el problema es
intermitente o reproducible. De igual forma, el probador comprueba para distinguir entre
una falla que surge de un defecto del sistema y una falla que surge debido a los casos de
prueba, datos de prueba inadecuados y así sucesivamente. Así también, el probador
comprueba para ver si diferentes valores de configuración o de datos podrían cambiar el
comportamiento de la falla. Esta información ayuda al programador en la depuración, por
lo tanto, el probador lo coloca en su informe de defectos.
Una vez que el programador acepta el informe de defectos, asumiendo que el defecto debe
ser corregido, él identifica la causa raíz. Él trata de repararlo sin producir más problemas.
Luego él realiza la prueba unitaria de la corrección.
Esto nos conduce a otra entrega, a través del proceso de versiones de las pruebas. Sin
embargo hablaremos acerca de esto más adelante al igual que de los informes de defectos,
esto debe ser bien definido.
Pruebas: El proceso que consiste en todas las actividades del ciclo de vida, tanto estáticas
como dinámicas, interesadas en la planificación, preparación y evaluación de los productos
de software y los productos del trabajo relacionados, para determinar que satisfagan los
requisitos especificados, para demostrar que son aptos para el propósito y para detectar
defectos.
Más antes mencionamos un problema común para los grupos de pruebas, aquél de las
expectativas desalineadas. Una de esas expectativas desalineadas ocurre cuando las
personas piensan en las pruebas meramente como la ejecución de pruebas contra el sistema,
a menudo justo en el final del proyecto.
Planificar y controlar.
Seleccionar las condiciones de las pruebas.
Diseñar los casos de prueba.
Comprobar los resultados de las pruebas.
Evaluar los criterios de salida.
Informar los resultados de las pruebas.
Tareas del cierre o fin de las pruebas.
1.2.1 Ejercicios
Ejercicio 1
Un programa acepta tres enteros que representan las longitudes de los lados de un
triángulo7.
Éste da como resultado “escaleno” (lados no iguales), “isósceles” (dos lados iguales), o
“equilátero” (tres lados iguales).
Argumente.
Primero, ¿Cubrió la entrada de datos válidos e inválidos? La mayoría de las personas que
han sido probadores por un tiempo son buenas en probar con los inválidos y de hecho
algunas veces enfatizan demasiado esas pruebas y no cubren importantes condiciones
válidas.
Segundo, ¿Cuáles pruebas ejecutaría primero? A algunas personas les gusta empezar con
las varias entradas inválidas, forzando muchas condiciones de error. Ese método está bien
para una aplicación estable, pero para aplicaciones menos estables es usualmente mejor
ejecutar primero algunos casos de prueba básicos válidos.
Note que nuestra solución es sólo una de un gran conjunto de posibles respuestas correctas.
Algunas reglas genéricas son encontradas en el libro de Myers para la determinación de un
buen conjunto de pruebas. Myers proporciona también soluciones para este ejercicio. Desde
que él escribió su libro en los días de los programas de mainframes de pantalla verde, él no
tuvo que cubrir algunas de las pruebas de interfaz de usuario que hemos incluido.
1, 2, 3 Un mensaje de error
5, 3, 2 Un mensaje de error
1, 2, 4 Un mensaje de error
0, 1, 2 Un mensaje de error
2, 2, 1 Isósceles
9, 5, 5 Isósceles
1, 2, 1 Un mensaje de error
2, 5, 2 Un mensaje de error
3, 1, 1 Un mensaje de error
2, 2, 0 Un mensaje de error
1, 1, 1 Equilátero
1, 1, -1 Un mensaje de error
0, 0, 0 Un mensaje de error
Primero, note que los tres enteros sólo pueden describir un triángulo cuando la suma de los
dos lados es mayor que el tercer lado, para todas las combinaciones posibles.
Probablemente podríamos terminar con seis pruebas en total para los posibles errores
lógicos, tres para cada posible longitud de lado que podría ser mayor que la suma de los
otros dos lados, tres por cada posible longitud de lado que podría ser igual a la suma de los
otros dos lados.
Segundo, note que un programador inteligente escribiría una función que validaría que al
programa le haya sido ingresado un entero y luego reutilizaría esa función para cada campo
de entrada. Entonces, sólo tendríamos que probar un carácter, un número real, un cero, un
entero negativo, un maxint+1, un desborde de búfer, un espacio al comienzo, un espacio al
final y un espacio en blanco, para nueve errores de entrada.
Entonces, ¿Cómo lo hizo? ¿Qué probamos nosotros que usted no probó? ¿Qué probó usted
que nosotros no probamos?
Si usted no encontró algunos de estos, no se sienta mal. Al final de este libro, podrá
identificar no sólo todas las pruebas de arriba, sino también pruebas en otras áreas de
riesgo.
Sin embargo, aún cuando haya leído el libro completamente, podría ser necesario que tenga
que consultar libros y notas para llegar a un conjunto completo de las pruebas. Tuvimos que
volver a leer el desarrollo del ejercicio de Myers para finalizar nuestra solución.
Esto apunta a un tema importante de este libro. La realización del diseño e implementación
de las pruebas sin material de referencia lleva a menudo a omisiones en las pruebas. La
realización del diseño y la implementación de las pruebas con restricciones apretadas y
estresantes respecto al tiempo que existen durante la ejecución de las pruebas, hacen que
tales omisiones sean aún más probables, aún para probadores experimentados. Esto subraya
la necesidad de un análisis, diseño y una implementación cuidadosa de las pruebas por
adelantado, en vez de basarse solamente en las técnicas exploratorias o informales. Hay un
lugar para las pruebas exploratorias en casi cada proyecto de pruebas, pero no como una
técnica principal de pruebas.
Esta sección, Principios Generales de las Pruebas, explicará los siguientes principios de las
pruebas:
Figura 1.2
Imagine que tiene una huerta hermosa. Está particularmente orgulloso de sus tomates. Un
día caminando a través de su huerta usted ve todas las ramas del tomate desprovistas de sus
hojas, quedando sólo con sus tallos.
Siendo un jardinero experimentado, sabe lo que está pasando. “Oh no,” piensa usted
“¡tengo gusanos picudos!” A propósito, un gusano picudo, es el gusano desagradable que se
muestra en la figura 1.2.
Muy bien, hasta esta parte usted sabe ciertamente que tiene insectos en su jardín. No
necesariamente ha visto los gusanos picudos, sin embargo ha visto sus inconfundibles
huellas.
Pero, considere esto: si no hubiera visto las huellas, ¿Podría estar seguro de que no tuviera
insectos? Tal vez pudiera estar bastante seguro de que no tenía gusanos picudos, sin
embargo ¿Qué hay de otros insectos?
Algunos insectos son fáciles de detectar otros no. Las pruebas son como caminar por su
huerta. Esto puede revelar la presencia de insectos, pero no puede probar la ausencia de
ellos.
Esto nos lleva al siguiente principio de las pruebas, el cual es que las pruebas exhaustivas
son imposibles.
Desafortunadamente, mucha gente piensa que la misión del equipo de pruebas es, “Sólo
asegurar que el software funcione antes de enviarlo”. Este privilegio es completamente
imposible por razones que son bastante fáciles de formular.
Por otro lado, no son sólo flujos de control. Los programas existen típicamente para
manipular datos, muchas veces datos complejos. Entonces, tenemos también grandes y
complejos flujos de datos en los programas. Algunos de estos flujos encaminan los datos
dentro de otras áreas funcionales del sistema. Algunos de estos flujos encaminan los datos
dentro de las bases de datos, de donde son entonces extraídos y utilizados más adelante.
Finalmente, los usuarios utilizan software de varias formas, algunas de las cuales son muy
difíciles, sino imposibles de predecir. Los usuarios utilizan software en varias
configuraciones de campo, algunas de las cuales ni siquiera existen en el momento de las
pruebas.
Eso dicho, estas expectativas de que uno puede probar exhaustivamente, o reducir la
probabilidad de un defecto no descubierto a cero, son muy, muy comunes. De hecho,
cuando hacemos evaluaciones para clientes, NO es raro encontrar esas expectativas
equivocadas.
A su vez, estas expectativas equivocadas crean problemas para los profesionales y equipos
de pruebas. Por un lado, crean demandas altas e inalcanzables en el grupo de pruebas. Por
otro lado, los grupos de pruebas operan típicamente como una organización de servicios, y
las organizaciones de servicios son típicamente percibidas como incompetentes por sus
clientes cuando las demandas—razonables o de otra forma—no son cumplidas.
Entonces, los probadores deben estar listos para comunicar cómo las pruebas pueden
contribuir y calmar las expectativas equivocadas. Además, debemos utilizar palabras que
los interesados del negocio del proyecto entenderán. Afortunadamente este libro le ayudará
a aprender eso.
Otro principio de las pruebas es el beneficio del temprano aseguramiento de la calidad y las
pruebas tempranas. En pocas palabras, este principio dice que el daño de los defectos
aumenta entre más tiempo estén en el sistema.
Para ampliar esto, el costo de un defecto tiende a aumentar a medida que el proyecto
continúa. El aumento es generalmente más multiplicativo que aditivo, es decir, tiende a
incrementarse el doble o el triple o más de una etapa a la siguiente.
Además, dado que la mayoría de los costos asociados con los defectos de una pre-versión
tienden a estar asociados con el esfuerzo necesario para eliminarlos, costos más altos
significan cronogramas más largos. En otras palabras, el daño no es sólo financiero, sino
también un daño al cronograma.
Finalmente, debido a que las actividades del aseguramiento de la calidad y de las pruebas
tienden a actuar como un filtro, ignorando alguna proporción de defectos los cuales están
presentes, mientras más defectos están presentes durante una actividad del aseguramiento
de la calidad o de las pruebas, más defectos se escaparán de esa actividad.
Figura 1.3: Beneficios del Temprano Aseguramiento de la Calidad y las Pruebas
Tempranas
Esta figura tiene una gráfica muy rica en información que ilustrará el principio de los
beneficios del temprano aseguramiento de la calidad y las pruebas tempranas.
Recomendamos que estudie este gráfico por un momento antes de ver nuestra explicación
acerca de éste. El gráfico es complejo, pero le llevará a una comprensión amplia y profunda
de este principio.
En primer lugar, se ve que el ciclo de vida del desarrollo se presenta como una gran “V”.
En la parte superior izquierda, aparece el concepto del sistema. A través de la
descomposición progresiva, perfeccionamos ese concepto en los requisitos, luego, en un
diseño y finalmente en una implementación. Subiendo por el lado derecho de la V,
realizamos tres niveles de pruebas, pruebas unitarias, pruebas de integración y prueba de
sistema. En la parte superior derecha, entregamos el sistema a la producción.
En el interior de la “V”, vemos los costos de la eliminación de un defecto en cada fase del
ciclo de vida. Tenga en cuenta el aumento multiplicativo. Estos números son hipotéticos.
Sin embargo, la magnitud del aumento de una fase a la siguiente es, en algún caso,
conservadora.
En el exterior de la “V”, vemos seis tablas. Cada tabla tiene dos columnas y dos filas. Las
columnas de la izquierda se refieren a la acumulación e introducción de defectos. Las
columnas de la derecha están relacionadas con la eliminación de defectos, tanto en
porcentajes como en números absolutos.
En las cajas del lado izquierdo de la V, vemos “Rev.” en el centro. Esto significa que las
revisiones se utilizan para detectar y eliminar defectos. Concretamente las revisiones de
requisitos, revisiones de diseño y revisiones de código.
En las cajas del lado derecho de la V, vemos “Prueba” en el centro. Esto significa que las
pruebas se utilizan para detectar y eliminar los defectos. Concretamente pruebas unitarias,
pruebas de integración y pruebas del sistema.
También vemos que mientras los defectos se escapan de una fase a la siguiente, ellos son
amplificados en la parte izquierda de la V. Esto significa que un defecto en los requisitos
resulta más que un defecto en el diseño, y que un defecto en el diseño resulta más que un
defecto en la implementación. Una vez que entramos en las fases de pruebas, no ocurren
más amplificaciones de defectos.
Este diagrama así muestra el flujo de defectos a través del ciclo de vida. Los defectos son
introducidos. Los defectos son detectados y eliminados. Los defectos se escapan a la
siguiente fase.
¿Listo? Bien, entonces abajo en la figura encontrará las respuestas a estas preguntas.
Figura 1.4: Solución del Ejercicio de la Figura 1.3
Como puede observar en esta figura presentamos la solución del ejercicio de la figura 1.3.
Antes de explicarle las tres soluciones asumamos que el costo de la eliminación de un
defecto en la fase de requisitos es de US$ 1.
Solución de la segunda pregunta: Hemos visto que si realizamos las pruebas de revisión,
requisitos y diseño entonces encontraríamos los defectos y los eliminaríamos como en la
figura 1.3.
Para saber cuánto de dinero nos ahorramos si no realizamos estas actividades entonces es
necesario de suponer que al no realizar las revisiones ni en los requisitos ni en el diseño y ni
en la implementación eso hace que dejemos todos los defectos acumulándose hasta después
de la fase de implementación, primeramente dejamos que los 90 defectos en los requisitos
se queden sin corregir y luego pasando a la fase de diseño se amplifican en número con el
factor de 1.5 a 90x1.5=135 más los nuevos que aparecieron en la fase de diseño, es decir,
135+120=255 defectos acumulados sin corregir. Pasando a la fase de implementación los
defectos acumulados también se amplifican con un factor de 1.5 a 255x1.5=383 defectos
más los nuevos, 150, que aparecieron en esta fase, haciendo un total de 150+383=533
defectos en total acumulados sin corregir hasta la fase de implementación y pasando a la
fase de pruebas de unidad si lo seguimos dejando estos mismos defectos ya no se
amplifican pero se acumulan junto con los nuevos 10 que aparecieran en esta misma fase
haciendo un total de 10+533=543 defectos acumulados sin corregir. Si ya comenzamos a
corregir recién en esta fase que es la de pruebas unitarias, entonces nuestro costo sería un
poco más costoso por que comenzamos tarde en el ciclo a encontrar y corregir todos estos
defectos acumulados, supongamos que aquí corregimos sólo el 50% de los defectos que es
usual según las estadísticas de Capers Jones, es decir corregimos 272 defectos solamente
pero aquí el costo es x10 veces más por defecto a corregir, entonces el costo es de US$
2.272, luego pasando a las pruebas de integración no hay amplificación de defectos y
adicionando los nuevos 10 que aparecieron entonces obtenemos 271+10=281 defectos
acumulados, de estos corregimos solamente un 50%, es decir 141 defectos con un costo de
50 veces más, 141x50=US$ 7.050, nos quedan 150 con los cuales pasamos a la fase
pruebas de sistema, si corregimos allí con una efectividad del 50%, es decir corregimos
sólo 75 defectos el costo se elevaría a 100 veces más por defecto, el costo sería de 75 x US$
100 = US$ 7.500, nos quedan 75 defectos con los que pasaríamos a la fase de
despliegue/producción/entrega, allí el costo por corrección de defecto es de x1.000 veces
más, entonces el costo sería de 75xUS$ 1000=US$ 75.000. Sumando los costos de
corrección de defectos desde la fase de pruebas unitarias tendríamos un gasto total de US$
92.270.
Entonces para saber cuánto dinero ahorramos al comenzar con las revisiones y corrección
de defectos desde los requisitos, encontramos la diferencia entre US$ 92.270 y US$ 25.167,
obtenemos US$ 67.103, que es el valor neto que nos ahorraríamos al realizar las revisiones.
Otro principio general de las pruebas es el agrupamiento de defectos. Esto significa que los
defectos no son distribuidos aleatoriamente y de manera uniforme en el sistema, sino que se
agrupan.
Éste es un principio muy bien conocido que data de varias décadas. IBM, en estudios desde
la década de los setenta, encontró que en su sistema operativo MVS, el 38% de los defectos
ocurrían en el 4% de los módulos. Así mismo, para su base de datos IMS, el 57% de los
defectos estaban en el 7% de los módulos.
Como una cuestión práctica, esto puede hacer que el mantenimiento de software sea una
verdadera pesadilla. El experto en la industria del software Capers Jones informa que la
presencia excesiva de módulos propensos a errores puede causar una reducción del 50% de
la productividad en el mantenimiento del software.
En esta figura, usted puede observar un análisis que hicimos hace sólo unos pocos años
atrás que muestra el mismo principio. El proyecto fue para un proyecto de un dispositivo de
internet. Primero que nada, déjenos explicar este diagrama.
Un diagrama de Pareto ordena las causas desde las más frecuentes a la menos frecuente,
con las causas más frecuentes al lado izquierdo. En la parte superior va un porcentaje
acumulativo, el cual es el porcentaje de resultados asociados con la causa de abajo y a la
izquierda.
En este diagrama, podemos ver que el 28% de los defectos estaban en el componente OSS.
El 50% de los defectos estaban juntos en el Navegador y los componentes OSS; es decir, el
otro 22% estaban en el navegador. Si considera los componentes OSS, el navegador y los
de correo electrónico, ellos hacen más de los 2/3 de los defectos.
Estudie el diagrama cuidadosamente por un momento y podrá ver cuán desigual es la
distribución de defectos.
Otro principio de las pruebas es la llamada “paradoja del pesticida”. Para explicar esto,
regresemos a nuestra metáfora de la huerta.
Recuerde que cuando nos fuimos, sus arbustos de tomate estaban sufriendo una infestación
del gusano picudo. Entonces, supongamos que fumiga su huerta con pesticida,
específicamente el material mostrado en esta figura, que es la estructura molecular del
malatión8.
¡Qué bien! Los gusanos picudos mueren. Sin embargo, el malatión, si bien es un pesticida
útil, no mata todos los insectos. Si continúa utilizando el malatión, los insectos que puede
matar serán cada vez menos, mientras que los insectos que no puede matar no se verán
afectados.
Así como los pesticidas se vuelven menos eficaces, también las pruebas. La ejecución de
las mismas pruebas una y otra vez encontrará gradualmente menos defectos. La ejecución
de un tipo de prueba no encontrará otros tipos de defectos. Por ejemplo, utilizando las
pruebas funcionales no se encontrarán defectos de rendimiento.
Por lo tanto, tendrá que intentar con nuevas técnicas de pruebas—si el objetivo es encontrar
defectos. Recuerde, las pruebas también tienen como objetivos la construcción de
confianza, la reducción de riesgos y otros objetivos. Esos objetivos podrían ser bien
atendidos por la ejecución de pruebas que no encuentran defectos.
Consideremos, por ejemplo, las pruebas de regresión. Las pruebas de regresión encuentran
relativamente pocos defectos, pero sí construyen la confianza de que un determinado
conjunto de cambios no ha dañado otras partes del sistema.
Estas dos imágenes comparan las eficiencias de los 11 mejores juegos de pruebas que
encontraron defectos (de 27). La gráfica de arriba muestra la primera vez que el juego de
pruebas ha sido ejecutado. La gráfica de abajo muestra los resultados para la quinta vez que
el mismo juego de pruebas ha sido ejecutado. La eficiencia media del juego de pruebas en
la primera pasada. 0,4, es utilizada como el punto de cruce de ejes en ambas gráficas, Con
una excepción, los mismos juegos de pruebas están en los 11 mejores juegos de pruebas,
los cuales muestran nuevamente la agrupación de los defectos. Sin embargo, todos los
juegos de pruebas son menos efectivos después de cinco ejecuciones.
Figura 1.7: Histograma que Clasifica las Eficiencias de la Ejecución de Varios Juegos
de Prueba
Bueno, esta figura muestra dos análisis idénticos. Cada análisis muestra un histograma que
clasifica las eficiencias de la ejecución de varios juegos de prueba durante el proyecto de un
dispositivo de Internet.
El resultado Defecto/Hora Ponderado para cada juego de prueba examina la tasa del
hallazgo de los defectos, con los defectos ponderados por la severidad y prioridad. Observe
que hemos normalizado por el tiempo de ejecución, el cual toma en cuenta el esfuerzo total
distinto para los juegos de prueba.
En cada análisis, se muestra una barra individual en el histograma para los 11 mejores
juegos de prueba que encuentran defectos basados en esta métrica de eficiencia. Los otros
16 juegos menos eficientes son agrupados como “Todos los Demás” en la extrema derecha.
El gráfico superior muestra los puntajes de eficiencia para los juegos de prueba la primera
vez que el conjunto de juegos de prueba ha sido ejecutado. El gráfico inferior muestra los
resultados de la quinta vez que el mismo conjunto de juegos de prueba ha sido ejecutado.
La segunda cosa que notamos en este gráfico es la paradoja del pesticida. Después de la
quinta ejecución, comparamos la eficiencia de cada juego de prueba contra el promedio de
la eficiencia de los mismos durante la primera ejecución.
Aquellos que son más eficientes que el promedio de la eficiencia de la primera ejecución
están por encima de la línea; aquellos menos eficientes están por debajo. Tenga en cuenta
que sólo dos juegos de prueba son más eficientes en la quinta ejecución que el promedio de
la primera ejecución. Además, si compara las eficiencias de cada juego de prueba para la
primera ejecución contra la quinta ejecución, observará que todos los conjuntos de prueba
son menos efectivos después de las cinco ejecuciones.
Esto parece algo contra-intuitivo, pero es confirmado una y otra vez. Un montón de
productos con pocos defectos han fracasado en el mercado al competir con otros productos
con más defectos que sin embargo, tenían otros atributos que eran más importantes para los
interesados del negocio.
Por lo tanto, aquí hay un punto clave: Los proyectos exitosos equilibran las fuerzas que
compiten en cuanto a las características, el cronograma, el presupuesto y la calidad. Esto
significa que debemos comprender que a veces, la versión temprana con defectos conocidos
es mejor que la versión posterior con menos defectos.
El último principio de las pruebas es que las pruebas deben adaptarse al contexto, la
situación en la cual son llevadas a cabo. Diferentes proyectos, organizaciones y productos
tienen diferentes necesidades de las pruebas y tenemos que identificar y servir a esas
necesidades para ser exitosos.
Esto es sentido común, pero, como dijo Mark Twain, el sentido común es
desafortunadamente no muy común.
Algunas personas llevan este principio a los extremos, y piensan que cada proyecto es
completamente único. Se obsesionan con lo que es específico, lo que los ciega a la
posibilidad de aplicar las buenas ideas de otros proyectos, organizaciones y productos. No
se equivoque. Existen las mejores prácticas de pruebas. Hablaremos de ellas en este libro.
Sin embargo, cada una de estas mejores prácticas es una práctica general que debe ser
adaptada a su proyecto. En algunos casos, por razones específicas, una buena práctica no
aplicará a un proyecto particular. Nosotros le ayudaremos a reconocer esas situaciones en
este libro.
Esta necesidad de aplicar con inteligencia y adaptar las mejores prácticas de pruebas es
crítica. El fracaso de adaptar el equipo de pruebas y sus métodos a las necesidades
específicas que están a la mano es una razón común para la disolución de los equipos de
pruebas. Una vez más, las pruebas son una organización de servicios, por lo general, lo que
significa que los servicios proporcionados deben ser los servicios necesitados.
1.3.1 Ejercicios
Ejercicio 1
Haga una lista de los principios de las pruebas que recuerda que hayan sido vistos.
Haga una lista de los principios de las pruebas que recuerda que no hayan sido vistos.
Argumente.
La mayoría de la gente se da cuenta de que las pruebas dependen del contexto y tienen que
adaptarse a las realidades. De hecho, si existe alguna, la gente tiende a llevar este principio
a los extremos y utilizar la frase “somos diferentes” como un llamado para los atajos y
violaciones de las mejores prácticas. Tiene que adaptar su método de pruebas a cada
proyecto, pero recuerde que muchas reglas generales se aplican.
Un tema común es el exceso de confianza en las pruebas de la etapa final como una
panacea de la calidad en los proyectos en los que hemos trabajado, con los equipos que
hemos realizado consultoría y la gente que hemos entrenado. Esto viola tres principios de
las pruebas: las pruebas demuestran la presencia de defectos (pero no demuestran su
ausencia); las pruebas tempranas ayudan a prevenir defectos y ahorrar dinero; y la falacia
de la ausencia de errores (es decir, el intento de probar la calidad del sistema al final).
Algunos de los otros principios de las pruebas pueden haber sido operables pero no vistos.
Por ejemplo, el agrupamiento de defectos ocurre ya sea si sabe acerca de ello o no. Puede
encontrar los agrupamientos de defectos utilizando un sistema de seguimiento de defectos y
un análisis de causa raíz para reunir datos acerca de los defectos.
LO-1.4.1 Recordar las cinco actividades de pruebas básicas y las tareas respectivas desde la
planificación hasta el cierre de pruebas. (K1)
Esta sección, Proceso de Pruebas Básico, cubrirá los siguientes conceptos clave:
Repetición de pruebas: Pruebas que ejecutan los casos de prueba que fallaron la última
vez que se ejecutaron, con el fin de verificar el éxito de las acciones correctivas.
Base de prueba: Todos los documentos de los cuales los requisitos de un componente o
sistema pueden ser deducidos. La documentación acerca de la cual los casos de prueba se
basan. Si un documento puede ser enmendado, sólo por medio de un procedimiento de
enmienda formal, entonces la base de pruebas se denomina base de pruebas congelada.
Condición de prueba: Un ítem o evento de un componente o sistema que pudiera ser
verificado por uno o más casos de prueba, p.ej., una función, transacción, característica,
atributo de calidad o un elemento estructural.
Datos de prueba: Datos que existen (por ejemplo, en una base de datos) antes que una
prueba sea ejecutada, y que afectan al componente o sistema sometido a pruebas o son
afectados por estos.
Política de pruebas: Un documento de alto nivel que describe los principios, métodos y
objetivos principales de la organización con respecto a las pruebas.
Estrategia de pruebas: Una descripción de alto nivel de los niveles de pruebas que deben
ser realizados y las pruebas en esos niveles para una organización o programa (uno o más
proyectos).
Juego de prueba: Un conjunto de varios casos de prueba para un componente o sistema
sometido a pruebas, donde la poscondición de una prueba es utilizada a menudo como una
precondición para la siguiente.
Informe del resumen de pruebas: Un documento que resume las actividades de las
pruebas y los resultados. También contiene una evaluación de los ítems de las pruebas
correspondientes contra los criterios de salida.
El programa de estudios del ISTQB nivel básico propone un framework genérico del
proceso de pruebas. Éste es no prescriptivo, porque no impone un esquema de madurez y
reconoce el potencial de omisión de algunos elementos del framework en algunas
circunstancias.
Planificación y control.
Análisis y diseño.
Implementación y ejecución.
Evaluación de los criterios de salida de las pruebas y la creación de informes.
Cierre de pruebas.
Dado que el proceso de pruebas tiene que ser adaptado al ciclo de vida del software, el
proceso permite la superposición, la concurrencia e incluso la iteración en estos pasos.
La figura 1.9 muestra una posible instancia del proceso de pruebas básico del ISTQB. Las
actividades que son principalmente de gestión están representadas por el área de puntos,
mientras ésas que son principalmente actividades de contribuyente individual están
representadas por el área de líneas horizontales. El cierre, que es tanto de gestión como
individual, está representado por el área de líneas verticales.
La distribución del tiempo es consistente con un proyecto de ciclo de vida secuencial, el
cual se abordará más adelante.
En esta sección, revisaremos más de cerca a cada uno de estos pasos, incluyendo la
descripción de las principales actividades que componen cada paso. Estas actividades y las
tareas que las componen, serán descritas, con frecuencia en detalle, en los capítulos del 2 al
6 de este libro.
Determinar el alcance de las pruebas, los riesgos, los objetivos y las estrategias.
Determinar los recursos de las pruebas necesarios.
Implementar las estrategias de las pruebas.
Crear un cronograma del análisis y el diseño de las pruebas.
Crear un cronograma de la implementación, la ejecución y la evaluación de las
pruebas.
Determinar los criterios de salida de las pruebas. El control incluye las siguientes
actividades:
Medir y analizar los resultados.
Monitorear y documentar el progreso, la cobertura y los criterios de salida de las
pruebas.
Iniciar acciones correctivas.
Tomar decisiones.
Revisar la base de pruebas. La base de pruebas es aquella en la cual las pruebas se basan,
con frecuencia, incluyendo los requisitos o las especificaciones de diseño, las arquitecturas
de red o sistema o los riesgos de calidad.
Identificar y priorizar las condiciones de pruebas, los requisitos de pruebas o los objetivos
de pruebas y los datos de prueba necesarios. Esto requerirá a menudo un análisis de los
ítems de pruebas, así como su comportamiento, especificación y estructura. Por supuesto,
estos ítems podrían no existir todavía, entonces usted podría estar dependiendo de sus
descripciones, así como los casos de uso.
Comprobar los registros de las pruebas contra los criterios de salida de las pruebas
especificados durante la planificación de pruebas.
Evaluar si son necesarias más pruebas o si los criterios de salida especificados
deben ser modificados.
Escribir un informe del resumen de las pruebas para los interesados del negocio.
A medida que la ejecución de las pruebas llega a un cierre, los criterios de salida
han sido cumplidos y los informes finales de los resultados de las pruebas son
recopilados, las actividades del cierre comienzan a ocurrir, lo cual consiste en
actividades de gestión y actividades de contribuyente individual, incluyendo:
1.4.1 Ejercicios
Ejercicio 1
Note cuáles de los pasos y tareas del proceso de pruebas del ISTQB fueron llevados a cabo.
Note cuáles de los pasos y tareas del proceso de pruebas del ISTQB no fueron llevados a
cabo.
Argumente.
No podemos hablar acerca de su último proyecto, pero hemos visto muchos patrones en el
uso correcto e incorrecto de estos pasos del proceso de pruebas en los proyectos en los que
hemos trabajado y realizado consultoría, y nos hemos basado en las centenas de
argumentaciones en clase acerca del proceso de pruebas.
Es común que la planificación y el control, junto con el análisis y el diseño, sean realizados
incorrectamente, en el último minuto o nada en absoluto. Por supuesto, mientras la
planificación ocurre idealmente al principio de un proyecto, el control superpone todas las
etapas del esfuerzo de las pruebas.
En cuanto a la evaluación del criterio de salida y creación de los informes de pruebas, los
mejores proyectos en los que hemos trabajado han tomado seriamente los criterios de salida
y han escuchado cuidadosamente a los informes del estado de las pruebas. Eso no quiere
decir que el equipo del proyecto siguió siempre nuestras recomendaciones; tendemos a ser
un jefe conservativo, en contra de los riesgos, mientras que muchos jefes de proyectos se
sienten cómodos aceptando niveles de riesgos más altos. Sin embargo me desconcierta
cuando los jefes de proyectos ignoran los hallazgos de las pruebas y no tienen criterios
objetivos para la versión. ¿Qué sentido tiene realizar las pruebas en absoluto si no utiliza la
información valiosa y ganada para guiar el proyecto al éxito?
De todas las partes del proceso del ISQTB, las actividades del cierre de pruebas, a menudo
son las más saltadas o truncadas. En algunos casos, esto tiene sentido. Sin embargo, cuando
un proyecto siguiente—así como un proyecto de mantenimiento—tiene que tratar de
reutilizar los casos de prueba y otros entregables de pruebas, algún esfuerzo es esencial
para conducir las pruebas a una conclusión ordenada.
LO-1.5.1 Recordar los factores psicológicos que influencian el éxito de las pruebas. (K1)
Curiosidad.
Pesimismo profesional.
Un ojo crítico.
Atención al detalle.
Buenas habilidades de comunicación.
¿Entonces, cuáles son estas habilidades más difíciles que un probador debe tener?
Bueno, por supuesto, un probador debe tener las habilidades profesionales básicas como la
lectura y la escritura. La lectura es importante porque los probadores pasan mucho tiempo
analizando las especificaciones, leyendo y respondiendo los mensajes de correo electrónico,
revisando los casos de prueba de los demás y así sucesivamente. La escritura es importante
porque los probadores pasan tiempo escribiendo los casos de prueba, los informes de los
defectos, los informes del resumen de las pruebas y varios otros documentos relacionados
con las pruebas.
Más allá de estas habilidades profesionales básicas, buscamos un probador que tenga
habilidades en tres áreas principales: la tecnología, el dominio del negocio de la aplicación
y las pruebas:
Las habilidades del dominio de la aplicación están relacionadas con la banca, los factores
humanos, las aplicaciones de escritorio o cualquier área de negocios o problemas que la
aplicación está tratando de resolver. Básicamente, éstas son habilidades de los usuarios y
los analistas de negocios, y los usuarios antiguos y los analistas de negocios pueden llegar a
ser buenos probadores.
Por último, en el área de las pruebas, es importante que la gente reconozca a las pruebas
como un área profesional especial con su conjunto único de habilidades. Éstas incluyen la
escritura de guiones, el diseño de pruebas, la habilidad de explorar y atacar un sistema, la
creación y la utilización de herramientas de pruebas, la construcción de modelos de
rendimiento, la redacción de buenos informes de defectos y más.
Como una regla general, las organizaciones involucradas en la creación de software para el
uso interno tienden a poner demasiado énfasis en el conocimiento del dominio. Las
organizaciones que venden software tienden a poner demasiado énfasis en los
conocimientos técnicos. La mayoría de las organizaciones tienden a subestimar el
conocimiento de las pruebas.
Esto no quiere decir que los programadores no puedan probar su propio código. Ellos
pueden y deberían realizar las pruebas unitarias, y típicamente deberían participar en las
pruebas de integración. Sin embargo, la mayoría de los programadores tienen la mentalidad
incorrecta para realizarlo efectivamente. Ellos buscan la confirmación de que lo que han
construido funciona, lo cual tiende a limitar psicológicamente su efectividad en el hallazgo
y la eliminación de los defectos.
Ahora, estamos seguros de que hay múltiples razones de por qué existe esta gran diferencia
en la eficacia de la detección de los defectos. Una de esas razones es que la separación de
las funciones (a través de un equipo de pruebas independiente) ayuda a centrar las pruebas
en algo más que “confirmar que funcionan”. De hecho, como se comentó anteriormente,
hay una serie de objetivos de las pruebas que podríamos tener, y la construcción de la
confianza en el sistema es sólo uno de ellos.
Otras razones es que los probadores profesionales son más efectivos en las actividades de
las pruebas. Eso tiene sentido, ¿cierto? Usted trabaja para llegar a ser bueno en algo, usted
llega a ser bueno en esto, ¿no?
Esto es especialmente cierto en cuanto a encontrar fallas. No sólo los probadores tienen
habilidades en estas áreas, sino que también son más objetivos y no tienen la parcialidad del
autor. Después de todo, los defectos más difíciles de encontrar serán aquellos que salgan de
las suposiciones incorrectas, y el autor de algo tendrá las mismas suposiciones—correctas e
incorrectas—que él formuló en sus pruebas. Una mezcla de suposiciones del probador
podría consistir en una proporción igual de suposiciones correctas e incorrectas, pero por lo
menos es probable que él tenga un conjunto diferente de suposiciones e improbable de
compartir todas las mismas suposiciones incorrectas como las del autor.
Así que si bien es importante reiterar que los programadores pueden y deberían probar su
propio código, deberíamos reconocer a ese profesional, los probadores independientes son
generalmente mejores en las pruebas que los programadores, particularmente cuando un
objetivo clave de las pruebas es encontrar defectos (lo cual los probadores lo hacen por
medio del hallazgo de las fallas).
En el nivel más bajo de la independencia, tenemos las pruebas por medio del autor del ítem
de pruebas. Esto puede ser algo efectivo, con la condición de que el autor cultive la correcta
perspectiva mental de las pruebas. Las habilidades del probador faltarán normalmente.
Podemos dejar que otra persona o grupo de personas del mismo equipo haga las pruebas.
Aquí tendemos a perder algunas de las cuestiones de parcialidad del autor, pero todavía
estamos sujetos al pensamiento de grupo. Adicionalmente, las dinámicas de la
organización—de lo cual nos ocuparemos más en el capítulo 5 acerca de la gestión de
pruebas—pueden introducir presiones sobre la gente para que no critiquen el trabajo de sus
colegas o causar dificultades en el equipo. Además, estamos hablando usualmente de un
probador aficionado, así que otra vez las habilidades de las pruebas estarán faltando
frecuentemente.
Podemos tener las pruebas por una persona o personas de un equipo diferente o por
especialistas de pruebas. Ahora, probablemente podemos ver alguna reducción del
problema de la brecha de las habilidades en las pruebas. Dependiendo de la estructura
organizacional, se pueden reducir algunas de las presiones hacia la conformidad y lejos del
desacuerdo. Empezamos a ver, en esta situación, un riesgo de la desconexión de la
comunicación y el desalineamiento de los objetivos entre el equipo de pruebas y el equipo
de desarrollo, el cual debe ser gestionado cuidadosamente.
En el más alto nivel de independencia, tenemos las pruebas por medio de una persona o
personas de una organización o empresa diferente. Podemos tener ahora probadores con
habilidades, profesionales con la plena libertad para dar una evaluación honesta sin temor a
reacciones adversas.
Como puede ver, a lo largo de este espectro hay varios pros y contras. No es que una
solución sea correcta y la otra equivocada, sino que las fortalezas y debilidades de cada
método deben ser gestionadas y reforzadas. Una forma de hacerlo es garantizando las
pruebas por una variedad de Participantes, con diversos grados de independencia, en todo el
ciclo de vida.
Uno de los retos clave psicológicos y sociales, el cual es especialmente urgente para el jefe
de pruebas, es la necesidad de tener objetivos de pruebas claros.
Como hemos mencionado en una sección anterior y nuevamente más antes en esta sección
y habiendo expuesto con claridad, los objetivos bien alineados para las pruebas es crítico.
Esto es así porque la gente y los proyectos son usualmente dirigidos por objetivos.
No es como cuando las personas se reúnen un día y dicen: “¡Oigan!, yo sé, ¡hagamos un
proyecto!” Y otro responde: “Sí, claro, ¿Qué pasa si también tenemos una gran presión de
tiempo y horas extras pagadas al final?” Y otro aún respondiendo,”¡Oh, sí, eso sería
genial!”
No, los proyectos son emprendidos por motivos. Las metas y los objetivos del proyecto
existen, aunque a veces estos no están claramente expresados. En esos casos, estos no
podrían ser compartidos a través de los participantes del proyecto.
Incluso cuando estos objetivos están definidos, generalmente no hay métricas para el éxito.
Es decir, si las pruebas deberían encontrar defectos, ¿Qué porcentaje de los defectos
deberían encontrar? Si las pruebas son para dar confianza, ¿A qué nivel y cómo debería ser
medido eso?
Por esta razón, a menudo recomendamos una política de pruebas. Una política de pruebas
es un documento corto, un documento de dos a tres páginas que puede ayudar a definir
claramente los objetivos de las pruebas y alinear las pruebas a través de toda la
organización. Hemos trabajado con una serie de clientes para ayudarles a poner en práctica
políticas de pruebas, y esas políticas les fueron de mucha ayuda.
Un desafío psicológico por igual para los probadores y los jefes de pruebas es la capacidad
de enfocar la atención en las cosas correctas en el momento correcto. Hay dos clases de
problemas de enfoque:
La distracción de las tareas clave. Por ejemplo, el no prestar mucha atención mientras se
está ejecutando un guión de pruebas y no darse cuenta de una cantidad excesiva de acceso
al disco.
La persecución de las cuestiones con una mente estrecha, entonces se pierden de vista las
prioridades más importantes. Por ejemplo, el comienzo de una ejecución de una prueba en
un área poco probable que contenga defectos serios justo después de encontrar un defecto
mayor en un área diferente del sistema, en lugar de elegir una prueba en un área del sistema
relacionada con la falla recién observada.
Algunos probadores que encuentran fallas son percibidos como si criticaran al producto o el
autor y también se da el caso que algunos probadores se comunican de una manera que
agrava esto. Es de vital importancia para los probadores en comunicarse de manera
constructiva y positiva.
A veces, las pruebas son vistas como una actividad destructiva, sin embargo, realizadas
correctamente, las pruebas son esenciales para la gestión de riesgos del producto. No es que
los probadores pusieran los defectos en el producto, simplemente sacan a la luz la
información importante acerca de la presencia de los defectos.
Una importante regla psicológica y social es que los equipos de proyecto deben reconocer
la diferencia entre hacer un daño, señalar un daño y eliminar un daño. Debería estar claro
quién es responsable de cada tarea, y también debería quedar claro para todo el equipo que
los probadores están allí para ayudar a alcanzar el mejor resultado posible.
Por un lado, enfatizar que su objetivo como un probador profesional es de colaborar con el
equipo para una mejor calidad, no hablar constantemente acerca de los problemas, no hacer
que la gente se sienta estúpida o no tener razón acerca de lo deficiente que es el producto.
Comuníquese neutralmente acerca de los hechos, sin crítica del producto o de la gente
involucrada. Evitando que la gente se ponga a la defensiva, porque ellos dejarán de
escucharle si eso ocurre. Eso significa que usted sería inefectivo en su rol.
Comprender a sus colegas y observar cómo reaccionan a sus hallazgos. ¿Cuál es la mejor
manera de comunicar malas noticias a cada persona con la que trabaja? Adapte su mensaje
para una entrega efectiva.
Asegúrese que usted es claro y confirme que sus colegas entendieron lo que dijo. Confirme
que usted entiende a sus colegas. La comunicación deficiente ocurre. Las comunicaciones
deficientes no son divertidas.
También es importante tomar en cuenta que la presión de los cronogramas puede agravar
este problema de transferencia. Esto significa que, durante el período de las típicas pruebas
de sistema en el final del proyecto, la tendencia humana de reaccionar negativamente a las
malas noticias estará en su peor momento. Esa es necesariamente una noticia reconfortante,
pero por lo menos podemos tratar de comportarnos de acuerdo a esa situación.
1.5.1 Ejercicios
Ejercicio 1
Reflexione acerca de las actitudes y los comportamientos de los probadores más exitosos
que conoce.
¿En qué medida muestran ellos los aspectos psicológicos abordados en esta sección?
¿Qué otros elementos de sus conjuntos de personalidades y habilidades piensa usted que
conduce al éxito para ellos?
Argumente.
No es sólo la falta de estos rasgos importantes que pueden causar problemas. Hay algunas
personas a quienes consideraríamos como no exitosos quienes exhiben todos estos rasgos.
Sin embargo, ellas tienen uno o dos rasgos adversos, así como la arrogancia, las
inseguridades compensadas excesivamente y la actitud defensiva, lo cual les causa
problemas repetidos con los compañeros y los colegas. Las pruebas son un trabajo en
equipo, y usted tiene que aprender a trabajar adecuadamente con los miembros del equipo
como un compañero y como un líder para ser un probador exitoso.
No hay objetivos del aprendizaje definidos para el capítulo 1, sección 6 del programa de
estudios (syllabus).
Muchas profesiones tienen estándares éticos. En el contexto del profesionalismo, las éticas
son “reglas de conducta reconocidas con respecto a una clase particular de acciones
humanas o a un grupo particular, una cultura, y etc.”.
Porque los probadores tienen acceso a información confidencial y privilegiada, las guías
éticas pueden ayudar a guiarlos a utilizar esa información correctamente. Adicionalmente,
los probadores deberían utilizar guías éticas para seleccionar los mejores comportamientos
y resultados posibles para una situación dada, teniendo en cuenta sus restricciones. Note
que “Lo mejor posible” significa para cada uno, no sólo para el probador.
En algunos casos, así como el caso de su ayuda para desarrollar el programa de estudios
(syllabus), él tiene que hacer claro esos intereses de negocios a las personas, pero también
le es permitido ayudar de esa manera. Ayudó a escribir ambos, el programa de estudios
(syllabus) Básico y Avanzado.
En otros casos, así como en el desarrollo de las preguntas de examen, él acordó, junto con
sus colegas en el ASTQB, que no debería participar en eso. El acceso directo a las
preguntas de examen, haría demasiado probable, que él conscientemente o
inconscientemente, tergiversaría sus materiales de capacitación para “enseñar el examen”.
EL PRODUCTO - Los probadores deberían asegurar que los entregables que ellos
proporcionan (acerca de los productos y los sistemas que ellos prueban), cumplan con los
más altos estándares posibles. Por ejemplo, si está trabajando como un consultor y deja
afuera detalles importantes de un plan de pruebas de tal forma que el cliente tiene que
contratarlo en el próximo proyecto, eso es una falta ética.
LOS COLEGAS - Los probadores de software certificados deberían ser justos con sus
colegas además de ser de gran ayuda para ellos y promover la cooperación con los
desarrolladores de software. Por ejemplo, no es ético manipular los resultados de las
pruebas para acordar el despido de un programador a quién usted deteste.
El capítulo 2, Pruebas a través el Ciclo de Vida de Software, contiene las siguientes cuatro
secciones:
LO-2.1.1 Explicar la relación entre el desarrollo, las actividades de pruebas y los productos
del trabajo en el ciclo de vida del desarrollo por medio de ejemplos utilizando los tipos de
proyecto y producto. (K2)
LO-2.1.2 Reconocer el hecho de que los modelos de desarrollo de software deben ser
adaptados al contexto del proyecto y a las características del producto. (K1)
LO-2.1.3 Recordar las características de las buenas pruebas, que son aplicables en cualquier
modelo del ciclo de vida. (K1)
Esta sección, Modelos de Desarrollo de Software, cubrirá los siguientes conceptos clave:
Modelo V: Un framework para describir las actividades del ciclo de vida del desarrollo de
software desde la especificación de requisitos hasta el mantenimiento. El modelo V ilustra
cómo las actividades de pruebas pueden ser integradas en cada fase del ciclo de vida del
desarrollo de software.
Pruebas de integración: Pruebas realizadas para exponer defectos en las interfaces y las
interacciones entre los componentes o sistemas integrados. Véase también pruebas de
integración de componentes, pruebas de integración de sistemas.
Pruebas de sistema: El proceso de probar un sistema integrado para verificar que cumple
los requisitos especificados.
Pruebas de aceptación: Pruebas formales con respecto a las necesidades de los usuarios,
los requisitos y los procesos de negocio, dirigidas para determinar si un sistema satisface o
no los criterios de aceptación y para permitir al usuario, los clientes u otra entidad
autorizada para determinar si aceptan o no el sistema. Tenga en cuenta que este término no
se citó específicamente en esta sección, pero se lo incluye aquí porque es un sinónimo de
las pruebas de aceptación del usuario.
Éste es un modelo intuitivo y usual. La mayoría de los profesionales de TI, si han trabajado
en algunos proyectos, se han encontrado con este método. Sin duda es preferible este
modelo que el caos o la falta de cualquier estructura del ciclo de vida o modelo en absoluto.
Desde el punto de vista de las pruebas, éste tiene algunas imperfecciones. Por un lado, es
dirigido usualmente por los riesgos de los cronogramas y los presupuestos, más que
dirigido por los riesgos de calidad. Por otro lado, porque es difícil de planificar por
adelantado sin olvidar nada en los proyectos más grandes cuando los planes fracasan, las
pruebas—especialmente las pruebas de sistema y aceptación— ¡tienen dificultades al final!
Estas imperfecciones pueden ser gestionadas mediante una cuidadosa gestión de ambos, los
riesgos de calidad y los riesgos de proyecto relacionados con las pruebas. Hablaremos más
acerca de la gestión de riesgos en los capítulos 4 y 5.
Considere el conjunto de las características como ése que gradualmente crece alrededor de
la funcionalidad esencial, que fue desarrollado en el primer incremento. Si la funcionalidad
esencial es independiente y de valor, entonces usted puede entregar algo en cualquier
momento una vez que la funcionalidad esencial esté lista y pase sus pruebas.
Debido a esta característica, estos métodos tienden a ser muy útiles en situaciones dirigidas
por los riesgos de cronograma. Si hay alguna flexibilidad acerca de lo que debe ser
entregado exactamente, pero la necesidad de alcanzar una fecha límite es grave, este
método es mejor que el método V.
Más o menos desde 1995, los modelos del tipo iterativo, que se clasifican según su
formalidad desde la Programación Extrema pasando por el Desarrollo Rápido de
Aplicaciones hasta el Proceso Unificado, se han vuelto bastante populares, a medida que las
fechas límites inflexibles de los cronogramas se han convertido en la normalidad.
Por un lado, hay una gran probabilidad de que las pruebas del incremento final
puedan ser apresuradas o abreviadas bajo presión. Esto puede resultar en
entregables defectuosos.
Por otro lado, si bien no es visible en la imagen de la figura 2.2, en realidad hay una buena
cantidad de superposición entre los incrementos. Los programadores, una vez que
completan su trabajo en un incremento, pasan al siguiente. Esto hace que sea difícil para
ellos corregir los defectos encontrados durante las pruebas del anterior incremento y puede
atrasar el progreso a través de las pruebas.
Además, debido a que los programadores están cambiando y añadiendo código en cada
incremento sucesivo, los riesgos de regresión son muy altos, particularmente para el código
entregado de alto valor en el primer incremento.
Finalmente, en los proyectos que se siguen algunos de los modelos llamados “ágiles”, el rol
de las pruebas está todavía evolucionando. Algunos creadores de los métodos ágiles han
sido, francamente, completamente hostiles hacia el concepto de las pruebas independientes
y los probadores independientes, lo cual significa que usted podría encontrarse obligado a
forjar su rol.
A pesar de las nociones comunes acerca de estos métodos, existen riesgos importantes de la
calidad del sistema que se acumulan. Usted puede externalizar el desarrollo y puede
comprar el software de distribución masiva, pero no puede transferir los riesgos tan
fácilmente.
Otro es confiar en las pruebas de componente del proveedor. Esto suena ingenuo,
expresado de esta manera, pero lo hacemos todo el tiempo. Es una buena idea de
por lo menos revisar sus referencias y su reputación de la industria antes de
confiar en el proveedor.
Otro método consiste en corregir los problemas de las pruebas y los procesos de
calidad del proveedor. Una vez más, usted tendrá que tener permiso para hacerlo.
Por último, usted puede hacer caso omiso a sus pruebas y reemplazarlas por
completo, convirtiéndose en el laboratorio de facto de las pruebas del sistema.
Naturalmente, estos dos últimos escenarios son bastante costosos, consumen mucho
tiempo, tienen muchas implicaciones negativas y políticas delicadas.
Por último, cuando usted esté probando sistemas integrados, recuerde de planificar usted
mismo acerca de las pruebas de integración y sistema. Sólo porque un componente
funciona de forma independiente no significa que funcione en el sistema.
Más allá de las revisiones y las actividades de las pruebas dinámicas como las pruebas
unitarias y las pruebas de sistema, existen oportunidades para asegurar la calidad durante
todo el ciclo de vida en cuanto a actividades adicionales de verificación y validación.
La verificación está buscando defectos en los entregables de las fases, comprobando que
hemos seguido el proceso, y así sucesivamente. Pregúntese: “¿Estamos construyendo el
sistema correctamente?” En otras palabras, la verificación es acerca de buenos procesos.
En la figura 2.4, puede ver que tenemos una revisión en la salida en el final de cada fase de
un proyecto siguiendo un modelo V. En estas revisiones, verificamos que todas las
acciones correctas han sido llevadas a cabo, basadas en los resultados finales de la fase
anterior y nuestro modelo de proceso. Validamos que aún estemos en camino de entregar
un sistema de calidad para el cliente.
Históricamente, las pruebas han sido destacadas muy poco en CMM y CMMI, conduciendo
a modelos específicos de los procesos de pruebas como los Procesos de Pruebas Críticos y
el Proceso de Evaluación, el Mejoramiento del Proceso de Pruebas (“TPI”), el Modelo de
Madurez de Pruebas (“TMM”) y T-Map.
El IEEE 12207 y CMMI, como la mayoría de los estándares, son los objetivos del
aprendizaje del nivel K1, es decir, usted sólo tiene que recordar los estándares y su
contenido. En el nivel básico, la meta del ISTQB es simplemente asegurar la familiaridad
con la mayoría de los estándares.
Independientemente de los modelos del ciclo de vida y los modelos de madurez que usted
seleccione, se aplican algunas características generales de las buenas pruebas.
Usted debería tener actividades de pruebas para cada actividad del desarrollo. Por ejemplo,
las pruebas unitarias están vinculadas a la implementación. Los requisitos deberían ser
revisados.
Los niveles de las pruebas tienen objetivos centrados, con coordinación para evitar los
vacíos y la superposición. Esto se hace mejor en un documento de las políticas de las
pruebas como se describió anteriormente.
Los probadores son involucrados en cualquiera de las revisiones en las que ellos tengan la
calificación para atenderlas, así que ellos pueden brindar su perspectiva y mentalidad
individual, como se describió en el capítulo anterior.
Usted puede libremente combinar o reorganizar los niveles de pruebas, para adaptar sus
pruebas a los varios ciclos de vida y en resumen ser flexible acerca del método para las
pruebas, con la condición de que usted mantenga estas características en la mente.
Ejercicio 1
El afamado experto en calidad W.E. Deming dijo, “todos los modelos son erróneos,
algunos son útiles”.
Indique cuál modelo del ciclo de vida en esta sección aplicó usted lo más cercano a su
proyecto anterior (o, si no hubo modelo de organización, indique “codificar-y-corregir”).
Argumente.
Un método cada vez más popular, seguido por más y más proyectos últimamente, es un
modelo iterativo. El Proceso Unificado de Rational, es un método más analítico y
apropiado para sistemas grandes de alto riesgo, mientras que las Metodologías Ágiles se
enfocan en la rápida entrega de pequeños incrementos, lo cual es lo más seguro para
proyectos de bajo riesgo. A causa de un gran número de componentes de software
importantes disponibles—p. Ej., los sistemas de gestión de base de datos—, muchos
proyectos implican la integración de sistemas, no solo el desarrollo de código nuevo.
¿Qué quiso decir Deming con su comentario? Un modelo de algo—un avión, una ciudad o
un ciclo de desarrollo de software— está siempre erróneo porque no captura en su totalidad
la cosa real que modela. Ningún modelo del desarrollo de software podría describir
posiblemente cada cosa que podría ocurrir en un proyecto real.
Un modelo de cualquier cosa es útil cuando le ayuda a entender qué hacer próximamente y
cómo atacar al problema. Es útil cuando puede construir un framework, una perspectiva
mental, para lo que está pasando y lo que debería pasar. Sin embargo, una vez cuando el
modelo se convierte en un dogma rígido, lleva a equivocaciones y energía desperdiciada.
Ejercicio 2
¿Ve usted cómo la distinción entre estos modelos se pone menos clara a menudo
que examina un proyecto real y las decisiones que hay que tomar?
LO-2.2.1 Comparar los diferentes niveles de pruebas: los objetivos principales, los objetos
típicos de pruebas, los objetivos típicos de pruebas (p.ej. funcional o estructural) y los
productos relacionados con el trabajo, la gente que prueba, los tipos de defectos y las fallas
que deben ser identificadas. (K2)
Esta sección, Niveles o Fases de Pruebas, cubrirá los siguientes conceptos clave:
Anteriormente, habíamos mencionado que los objetivos tienden a variar según los
diferentes niveles de pruebas. Para las pruebas de componente, los objetivos típicos son:
encontrar los defectos, construir la confianza y reducir el riesgo en las partes individuales
del sistema bajo prueba antes de la integración de sistemas.
Las pruebas de componente pueden incluir los tipos de pruebas así como los de
comportamiento o caja negra (p.ej. los de funcionalidad, utilización de recursos y
rendimiento) y los tipos de pruebas estructurales o de caja blanca.
Pruebas basadas en los riesgos: Un método para las pruebas para reducir el nivel de los
riesgos del producto e informar a los interesados del negocio acerca de su estado,
comenzando en las etapas iniciales de un proyecto. Esto involucra la identificación de los
riesgos del producto y la utilización de los niveles de riesgos para guiar el proceso de
pruebas.
Pruebas de caja blanca: Las pruebas basadas en un análisis de la estructura interna del
componente o sistema.
El objeto de prueba o ítem sometido a prueba varía. Los puristas en pruebas dirían que las
pruebas unitarias deberían abordar el ítem independiente más pequeño y comprobable. Para
los lenguajes de procedimientos como C o COBOL es la función o el procedimiento. Para
los lenguajes orientados a objetos como Java o C+ + es la clase. Sin embargo, en la práctica
real, la gente suele realizar las llamadas “pruebas unitarias” de partes más grandes del
sistema.
Ya sea que las llamemos pruebas de unidad o de componente, hay una necesidad de los
arneses y las herramientas, porque el sistema no es en sí mismo completo ni
independientemente comprobable. Entonces, tendemos a encontrar la utilización de arneses
en el nivel de la interfaz de programación de aplicaciones denominados drivers y stubs.
Hay herramientas disponibles para ambos tanto gratuitas como comerciales.
Ahora, en cuanto a quién es responsable, por lo general son los programadores, pero el
nivel de capacidad y el grado de ejecución varía. Incluso los partidarios de las metodologías
de pruebas ágiles, que elogian las virtudes de las buenas pruebas unitarias automatizadas, a
menudo muestran una carencia de conciencia y rigor más bien alarmante con respecto a las
mejores prácticas de las pruebas.
Normalmente hay algunas cosas que son por lo general verdad y típicas acerca de las
pruebas unitarias o de componente. Por un lado, implica el acceso al código. Por lo general,
son ejecutadas en un entorno de desarrollo, por el programador que escribió el código. Y,
como se explicó anteriormente, se requieren drivers, stubs o arneses, porque la unidad no es
independiente.
Hay una forma de pruebas unitarias que se llama desarrollar primero las pruebas (“Test
First Development-TFD”) o desarrollo dirigido por las pruebas (“Test Driven
Development-TDD”). Parece que esto vuelca al revés la forma de codificación, en la cual el
programador desarrolla primero un conjunto de pruebas unitarias, luego construye e integra
el código necesario para que esas pruebas pasen. A continuación él procede a adicionar más
pruebas unitarias correspondientes a funciones adicionales y repite el proceso.
Desarrollo dirigido por pruebas: Una forma de desarrollo de software donde los casos de
prueba son desarrollados y a menudo automatizados, antes de que el software sea
desarrollado para ejecutar aquellos casos de prueba.
Si bien esto podría parecer revolucionario, es en realidad sólo un giro en las mejores
prácticas de la programación que se remontan a décadas pasadas. Cuando trabajábamos
como programadores al principio de los años 80, la regla siempre fue, codificar un poco,
probar un poco, codificar un poco más, probar un poco más, etc. Este método fue posible
por medio de la liberación del programador de las tarjetas perforadas, los compiladores y
los enlazadores más rápidos que se ejecutaban en terminales. Todo lo viejo es nuevo otra
vez, como dice el refrán.
Figura 2.5: Drivers y Stubs
Hemos mencionado los drivers, los stubs y los arneses unas cuantas veces, así que tal vez
algunas definiciones están claras.
Para esto, tenemos dos tipos de arneses. Uno se llama driver, el cual consiste en una
función o funciones (en una clase o clases), que llaman o invocan o utilizan el módulo o los
módulos bajo pruebas. El otro se llama stub, el cual consiste en una función o funciones (en
una clase o clases) que son invocados —directa o indirectamente— por el módulo o los
módulos bajo pruebas.
Una vez más, los objetivos pueden variar, pero normalmente queremos encontrar defectos,
construir la confianza y reducir el riesgo en las relaciones e interfaces entre los pares y
grupos de componentes en el sistema bajo prueba a medida que las partes se unen.
Puesto que estamos examinando las relaciones e interfaces, las pruebas de integración se
basan típicamente en el diseño del sistema, la arquitectura, los flujos de trabajo, los casos
de uso, los esquemas de la base de datos y los flujos de datos. Otra vez, si estamos
realizando las pruebas basadas en los riesgos, utilizaremos adicionalmente los riesgos de
calidad para guiar nuestras pruebas.
Las pruebas de integración pueden incluir varios tipos de pruebas así como las pruebas de
comportamiento (p.ej. las de funcionalidad, utilización de recursos y rendimiento). Éstas
pueden incluir las pruebas estructurales como los flujos de llamadas y los flujos de datos.
Al igual que las pruebas unitarias y de componente, las pruebas de integración requieren
con frecuencia arneses y herramientas, debido a que las construcciones no son siempre
independientes y comprobables. Estos arneses pueden actuar en el nivel de la interfaz de
programación de aplicaciones (API). También pueden estar en el nivel de la interfaz de
línea de comandos.
¿De dónde vienen estas construcciones y cómo son ensambladas? Existen varias técnicas.
La primera técnica no es realmente una técnica en absoluto, es tanto como alguna especie
de ejercicio de ingeniería de software en ilusiones. Es denominada irónicamente
“integración big bang”. Consiste en tomar un conjunto de (probadas ojalá) unidades,
componentes, clases, funciones, cualquier cosa y ponerlos todos juntos al mismo tiempo,
luego probarlos. Esto parece rápido, pero ¿Qué sucede cuando usted encuentra un defecto?
Mejor aún, ¿Qué pasa cuando ni siquiera se puede producir un sistema ejecutable de la
colección?
Además, ¿Por qué esperar hasta que todo el código este escrito para iniciar la integración?
¿No hay un principio en las pruebas que diga que las pruebas tempranas son buenas?
Entonces, supongamos que empezamos a construir las capas más bajas del
sistema, normalmente las que se comunican con el sistema operativo, el hardware
y la base de datos. Esto, por supuesto, involucra drivers, porque tenemos que
llamar a estas capas. Construimos cada capa, de forma incremental, y la
probamos. A medida que construimos las capas, los drivers son reemplazados por
los módulos reales y son escritos nuevos drivers para aquellos nuevos módulos
introducidos. Repetimos este proceso hasta que hayamos terminado la
integración.
Eso viola una de nuestras reglas heurísticas para las pruebas: Encontrar primero las cosas
que asustan. Deberíamos intentar de encontrar los problemas en orden de prioridad, donde
sea posible. Así, si sospechamos que problemas serios podrían acechar en la capa superior,
generalmente en la interfaz de usuario, mejor no esperemos hasta el final.
Esto significa que podríamos querer empezar a construir con las capas más altas del
sistema, lo cual, otra vez, es usualmente la interfaz de usuario. Por supuesto, esto implica
stubs, porque las capas inferiores no existen. Como antes, construimos incrementalmente
cada capa y las probamos. A medida que creamos las capas, los stubs son reemplazados por
los módulos reales y los nuevos stubs son escritos para esos nuevos módulos introducidos.
Repetimos este proceso hasta que hayamos terminado la integración.
Otra vez, tenemos buen aislamiento de defectos. Sin embargo, si encontramos defectos
graves en la capa inferior, estamos en graves problemas.
Vea, el problema aquí es que estamos permitiendo que la arquitectura del sistema determine
el orden de las pruebas. Ahora, por supuesto, durante las pruebas de integración, la
arquitectura es muy importante, pero no podemos contar con la arquitectura para que tome
nuestra mano y nos muestre los defectos.
Las pruebas de integración de sistema son particularmente complejas. Los sistemas podrían
haber sido desarrollados por diferentes organizaciones e incluso en diferentes períodos de
tiempo, con tecnologías e interfaces diferentes y tal vez no completamente compatibles.
Cuando hay múltiples organizaciones involucradas, diferentes organizaciones pueden
controlar las interfaces de los sistemas, lo cual hace que los cambios en los sistemas sean al
mismo tiempo más peligrosos y, paradójicamente, menos probables de ser correctamente
gestionados.
Debido a que los procesos de negocio podrían atravesar sistemas, los problemas que surgen
cuando los cambios dañan una interfaz —y así un proceso de negocio—puede tener
impactos críticos en la organización.
Otra vez, los objetivos pueden variar, pero típicamente queremos encontrar los defectos,
construir la confianza y reducir el riesgo en los comportamientos generales y particulares,
las funciones y las respuestas del sistema sometido a pruebas en su totalidad. Estamos
mirando todo el sistema, por lo que las pruebas de sistema se basan generalmente en los
requisitos del sistema, el diseño de alto nivel, los casos de uso y la experiencia del usuario y
probador con sistemas similares. A veces las organizaciones tienen listas de comprobación
de las características principales de calidad que deben ser abordadas durante las pruebas de
sistema y también pueden ser necesarios la cobertura de los centros de datos o los entornos
del cliente. Otra vez, si estamos realizando pruebas basadas en los riesgos, utilizaremos
riesgos de calidad para guiar nuestras pruebas también.
Las pruebas de sistema pueden incluir los tipos de pruebas de comportamiento, así como de
funcionalidad, seguridad, fiabilidad, usabilidad, portabilidad y rendimiento. Las técnicas de
pruebas estructurales como la cobertura de sentencia, rama y bucle son utilizadas a veces
para comprobar la completitud de las pruebas de comportamiento.
Para las pruebas de sistema, una gran variedad de herramientas están disponibles, para
trabajar en la interfaz de programación de aplicaciones (API), la interfaz de línea de
comandos y la interfaz gráfica de usuario. A diferencia de los anteriores niveles de pruebas,
el sistema es independiente y comprobable. El software gratis o software comercial existen
como herramientas necesarias para las pruebas de sistema.
En cuanto a quién es responsable, las pruebas de sistema son típicamente el reino del
probador independiente. Los usuarios también podrían estar involucrados.
Aquí, el objetivo está típicamente enfocado en construir la confianza, para demostrar que el
producto o sistema está listo para el despliegue o la versión. Los niveles de pruebas de
aceptación generalmente no tienen como objetivo la búsqueda de defectos.
Ésta parece una afirmación obvia y sencilla, pero aquí surgen falsas expectativas.
Una empresa para la cual RBCS/Business Innovations hizo una evaluación tenía
las pruebas de aceptación ejecutándose en paralelo con las pruebas de sistema, en
el mismo software y en el mismo entorno de pruebas. Los usuarios que
realizaban las pruebas de aceptación se molestaron cuando encontraron defectos.
Nosotros preguntamos, ¿Cómo podrían esperar ellos razonablemente no
encontrar defectos en el mismo software que estaba siendo probado activamente
para encontrar defectos al mismo tiempo?
Entonces, aquí hay una lección clave para las pruebas de aceptación: Si el objetivo
es no encontrar ningún defecto, entonces las pruebas de aceptación se deben ejecutar
después de que todos los niveles de pruebas previamente planificados hayan sido
completados, incluyendo la corrección de los defectos para esos niveles.
En otra ocasión, recibimos una llamada telefónica de un cliente de RBCS/Business
Innovations preguntando acerca de la cobertura de las pruebas de aceptación. Sus usuarios
quisieron probar las condiciones que previamente no habían sido probadas en las pruebas
de sistema y no revelarían a la organización TI lo que pretendían hacer durante las pruebas
de aceptación. Al mismo tiempo, los usuarios estaban diciendo que sería un verdadero
problema si se encontraban defectos. Preguntamos ¿Cómo podrían esperar los usuarios no
encontrar ningún defecto si ellos no informarían a la organización TI qué probar antes de
entregar el software?
Entonces, aquí esta otra lección clave para las pruebas de aceptación: Si el objetivo
es no encontrar ningún defecto, entonces, las pruebas de aceptación deberían cubrir un
subconjunto de las condiciones probadas en los niveles anteriores de pruebas.
Al igual que con las pruebas de sistema, estamos examinando todo el sistema,
por lo que las pruebas de aceptación se basan típicamente en los requisitos del
sistema. Esto puede incluir los requisitos de los usuarios, los requisitos del
sistema, los casos de uso, los procesos de negocio y los informes del análisis de
los riesgos. Las pruebas de aceptación también podrían tener en cuenta las
obligaciones contractuales si el software está siendo comprado, construido a
medida, o adquirido. La experiencia de los usuarios y los probadores con
sistemas similares está involucrada algunas veces, aunque ésta puede ser una
espada de doble filo. Hemos visto situaciones en las que dar rienda suelta a los
usuarios durante las pruebas de aceptación lleva a la re-definición retroactiva de
los requisitos del proyecto y eventualmente al fracaso del proyecto.
Incluso si estamos llevando a cabo pruebas basadas en los riesgos, los riesgos de calidad
generalmente juegan un rol más limitado en la guía de nuestras pruebas durante las pruebas
de aceptación. Las consideraciones del impacto en los negocios podrían determinar qué
pruebas ejecutamos, pero la secuenciación de las pruebas y la reevaluación de los niveles
de los riesgos de calidad basados en los resultados de las pruebas son menos probables,
porque los resultados de las pruebas (al menos en teoría) sólo van a confirmar que el
sistema funciona.
Al igual que con las pruebas de sistema, el objeto de pruebas o ítem sometido a prueba es
todo el sistema. A veces es probado en producción o en el entorno del cliente, sin embargo
una práctica más segura es utilizar un entorno de pruebas. Los probadores deberían tener
especificaciones —o por lo menos un conocimiento sólido de—los procesos de negocios,
operacionales y de mantenimiento, los procedimientos de usuarios, los formularios y los
informes. El entorno de pruebas debería incluir datos de configuración apropiados y
realistas así como también una réplica—si no tan exacto una copia—de los datos de
producción.
La pruebas de aceptación a menudo son realizadas por los usuarios y los clientes, aunque
algunos de nuestros clientes tienen probadores independientes para guiar y asistir a los
usuarios. Ésta es una buena manera de mantener a los usuarios enfocados en las
condiciones de pruebas legítimas, también, ayudando a evitar que divaguen en áreas no
especificadas y re-definan el significado de la palabra “terminado” para el proyecto.
Vemos usualmente que las organizaciones realizan pruebas de aceptación de usuario, donde
los usuarios de negocios verifican la aptitud para los propósitos funcionales y para las
aplicaciones clave de negocios.
Por cierto, si usted está en una industria relacionada con la defensa, el uso del término
“pruebas operacionales” puede ser confuso. En los proyectos de defensa, “las pruebas de
desarrollo” se refieren a las pruebas durante el desarrollo del sistema, a menudo por el
contratista de la defensa. Las “pruebas operacionales” se refieren a lo que es, básicamente,
las pruebas de sistema y las pruebas de integración de sistemas, a menudo por los usuarios
reales.
Interoperabilidad: La capacidad del producto de software para interactuar con uno o más
sistemas o componentes especificados. Tenga en cuenta que este término no ha sido
enunciado específicamente en esta sección, pero se lo incluye aquí, ya que es esencial para
la comprensión del término pruebas de interoperabilidad.
En el mundo del software para el mercado público, también observamos las pruebas alfa y
beta, mientras que las organizaciones TI que desarrollan software para el uso interno tienen
un equivalente denominado pruebas de campo o pruebas piloto. Éstas son formas de
pruebas de aceptación en las que efectivamente podríamos desear encontrar defectos. Sin
embargo los objetivos son mayormente construir la confianza de los clientes o los usuarios
potenciales o existentes. Las pruebas beta, las pruebas piloto y las pruebas de campo se
realizan en el entorno real o los entornos en los cuales el sistema será desplegado.
Las pruebas piloto implican típicamente una muestra de la comunidad de los usuarios y
podrían incluir pruebas paralelas, donde el trabajo se realiza con el nuevo sistema y al
mismo tiempo, el mismo trabajo se realiza en el sistema existente, comparando resultados.
Esto ayuda a reducir el riesgo de despliegue. Obviamente, la comunidad de los usuarios
debe ser seleccionada para ser representativa, si se desea gestionar eficazmente los riesgos.
Nos hemos referido antes en este libro al concepto de las pruebas como un filtro. Mediante
el uso de una secuencia de filtros, todos bien alineados en cuanto a la cobertura y la
secuencia, podemos conseguir un entregable de muy alta calidad.
Sin embargo un problema que hemos visto en nuestro trabajo con clientes es el archivo del
trabajo de las pruebas en silos cuando se usan los diferentes niveles de pruebas. Vacíos y
superposiciones evolucionan y el pensamiento se hace dogmático y orientado a la culpa.
Así, al realizar las pruebas dominantes, no olvide de permanecer flexible. Las técnicas de
pruebas de varias granularidades pueden ser útiles en todas las fases de la ejecución de
pruebas, aunque la mezcla cambiará. La cantidad de solapamiento de nivel o fase es
dirigida por los criterios de entrada y salida, los cuales deberían ser definidos de una
manera que sea apropiada para el proyecto, la organización, el ciclo de vida, y así
sucesivamente. Y, usted no debe sentirse obligado a utilizar un nivel de pruebas o fase en
particular sólo porque el programa de estudios básico del ISTQB lo menciona. No todos los
niveles de pruebas ocurren en todos los proyectos.
Tenga en cuenta que las tareas de pruebas se producen en todo el trabajo del
desarrollo. Hay una tarea de pruebas paralela para cada tarea de desarrollo, que
corresponde a nuestra regla anterior que decía que cada producto del trabajo
debería ser probado.
Como puede ver, los períodos de ejecución de las pruebas unitarias, de integración y de
sistema son más largos que las pruebas de aceptación. Eso se debe en parte al hecho, de que
cuando se realiza apropiadamente, la ejecución de las pruebas es planificada con múltiples
ciclos para permitir tiempo de reparación. Como hemos mencionado antes, una de las
peores prácticas es planificar, diseñar o ejecutar las pruebas suponiendo que esas pruebas
pasarán y no revelarán ningún defecto.
Finalmente, aunque no es visible en esta figura, las buenas pruebas dominantes requieren el
constante balance de las características, el presupuesto, el cronograma y las
compensaciones de calidad. Entonces — y esto es especialmente importante durante los
proyectos de ciclo de vida secuencial — las características deberían ser evaluadas acerca de
la posible omisión en lugar de cambiar las fechas de entrada a los niveles de pruebas o
entrar en un nivel de pruebas antes de que el objeto de pruebas esté listo para ello. El
cambio de las fechas de entrada de las pruebas cuando las fechas de entrega están fijas,
simplemente lo conduce a realizar la clasificación de las pruebas, reduciendo la cobertura y
aumentando el riego de la calidad. Comenzando un nivel de pruebas en un objeto que no
está listo para probar, es usualmente ineficiente y frustrante.
En los ciclos de vida iterativos, en lugar de abandonar una función, lo mejor es moverla en
una iteración posterior. Esto podría tener el efecto de abandonarla de la versión, por
supuesto, si esa iteración no es llevada a cabo realmente o si el producto es publicado antes
de la iteración que está siendo realizada.
En esta nota acerca de los modelos del ciclo de vida, este gráfico supone un modelo
secuencial del ciclo de vida. Las pruebas dominantes son bien útiles sólo en los modelos
iterativos del ciclo de vida, pero era más fácil para nosotros ilustrar los puntos que
estábamos realizando en esta figura utilizando un modelo secuencial.
2.2.1 Ejercicios
Ejercicio 1
Si estuviera dirigiendo todas las pruebas de Omninet, ¿Cuáles niveles o fases de pruebas
planificaría? ¿Por qué?
¿Cuáles serían las metas más importantes de cada nivel o fase de pruebas?
¿Cómo se relacionan y afectan estos niveles de pruebas al modelo del ciclo de vida que ha
seleccionado en el ejercicio previo?
Argumente.
Con una sólida prueba de componente e integración realizada, incluyendo las pruebas de
integración de toda la funcionalidad que abarca los componentes, la prueba de sistema,
mientras es rigurosa, no debería encontrar demasiados defectos. Mayormente nos
enfocaríamos en los defectos de las acciones de punta a punta, el rendimiento de todo el
sistema y la respuesta a la carga y la funcionalidad esencial.
También planificaríamos una prueba de aceptación, sin embargo la llamaríamos una prueba
beta. Utilizaríamos clientes reales en sitios seleccionados para realizar esta prueba. Esta
prueba beta sería acerca de la búsqueda de los defectos más que la mejora de la confianza
del usuario en el sistema.
Estos cuatro niveles coinciden con el modelo V, que seleccionamos en el ejercicio anterior.
Sin embargo, estos desarrollos para usuarios finales y mercados masivos, las pruebas beta
ocurren en paralelo con las pruebas de sistema—o podrían empezar incluso durante las
pruebas de integración.
LO-2.3.2 Reconocer que las pruebas funcionales y estructurales ocurren en cualquier nivel
de las pruebas. (K1)
LO-2.3.4 Identificar y describir los tipos de pruebas basados en el análisis de una estructura
o arquitectura de un sistema de software. (K2)
Esta sección, Tipos u Objetivos de las Pruebas, cubrirá los siguientes conceptos
clave:
El programa de estudios básico del ISTQB define una taxonomía de los tipos de pruebas,
como se puede ver en esta figura.
Existen tipos de pruebas estáticas, las cuales son cualquier tipo de pruebas que no
involucran la ejecución del ítem sometido a pruebas. Los tipos de pruebas estáticas
consisten en el análisis estático—el implica la utilización de una herramienta para evaluar
el ítem sometido a pruebas—y las revisiones—las cuales involucran la evaluación manual
del ítem sometido a pruebas. Cubriremos las pruebas estáticas en el capítulo 3.
Existen tipos de pruebas dinámicas, las cuales son cualquier tipo de pruebas que involucran
la ejecución del ítem sometido a pruebas. Cubriremos las pruebas dinámicas en el capítulo
4.
Otro subtipo de las pruebas dinámicas son las pruebas basadas la experiencia. El diseño de
las pruebas basas en la experiencia se basa en el conocimiento y la experiencia del
probador, los cuales pueden abarcar tanto los aspectos de comportamiento como los
estructurales del ítem sometido a prueba.
El programa de estudios básico también presenta una taxonomía alternativa relacionada con
las pruebas dinámicas. Esta taxonomía examina la utilización de una prueba para evaluar
los resultados de un cambio en el software existente.
Vamos a empezar con las pruebas funcionales. Las pruebas funcionales buscan
situaciones donde la acción razonable o necesaria es proporcionada o no,
inaccesible o seriamente deteriorada. Por ejemplo, si no hay ninguna función de
adición en una calculadora, podemos decir razonablemente que a la calculadora
le falta una función esencial. Si la función de adición está implementada, pero la
tecla “+” no funciona para invocarla, la función está básicamente inaccesible. Si
la función de adición sólo puede sumar números enteros, no números reales, está
tan seriamente deteriorada para ser inútil.
Las pruebas funcionales deberían, por supuesto, verificar que el resultado de una acción sea
correcto. Si la función de adición suma números, pero calcula que 2+2=5, eso es claramente
un defecto. Para verificar la funcionalidad correcta, necesitamos lo que se llama un oráculo
de pruebas. Un oráculo de pruebas es cualquier fuente de información que nos permite
determinar los resultados esperados para comparar con el resultado real del software
sometido a pruebas. Un oráculo puede ser el sistema existente (para una evaluación
comparativa), un manual de usuarios o el conocimiento especializado de una persona, pero
no debería ser el código. (Si utiliza el código como un oráculo, estará sólo comprobando
que el compilador y enlazador funcionan.) Si usted tiene una especificación para la
funcionalidad del sistema, subsistema, componente o de cualquier ítem que está sometido a
pruebas— si este documento es una especificación de requisitos, casos de uso o
especificación funcional — entonces ése es sin duda un oráculo de pruebas. Sin embargo, a
menudo algunas funciones permanecen indocumentadas y los probadores deben entender
“el comportamiento razonable”. Por supuesto, es posible también que la especificación esté
errónea y los probadores deben tomar en cuenta esto.
Las pruebas funcionales pueden también comprobar los efectos secundarios e indeseables.
Por ejemplo, si la función de dividir funciona en una calculadora, pero cambia el formato
de la calculadora a un formato de números romanos, eso sería un defecto.
Las amenazas de seguridad incluyen los ataques de los virus, los Caballos
Troyanos, los Botnets18 y otros ataques a través de la oficina del usuario,
también incluyen el intento de entrar en un servidor directamente. (Los
servidores — y en particular los datos que residen en ellos — son generalmente
los objetivos finales). Los ataques de la denegación del servicio y la denegación
distribuida del servicio tienen por objetivo hacer a los servidores inaccesibles por
los usuarios legítimos ya sea violando la seguridad del servidor o
sobrecargándolo.
Existen muchas expectativas y suposiciones equivocadas entre las personas que
pertenecen al área de seguridad. Por ejemplo, algunas personas piensan que sólo
utilizando la encriptación (es decir, HTTPS, SSL y etc.) en el servidor Web se
resuelven los problemas de seguridad. Si los datos son almacenados sin
encriptación, entonces son vulnerables.
Supongamos que estamos probando un sistema que se supone que debe ser capaz de
procesar una transacción — por ejemplo, una consulta de un cliente acerca de si un artículo
está disponible — en un segundo, en cargas de hasta 1.000 transacciones por minuto. El
rectángulo sombreado muestra el área de rendimiento aceptable.
En el gráfico de esta figura, vemos tres tipos comunes de los problemas del rendimiento.
El tercer problema, ilustrado por el grupo de las líneas discontinuas delgadas, es donde el
rendimiento del sistema es aceptable cuando se prueba por primera vez. Sin embargo, la
repetición de pruebas posteriores sin reiniciar el servidor muestra degradaciones del
rendimiento inaceptables con el tiempo.
Este tercer problema se relaciona a menudo con un problema de fiabilidad. Las pruebas de
fiabilidad buscan situaciones en las que el sistema falla al completar funciones normales,
legales, ya sea debido a las restricciones en la secuencia o algún otro defecto y donde el
sistema funciona normalmente, pero se bloquea o cuelga aleatoriamente.
Las pruebas de mantenimiento incluyen la comprobación de los problemas con los procesos
de actualización e instalación y desinstalación de parches. También incluyen la
comprobación de los problemas con los cambios de configuración legal, así como el
conectar y listo (“plug-and-play”), la adición de espacio de disco, y así sucesivamente.
Como si esta lista no fuera ya lo suficientemente larga, hay todavía otras pruebas que
podrían ser consideradas como pruebas de comportamiento funcional y no funcional, tales
como:
Como hemos mencionado anteriormente, también podemos clasificar las pruebas como
pruebas de regresión o confirmación.
Las pruebas de regresión comprueban los efectos de los cambios en las partes no cambiadas
del sistema. Cambios pequeños, localizados y aislados no siempre tienen efectos pequeños,
localizados o aislados. Cubriremos las estrategias de regresión en la siguiente sección.
Las pruebas de confirmación están para confirmar que los cambios introducidos en el
sistema estén presentes y que funcionan correctamente, o para confirmar que las
correcciones de los defectos introducidas en el sistema resuelven los síntomas observados,
es decir, las fallas previamente informadas.
Es útil tener pruebas repetibles durante las pruebas de regresión y confirmación. De otra
manera, no podríamos comprobar las mismas condiciones en nuestras pruebas y podríamos
perder los defectos de regresión o los problemas con las correcciones.
La automatización, cubierta en profundidad más adelante, es también útil para las pruebas
de regresión y confirmación.
Figura 2.13: El Estándar de Calidad ISO 9126
Mencionamos el estándar ISO 9126 antes. Para finalizar esta sección, permítanos
presentarle este estándar en detalle.
El estándar de calidad para el software ISO 9126 define seis características de calidad del
software: Funcionalidad, fiabilidad, usabilidad, eficiencia, mantenibilidad y portabilidad.
Cada característica tiene tres o más subcaracterísticas, como se muestra en esta figura.
Las pruebas que abordan la funcionalidad y sus sub características son las pruebas
funcionales.
Las pruebas que abordan a las otras cinco características y sus subcaracterísticas son las
pruebas no funcionales.
Le recomendamos que estudie esta figura por un momento, porque, así como con los
estándares CMMI y IEEE 12207, se espera que usted sea capaz de recordar esto en el
examen.
2.3.1 Ejercicios
Ejercicio 1
¿Cómo afecta el modelo del ciclo de vida que seleccionó en el ejercicio anterior a la
cantidad de las pruebas de regresión?
¿Cómo afecta el modelo del ciclo de vida que seleccionó en el ejercicio anterior a la
cantidad de las pruebas de confirmación?
Argumente.
El nivel de pruebas de sistema se enfocaría en las clases de problemas que sólo podríamos
encontrar en el sistema integrado y completo. Planificaríamos pruebas de sistema de los
siguientes tipos:
En las pruebas beta, le pediríamos a los usuarios del quiosco y los agentes del centro de
llamadas que consideren la funcionalidad en cuanto a los posibles problemas con los que ha
sido provista así como también las funciones que deberían haber sido provistas pero que no
lo fueron. También quisiéramos la retroalimentación del usuario acerca de la usabilidad y el
rendimiento. Planificaríamos también la introducción de carga en el centro de datos para
obtener la comprobación de los usuarios de la usabilidad y el rendimiento en ambas
condiciones normales y de uso intenso.
Comparado con los modelos incrementales, el modelo V reduce las pruebas de regresión.
Esto es porque usted no comienza la prueba de sistema hasta que todos los componentes
estén realizados, lo cual reduce la cantidad de rotación del para el sistema después de que la
prueba de sistema empieza. Mientras menos cambios más bajo el nivel de los riesgos de
regresión. Sin embargo el modelo V, no altera dramáticamente las pruebas de
confirmación. La cantidad de pruebas de confirmación es dirigida por el número y tipo de
defectos encontrados.
LO-2.4.1 Comparar las pruebas de mantenimiento (las pruebas de un sistema existente) con
las pruebas de una nueva aplicación con respecto a los tipos de pruebas, los activadores
para las pruebas y la cantidad de las pruebas. (K2)
Análisis del impacto: La evaluación del cambio en las capas de la documentación del
desarrollo, la documentación de las pruebas y los componentes, con el fin de implementar
un cambio dado en los requisitos especificados.
Hay una variedad de razones por las que los sistemas se someten al mantenimiento — y por
lo tanto las pruebas de mantenimiento:
La más obvia es la modificación, como ser las mejoras, las correcciones de defectos, los
cambios del entorno operativo y los parches.
Tal vez menos común es el retiro, cuando el fin de la vida útil de un subsistema o todo el
sistema desencadena en un reemplazo. Los datos del antiguo sistema deben ser archivados
con frecuencia de una manera que nos permita utilizarlos, si no fueron totalmente migrados
al nuevo sistema.
Esta figura muestra una vista gráfica de un diagrama de Gantt o una cronología del
proyecto de mantenimiento de dos meses y medio. Al igual que una figura anterior en este
capítulo, que mostró cómo las pruebas dominantes se extienden por todo el ciclo de vida
del desarrollo, esta figura muestra las pruebas dominantes extendiéndose en el proyecto de
mantenimiento. Como antes, las tareas del desarrollo son mostradas en gris y las tareas de
las pruebas en negro. Las pruebas unitarias no se muestran por separado, sino que ocurren
dentro de la tarea de “desarrollar las correcciones y las características”.
En las pruebas de las versiones de mantenimiento, hay algunos desafíos que deben ser
considerados.
En primer lugar, en cuanto al impacto potencial, la regresión es el gran riesgo para las
versiones de mantenimiento. La mayoría de los usuarios y clientes se ponen bastante
molestos cuando usted arruina algo que estaba funcionando. Por ejemplo, Apple lanzó una
actualización del software para el iPod de Rex Black, unas tres semanas después de haberlo
comprado y él lo instaló tontamente, pensando: “Sin duda, ya había sido probado
adecuadamente, al menos con los modelos más nuevos como el de -él”. Incorrecto. El iPod
ahora se cuelga aleatoriamente donde deja de responder a la mayoría de las entradas. Su
impresión acerca de la calidad de los productos de Apple bajó completamente por esa
experiencia.
Otro reto es el problema “diez libras de material en un cubo de cinco libras”,
donde las organizaciones tratan de poner una versión importante llena de
características en una versión corta de mantenimiento. Este problema tiende a
empeorar cuando los interesados del negocio dispares influyen en el contenido de
una versión de mantenimiento, o cuando las versiones de mantenimiento salen
con poca frecuencia, o simplemente cuando la gerencia no comprende o no
aceptará las restricciones del mantenimiento y las pruebas de mantenimiento.
Dado que la atención se centra a menudo en la regresión, los equipos de pruebas tienen a
veces problemas para encontrar el tiempo y los recursos suficientes para desarrollar nuevas
pruebas para nueva funcionalidad. Esto es especialmente cierto cuando los grandes juegos
de pruebas de regresión automatizados deben ser preparados para la versión de
mantenimiento.
Por último, las reglas heurísticas de la estimación de las pruebas en proyectos grandes
fracasarán a menudo para las versiones de mantenimiento. Para el desarrollo nuevo, tal vez
uno puede utilizar reglas heurísticas acerca de la proporción aproximada del trabajo del
desarrollo respecto al trabajo de las pruebas, así como la regla antigua, “Un probador por
cada tres desarrolladores”. Nosotros no avalamos este método para la estimación de las
pruebas en ninguna circunstancia, y con seguridad no para las versiones de mantenimiento.
Con las versiones de mantenimiento, el alcance de las pruebas es fuertemente influenciado
por la cantidad necesaria de las pruebas de regresión, y esa es una función del tamaño del
conjunto de las características del sistema existente, no el número de desarrolladores que
trabajan en la versión de mantenimiento.
Figura 2.15: Regresión
Entonces, ¿Qué podemos hacer acerca de la regresión? Hay dos estrategias de pruebas para
hacer frente a la regresión y también otras tres estrategias que pueden reducir el riesgo de la
regresión.
Como algo práctico, la automatización es la única forma de hacer esto para sistemas
complejos y grandes.
Cubriremos la automatización más a fondo en una sección posterior, pero vale la pena
mencionar una fábula Checa antigua en el contexto de esta opción.
En esta leyenda Checa, un cierto rabino de Praga creó una figura humana de barro y le dio
vida. El rabino intento utilizar esta cosa, llamada golem, para llevar a cabo ciertas tareas
útiles para él mismo y sus feligreses. Sin embargo en un momento debido a alguna
desgracia u otra, el golem se enloqueció e hizo bastante daño antes de ser sometido por el
rabino.
Ésta es sin duda una metáfora apropiada para las pruebas totalmente
automatizadas. Un montón de gente, en su intento de la implementación de
juegos de pruebas de regresión completamente automatizados, ha creado un
golem que se enloqueció.
Por último, en cuanto al impacto potencial, nos referiremos a nuestro análisis de los riesgos
de calidad. (De nuevo, este tema será tratado más adelante). Si hemos identificado ciertas
áreas que simplemente no pueden ser dañadas, por temor a las graves consecuencias para el
negocio, los usuarios, etc., entonces esas áreas—ya sea que probablemente sean dañadas
por el cambio o no—deberían ser probadas de nuevo.
Para tratar de aumentar la eficiencia de estas pruebas de regresión manuales, podemos crear
pruebas extensas, multifuncionales que abarcan áreas amplias del sistema. Esto resulta en lo
que a veces llamamos “pruebas de regresión accidentales”, en el sentido de que tenemos
pruebas de un “día típico de oficina” que cubren muchas áreas, y por lo tanto, están bien
posicionadas para encontrarse con defectos.
Si usted está realmente preocupado acerca de cuántos riesgos de regresión quedan, una
técnica consiste en utilizar la cobertura del código para evaluar el nivel de riesgo restante
después de haber ejecutado las pruebas de regresión.
Cobertura de código: Un método del análisis que determina cuales partes del software han
sido ejecutadas (cubiertas) por el juego de pruebas y cuales partes no han sido ejecutadas,
p.ej., la cobertura de sentencias, la cobertura de decisiones o la cobertura de condiciones.
Hay otras tres estrategias las cuales son estrategias más de gestión de proyectos que
estrategias de pruebas, pero que sin embargo ayudan a reducir el riesgo de la regresión.
La primera es publicar la versión más lentamente. Si usted publica una versión cada seis
meses en lugar de cada mes, usted debería ser capaz de volver a ejecutar un conjunto más
grande de sus pruebas si está utilizando una estrategia manual. Incluso podría tener más
tiempo para dedicarlo a la automatización, resultando en la repetición completa.
La segunda, si debe haber parches de emergencia entre las versiones más lentas, combine
esos parches en las versiones más grandes y más lentas. Esto permite algo de flexibilidad de
las versiones más frecuentes mientras se mantiene bajo el riesgo de regresión total, sobre
todo para los que no necesitan instalar los parches.
La tercera, involucrar a los clientes o usuarios en las pruebas (por supuesto con la venia del
personal del proyecto y la gerencia de negocios). En el mercado público, esto se llama
pruebas beta, mientras que en el mundo de TI se llaman versiones piloto, de etapas o fases
o paralelas. De cualquier manera, si hay regresiones pero ninguno de sus probadores piloto
o beta las encuentran, deberían ser menos importantes que las que ellos hubiesen
encontrado si estuviesen allí.
2.4.1 Ejercicios
Ejercicio 1
Asuma que puede automatizar completamente las pruebas del quiosco de Omninet y el
centro de llamadas. Si un cambio es realizado después de la versión en la interfaz del
usuario del centro de llamadas que no afecta la funcionalidad, ¿Qué probaría de nuevo?
Asuma que no ha automatizado las pruebas del quiosco de Omninet y el centro de llamadas.
Si el mismo cambio es realizado, ¿Qué probaría de nuevo? ¿Qué si el cambio si afectó la
funcionalidad?
Argumente.
“Nada ocurre porque si. Todo en la vida es una sucesión de hechos que, bajo la lupa del
análisis, responden perfectamente a causa y efecto”
LO-3.1.1 Reconocer los productos del trabajo del software que pueden ser examinados por
las diferentes técnicas estáticas. (K1)
LO-3.1.3 Explicar las diferencias entre las técnicas estáticas y dinámicas, considerando los
objetivos, los tipos de defectos que deben ser identificados y el rol de estas técnicas en el
ciclo de vida del software. (K2)
Esta sección, Técnicas Estáticas y el Proceso de Pruebas, cubrirá los siguientes conceptos
clave:
Las pruebas estáticas son aquellas pruebas donde el ítem sometido a pruebas—el
objeto de prueba— no tiene que ser ejecutado (o debe funcionar).
Análisis estático: Análisis de los artefactos del software, p.ej., los requisitos o el código
llevados a cabo sin la ejecución de estos artefactos del desarrollo de software. El análisis
estático es usualmente llevado a cabo por una herramienta.
Esto puede involucrar la utilización de las revisiones y las herramientas. Ahora, las
revisiones, las cuales pueden ir de informales a muy formales, serán cubiertas en detalle en
breve. Hay también varias herramientas que pueden realizar algunos tipos de pruebas
estáticas, así como la comprobación de la conformidad con los estándares de codificación.
Se pueden utilizar las pruebas estáticas para los requisitos y los diseños, lo cual es bastante
típico. También se pueden—y se deberían— utilizar para el código, los esquemas de las
bases de datos, la documentación, las pruebas y cualquier otro producto de trabajo que haya
sido escrito.
En un proyecto de hace algunos años, utilizamos las pruebas estáticas de los modelos del
diseño para comprobar si habían problemas potenciales de rendimiento. Las pruebas
estáticas incluían un modelo descrito en una hoja de cálculo acerca de la utilización de los
recursos en distintos niveles de carga. También incluían un modelo de simulación
ejecutable de la utilización de de los recursos del sistema. Esto previno una gran cantidad
de defectos que de otro modo se habrían descubierto durante la prueba de sistema.
Usted también debería considerar a la creación de casos de prueba y datos de prueba como
una forma de pruebas estáticas.
Hablando acerca de las herramientas para las pruebas estáticas, tenemos diversas formas
del análisis estático que podemos realizar. Una de estas formas es la comprobación de la
ortografía, la gramática y la dificultad de lectura que se pueden realizar contra los
documentos. Por ejemplo, Word incluye la capacidad para detectar los errores de
ortografía, los problemas de gramática y los pasajes de lectura difíciles, los cuales pueden
ser útiles para las especificaciones de los requisitos y el diseño.
Al observar el código fuente, podemos utilizar herramientas para comprobar los constructos
peligrosos de programación. Estas herramientas son por ejemplo J-Test, Safer C, lint y
otras. También podemos utilizar las herramientas de código abierto y las comerciales para
medir el código en cuanto a los asuntos del análisis de la complejidad, la cual será
explicada más adelante en este libro.
Complejidad: El grado en que un componente o sistema tiene un diseño y/o una estructura
interna que es difícil de entender, mantener y verificar. Véase también la complejidad
ciclomática.
Las herramientas de análisis estático también contienen las simulaciones de sistemas. Hay
un programa llamado General Purpose System Simulator, el cual ha estado en uso durante
décadas que puede simular componentes básicos de un sistema, como las colas y los
recursos. Como se mencionó antes, existen herramientas de modelado de rendimiento e
investigación de operaciones que pueden predecir el comportamiento del sistema sometido
a carga. Incluso podemos utilizar herramientas simples como las hojas de cálculo para
simular el comportamiento del sistema, especialmente para el rendimiento, pero también
para la funcionalidad.
Empecemos con la técnica manual de las revisiones. Las revisiones deberían ser utilizadas
para cada producto valioso del trabajo del proyecto, en un algún nivel de formalidad u otro.
El costo de las revisiones consiste en tres tipos principales. Primero, si vamos a tener una
revisión, se necesita el tiempo necesario para realizar las revisiones. Con frecuencia, la
preocupación aquí no es tanto el esfuerzo como la duración. Segundo, si estamos realizando
una revisión formal, necesitamos el esfuerzo necesario para recopilar y analizar las
métricas. Tercero, cuando las revisiones son utilizadas para producir valiosas métricas, esas
métricas deberán ser analizadas— con algún esfuerzo — para realizar mejoras en el
proceso. Estos costos no son insignificantes, pero estos producen beneficios serios más
tarde en el proyecto.
Estos beneficios incluyen cuatro tipos principales. El primero y quizás el más convincente,
es el beneficio de cronogramas más cortos. Dado que los defectos serán eliminados antes
con un menor esfuerzo (como se mostró en un capítulo anterior, debemos ahorrar tiempo).
Segundo, debido a que menos defectos entrarán en las fases de pruebas, deberíamos
observar períodos de pruebas más cortos y menos costosos en las pruebas. Tercero, porque
el reproceso es siempre una forma de pérdida— y porque la corrección de defectos es más
fácil cuando encontramos los defectos, en lugar de los síntomas, como es el caso durante
las revisiones — deberíamos observar la productividad mejorada del desarrollador.
Finalmente, como se mostró nuevamente en un capítulo anterior, deberíamos ver la calidad
mejorada del producto, lo cual reducirá los costos indirectos, tanto en el desarrollo como
después de las versiones.
En definitiva, las revisiones de todos los tipos son técnicas probadas, de alto retorno para
mejorar la calidad. David Rico, en sus estudios acerca de las organizaciones del
Departamento de Defensa de los Estados Unidos, encontró que las revisiones tienen un
retorno de la inversión que está siempre por encima de 10-a-1; es decir, 1.000%.
Observemos ahora las similitudes y las diferencias entre las pruebas estáticas y
dinámicas.
Recuerde que las pruebas estáticas son las pruebas donde el ítem sometido a pruebas—el
objeto de pruebas— no es ejecutado, mientras que las pruebas dinámicas son las pruebas
donde el ítem sometido a pruebas—el objeto de pruebas—es ejecutado.
Generalmente, tanto las pruebas dinámicas como las estáticas buscan identificar defectos,
como uno de los principales objetivos. Ambas funcionan mejor cuando una amplia gama de
interesados del negocio están involucrados. Recuerde nuestra descripción anterior acerca de
las pruebas dominantes. Y también, ambas ahorran tiempo y dinero a la compañía, como
fue demostrado en un capítulo anterior cuando hablamos acerca de s los beneficios de las
pruebas tempranas y el aseguramiento temprano de la calidad.
Entonces ¿Cuáles son las diferencias? Bueno, por un lado cada técnica puede encontrar
diferentes tipos de defectos de manera más efectiva y eficiente. Por ejemplo, ciertos tipos
de cuestiones de la mantenibilidad son más fáciles de encontrar en las revisiones y los
análisis estáticos. Por otra parte, las técnicas estáticas encuentran más bien defectos que
fallas. En otras palabras, si realizamos una revisión y encontramos una suposición
equivocada acerca del comportamiento sometido a carga, estamos examinando
directamente la suposición equivocada, no el comportamiento incorrecto que ocurriría.
3.1.1 Ejercicios
Ejercicio 1
Si es así, ¿Cuáles tipos de problemas cree usted que estas revisiones y el análisis estático
localizarían?
Argumente.
Solución del Ejercicio 1
LO-3.2.1 Recordar las actividades, los roles y las responsabilidades de una revisión formal
típica. (K1)
LO-3.2.2 Explicar las diferencias entre los diferentes tipos de revisión: revisión informal,
revisión técnica, revisión guiada (“Walkthrough”) e inspección. (K2)
LO-3.2.3 Explicar los factores para el desempeño exitoso de las revisiones. (K2)
Inspección: Un tipo de revisión por pares que se basa en la revisión visual de documentos
para detectar defectos, p.ej., las violaciones de los estándares de desarrollo y la
disconformidad con la documentación de nivel superior. La técnica de revisión más formal
y además basada siempre en un procedimiento documentado. Véase también la revisión por
pares.
Revisión técnica: Una actividad de debate de grupo por pares que se enfoca en lograr un
consenso acerca del método técnico que deba tomarse. Véase también la revisión por pares.
Revisión guiada (“Walkthrough”): Una presentación paso a paso por el autor de un
documento con el fin de reunir información y establecer un entendimiento común de su
contenido. Véase también revisión por pares.
Hay revisiones informales. Éstas no siguen un proceso real e incluyen charlas de pasillos,
pruebas de pares, programación de pares y líderes técnicos que revisan los diseños y el
código. Éstas pueden que tengan los resultados documentados, pero el nivel de detalle en el
documento es típicamente bajo. Tienen una efectividad limitada en la eliminación de los
defectos, pero son útiles, económicas y populares.
Como con las revisiones técnicas, en la práctica, éstas varían de bastante informal
a muy formal. Los propósitos principales de una revisión guiada son aprender,
ganar la comprensión y encontrar los defectos.
Revisión por pares: Una revisión de un producto del trabajo del software por colegas del
productor del producto con el propósito de identificar los defectos y las mejoras. Ejemplos
son la inspección, la revisión técnica y la revisión guiada (“Walkthrough”).
Escribano: La persona quien registra cada defecto mencionado y alguna sugerencia para la
mejora del proceso durante una reunión de revisión, en un formulario de registro. El
escribano debería que garantizar que el formulario de registro sea legible y comprensible.
Una inspección es el método más formal. En este método, un moderador entrenado, quien
no puede ser el autor, lidera el equipo de inspección. Los compañeros son seleccionados
cuidadosamente para formar el equipo de revisión. Cada miembro del equipo de revisión
tiene roles definidos, basados en su experticia particular. Un proceso formal de inspección
es utilizado, el cual tiene reglas, listas de comprobación, criterios de entrada y salida. El
proceso incluye también la recopilación de las métricas de la eliminación de los defectos.
La preparación de la pre-reunión puede ser llevada a cabo, como descrita para la revisión
técnica, pero para las inspecciones esta preparación es obligatoria. Hay un proceso de
seguimiento formal, incluyendo los elementos opcionales del mejoramiento del proceso. A
veces se da el caso de que un lector especialmente entrenado es incorporado. El propósito
principal de una inspección es de encontrar defectos—de hecho encontrar a casi todos de
ellos.
Ahora, cuando las revisiones guiadas, las revisiones técnicas o las inspecciones son
realizadas por un grupo de pares, la revisión puede llamarse una revisión por pares.
Un par de puntos tienen que ser adicionados aquí. Primero, cualquier producto de software
o producto relacionado con el trabajo puede ser revisado. No sólo revise el código, los
requisitos y las especificaciones del diseño. Revise todos los productos importantes del
trabajo. Segundo, note que cualquier ítem el cual es revisado puede estar sujeto a más de
una revisión. Usted puede realizar estas revisiones en cualquier orden que tenga sentido.
Por ejemplo, usted puede realizar una revisión informal de una especificación del diseño
antes de una revisión técnica de la especificación del diseño. Usted puede realizar una
inspección de una especificación de requisitos antes de una revisión guiada con los clientes.
Además de encontrar y eliminar los defectos, las revisiones pueden ayudar en el consenso y
el entendimiento. La incompletitud y la ambigüedad pueden ocultar el verdadero
significado de las especificaciones y una revisión puede revelar el significado. Podemos
utilizar una revisión para alcanzar un acuerdo y entendimiento uniforme de las
especificaciones.
Por ello, todos deben entender este objetivo. Una vez hicimos una evaluación donde la
gente mencionó que si bien todos los requisitos del trabajo y las especificaciones del diseño
pasaron por una revisión, algunas veces fueron realizadas después de que el código había
sido escrito. Algunos participantes de la evaluación dudaron del valor de la revisión.
Cuando mencionamos esto a los interesados de la evaluación, ellos dijeron, “Bueno, la
gente necesita entender que las revisiones ayudan a crear un acuerdo acerca de lo que se
está construyendo”.
Les contestamos: “Sí, eso tiene sentido, pero si los participantes no saben que éste es un
objetivo de la revisión, ¿Pondrán ellos atención durante las revisiones?”.
Revise esta cita del libro de Fred Brooks, The Mythical Man Month, el cual
documenta su experiencia con las revisiones que se remontan a la década de los
sesenta. “Mucho antes que cualquier código exista, la especificación debe ser
entregada a un grupo de pruebas externo para que la completitud y claridad sean
revisadas. Como dice V.A. Vyssotsky del proyecto Safeguard Project del
Laboratorio Bell, los desarrolladores mismos no pueden realizar esto: “No te
dirán que no lo entienden, inventarán felizmente su camino a través de las
omisiones y oscuridades”.
Los buenos probadores tienen la habilidad especial de reconocer las partes ambiguas,
oscuras y faltantes de los requisitos y señalarlas en las revisiones.
Observe que los detalles del proceso de revisión dependen del tipo específico de
revisión utilizado en el proyecto, así como también del tipo de revisión utilizado
para cada clase particular del ítem.
Las revisiones implican que las personas desempeñen varios roles y asuman varias
responsabilidades.
El jefe de proyecto planifica, organiza los recursos y la capacitación, apoya y analiza las
métricas del proceso, pero, en algunos procesos, él no participa en la revisión.
Ahora, en algunos casos, una persona puede desempeñar múltiples roles. Por ejemplo, los
autores actúan a veces como moderadores, como en la revisión guiada. Uno de los revisores
puede actuar como secretario. Estos detalles son determinados por el tipo de revisión.
Si bien las revisiones son una forma muy eficiente de encontrar defectos, así como también
una buena herramienta para la educación y la creación de consenso, no es trivial mantener
una buena revisión. Para tener reuniones de revisión exitosas, podemos ofrecer las
siguientes sugerencias:
Por un lado, proporcione capacitación para los participantes de la revisión. Esto no necesita
ser extenso—una hora podría ser suficiente para las revisiones informales, aunque las
técnicas formales como las inspecciones necesitarían mucho más—pero debería enseñar a
la gente el proceso y las reglas básicas.
Como con cualquier reunión, usted debería establecer y seguir una agenda, y tener
objetivos claros y formulados.
La mayoría de los métodos para las revisiones son acerca de la búsqueda de los
problemas, en lugar de la identificación de las correcciones para ellas. En esos
casos, debería limitar el debate acerca de los hallazgos de las personas. La
excepción es que ciertos tipos de revisiones técnicas pueden incluir sesiones de
lluvia de ideas para la solución de los problemas, las cuales deben tener períodos
bien identificados dentro de la revisión.
Tenga un secretario o escribano cuyo trabajo sea de anotar, especialmente acerca de los
problemas identificados. Usted debería tener algún tipo de proceso de ciclo cerrado para
garantizar que todos los problemas sean resueltos, incluso si es algo tan sencillo como pedir
al autor que retorne una copia de la lista de los problemas con una marca de comprobación
junto a cada uno cuando la corrección es realizada.
Ahora bien, podría recordar que en el capítulo 1, cuando hablamos de los beneficios de
realizar el aseguramiento temprano de calidad y las pruebas tempranas, mencionamos que
muy pocas organizaciones saben cuántos defectos son introducidos, detectados y
eliminados en las primeras etapas del ciclo de vida. Si desea recopilar métricas acerca de
las revisiones, tendrá que pensar en la forma adecuada de incorporar eso en este proceso.
Algunas personas asumen que los mismos procesos, relativamente pesados, utilizados para
hacer el seguimiento de los defectos durante los niveles de pruebas de etapas finales como
las pruebas de sistema son los únicos métodos posibles. Usted puede utilizar esos métodos,
pero a la mayoría de nuestros clientes no les agrada. Se recomienda identificar las métricas
esenciales que desea recopilar de las revisiones y hacer el seguimiento sólo a éstas.
Comprendiendo la manera de incluirlas en su base de datos del seguimiento de los defectos
le permitirá extraer un conjunto unificado de las métricas de ese repositorio.
Todos deberían participar en la reunión de revisión preparada, lo que significa que han
leído la revisión del ítem sometido a pruebas y han recopilado algunas notas preliminares.
Usted puede asegurarse de la preparación, haciendo que la gente presente notas antes de la
reunión.
Revise las revisiones y sus resultados de forma periódica, para asegurarse de que el proceso
está funcionando.
Utilice la técnica adecuada para cada tipo de ítem. Más antes mencionamos nuestra regla
“dos pares de ojos” para los productos del trabajo de las pruebas. Esto significa que cada
informe de defectos y cada caso de pruebas son revisados. Sin embargo, para los informes
de los defectos, utilizamos una revisión rápida, muy informal, con sólo dos personas,
mientras que para los casos de prueba utilizamos una revisión de pares más formal, con tres
o cuatro personas.
Es muy útil de hacer participar a los probadores—si el probador puede leerlo— en las
revisiones de los productos del trabajo así como los requisitos, los casos de uso, las
especificaciones del diseño e incluso el código. Primero, el probador tiene una buena
mentalidad para la revisión, especialmente encontrando los defectos. Segundo, los
probadores pueden aprender más acerca del producto, durante el desarrollo temprano y
utilizar ese conocimiento para crear los casos de prueba con más anticipación.
Evitar el uso indebido de los hallazgos y los resultados de las revisiones. Si la gente
observa los resultados de la revisión utilizados para las evaluaciones del personal, la
entrega de bonos, la determinación de aumentos de pagos o salarios, la asignación de
culpabilidad y responsabilidad para los problemas del proyecto, o la entrega de cualquier
recompensa o sanción relacionada con la gestión, la confianza será perdida y el proceso de
revisión fallará—o se volverá tan desagradable o político que usted deseará que falle.
Como cualquier cambio del proceso lleva tiempo y requiere de recursos comprometidos,
necesitará asegurarse del apoyo de la gerencia.
Por último, tenga en cuenta que las revisiones no son algo que aprende una vez y luego
sabe perfectamente. El proceso de revisión debería ser mejorado continuamente.
También es común encontrar que los escenarios no han sido pensados cuidadosamente y
tienen problemas de completitud que lo dejan a usted pensando, “Bueno, ¿Y qué pasa
después?” Por ejemplo, considere una declaración como esta, “Al ingresar tres contraseñas
inválidas, el sistema debería bloquear la cuenta del usuario”. Esto parece una buena idea en
un principio, desde el punto de vista de seguridad, pero pregúntese usted mismo algunas de
las preguntas obvias. ¿Durante cuánto tiempo estará bloqueada la cuenta? ¿Cómo podemos
desbloquearla antes si es necesario? ¿Quién está autorizado para desbloquearla? Esta
declaración, aparentemente una mejora de la seguridad, en realidad podría permitir un
pequeño e ingenioso ataque de la denegación del servicio. En primer lugar, el hacker
ingresa tres contraseñas al azar para las cuentas administrativas o del súper usuario,
bloqueando aquellas y luego procede a introducir las contraseñas al azar para todas las otras
cuentas. ¡Tantán! El software es inutilizable.
Un tercer problema común de los requisitos y el diseño es que la declaración no puede ser
probada. Pregúntese: “¿Cómo puedo comprobar este requisito?” Si no hay manera de
confirmar o negar el requisito, no es comprobable. Por ejemplo, considere la declaración,
“El sistema debería proporcionar una disponibilidad del 100%”. Bueno, es posible realizar
una prueba que cause una caída, para desaprobar esto, pero ¿Cómo podría confirmarlo? No
existe una técnica de pruebas conocida para demostrar una disponibilidad perfecta del
100%. 99,999%, sí, pero no el 100%.
Por último, mantenga los ojos abiertos para las dependencias, el acoplamiento y
la complejidad excesivos. Busque diagramas de diseño deformes y requisitos
confusos. Si se le hace difícil de descubrirlos, es también probable que les sea
difícil a los demás.
Ahora, examinemos el estándar que se aplica en las revisiones, el estándar IEEE 1028. Este
estándar consiste en ocho secciones, de las cuales veremos las primeras cinco:
Sección 2, Referencias
Sección 3, Definiciones
Sección 4, Revisiones de gestión, aborda las responsabilidades, las entradas y las salidas de
los datos, los criterios de entrada y salida y los procedimientos para las revisiones de
gestión. Tenga en cuenta que las revisiones de gestión no son parte del Programa de
Estudios Nivel Básico.
Sección 5, Revisiones técnicas, también llamadas revisiones de pares, que cubren las
responsabilidades, las entradas y salidas de datos, los criterios de entrada y salida y los
procedimientos para estas revisiones.
Sección 6, Inspecciones, las más formales de las revisiones, son cubiertas, con la
información acerca de las responsabilidades, las entradas y las salidas de los datos, los
criterios de entrada y salida y los procedimientos. Porque esta técnica es más formal que
una revisión técnica, el estándar cubre también la recopilación de los datos y la mejora del
proceso a través de las inspecciones.
Sección 7, Revisiones guiadas, que cubren las responsabilidades, las entradas y las salidas
de los datos, los criterios de entrada y salida y los procedimientos. Las revisiones guiadas
son menos formales que las inspecciones, pero, de acuerdo con el estándar IEEE 1028, más
formales que las revisiones técnicas, así el estándar cubre también la colección de los datos
y la mejora del proceso a través de las revisiones guiadas. En la práctica común, aunque
una revisión guiada no es más que una revisión técnica, donde el autor es el moderador y el
ítem sometido a revisión es la agenda.
3.2.1 Ejercicios
Ejercicio 1
Hemos resuelto este ejercicio en cursos en vivo en todo el mundo con cientos de
personas. Típicamente, los equipos de revisión encuentran cerca de diez defectos
de varios tipos en el Documento de los Requisitos de Marketing.
¿Qué ocurre si el
Añadir la oración “Si el usuario declina la
usuario declina la
compra de más tiempo, el quiosco debería
3.1.2 compra de más
retornar al usuario a la sesión activa hasta que
tiempo cuando se
el período de tiempo actual ha expirado”.
agota el tiempo?
¿Es diferente la
terminación de la
sesión basada en
un reloj al cierre
de la sesión Añadir la oración, “El quiosco debería
(“logout”) en limpiar todos los datos de la sesión (como se
3.1.2 cuanto a la describe en la sección 3.1.8) ante cualquier
limpieza de los terminación de la sesión basada en la
datos de la expiración del tiempo del reloj”.
sesión? No
debería serlo, pero
los requisitos no
lo dicen.
¿Qué ocurre si el
tiempo del reloj
expira mientras el
usuario está
comprando un Añadir la oración, “Si el presente período de
período de tiempo tiempo expira mientras el usuario está
adicional? comprando un período de tiempo adicional, el
¿Cuánto es un quiosco debería darle al usuario una
período de tiempo notificación adicional y debería extender el
3.1.2
de espera tiempo del reloj por 15 segundos. Si el tiempo
razonable para el extendido del reloj expira antes de que el
proceso del pago usuario haya completado la compra, el
del tiempo quiosco debería terminar la sesión del
adicional? ¿Qué usuario”.
pasa cuando el
usuario cambia de
idea y se retira del
quiosco?
¿Tienen que
volver a pasar sus
tarjetas los
clientes con
tarjeta de crédito
y débito para Añada la oración, “Los clientes con tarjetas
comprar tiempo de crédito o tarjetas de débito deben volver a
3.1.2
adicional? Si no, pasar sus tarjetas para comprar períodos de
considere los tiempo adicionales”.
riesgos asociados
con un cliente que
se retira sin
terminar su
sesión.
No está claro si el
límite de una hora
acerca de las
Añada las oraciones, “El quiosco debería
compras aplica a
vender períodos de tiempo adicionales en
los períodos de
incrementos de 5 minutos hasta una (1) hora
tiempo
por cada sesión. No se aplicarán limitaciones
3.1.2 adicionales
acerca de cuántas veces un usuario puede
comprados
extender una sesión por medio de la compra
después de la
de nuevos períodos de tiempo a raíz de la
ventana
expiración del tiempo del reloj”.
emergente de
advertencia de 60
segundos.
El quiosco tiene
que ofrecer al
usuario una
selección de
Cambie la frase para que se lea, “En la
navegadores,
pantalla de Bienvenida, cada quiosco
¿Pero no debería
Omninet debería proporcionar al usuario una
decir el requisito
selección de navegadores alternativos. Estos
3.1.3 “navegadores
deberían ser las últimas versiones de
alternativos”?
Netscape, Opera o Internet Explorer
Nosotros
(disponibles sólo en los quioscos con
asumiríamos que
Windows)”.
todo el programa
del quiosco sería
una aplicación
web ejecutándose
en alguna especie
de servidor Web
local (p.ej., IIS o
Apache), lo cual
significaría que a
excepción de los
períodos de inicio
o como un
resultado de un
error fatal, el
software del
quiosco se
ejecutaría siempre
en un navegador.
Parecería que esta
función
proporciona el
cambio a otros
navegadores
alternativos.
Si el comentario
de arriba es
correcto, entonces
la falta de la
especificación de
navegadores
alternativos Añadir la frase, “Los quioscos con Windows
versus por defecto deberían tener por defecto la última versión
para todos los del navegador Internet Explorer. Los
3.1.3
sistemas quioscos con Linux deberían tener por
operativos de los defecto la última versión del navegador
quioscos es una Netscape”
omisión en los
requisitos, o en lo
mínimo debería
ser atendido en la
especificación del
diseño.
“En localidades
donde
comúnmente se
hablan múltiples Añadir una segunda oración a este párrafo,
idiomas”, ¿Tendrá “El quiosco debería presentar cada idioma
3.1.5 el usuario la opcional al usuario en ese idioma; (p.ej.:
opción de ‘Para español toque aquí’ en vez de ‘For
seleccionar su Spanish, touch here’)”.
idioma
preferido en su
idioma preferido?
Las costumbres,
Añada la oración “La obstaculización del
las religiones
contenido debería ser localizado para cada
3.1.6 locales y etc.
quiosco y debería tomar en cuenta las
influencian lo que
costumbres y las religiones locales, así como
es ofensivo, pero
no hay también las edades de los usuarios esperados
reconocimiento de del quiosco”.
esta cuestión en
esta sección.
Las referencias a
los prototipos de
las pantallas Añada las referencias apropiadas en cada
3.2
apropiados para la subsección en 3.2.
administración no
se encuentran.
Las
actualizaciones
automáticas deben
ocurrir a las “2:00
AM en la hora
local”, pero ésta
es una hora que Añadir la frase en el paréntesis, “(En el caso
ocurre dos veces de un cambio de la hora local o basada en el
en un día en el cronograma [p.ej., los horarios de el ahorro
3.2.1 año y cero en de luz diurna] que podrían interferir con este
veces un día en el cronograma, sin embargo el quiosco debería
año en muchos conectarse exactamente una vez por día lo
lugares donde más cerca que se pueda a las 2:00AM)”.
ocurren los
cambios del
horario por el
ahorro de luz
diurna o del reloj
de verano.
¿Está el quiosco
Añadir la frase, “El quiosco debería
disponible durante
permanecer disponible para el uso durante las
las
actualizaciones. El quiosco no debería
actualizaciones?
terminar sesiones activas si es que una
¿Qué pasa si el
3.2.1 actualización se inicia durante la sesión.
quiosco está en
Durante la interacción activa del usuario con
uso cuando una
Internet, el proceso de actualización no
actualización
debería consumir más de la mitad del ancho
programada va a
de banda del quiosco”.
comenzar?
LO-3.3.1 Recordar los defectos y los errores típicos identificados por el análisis estático y
compararlos con las revisiones y las pruebas dinámicas. (K1)
LO-3.3.2 Describir, utilizando ejemplos, los beneficios típicos del análisis estático. (K2)
LO-3.3.3 Hacer una lista de los defectos típicos del código y el diseño que pueden ser
identificados por las herramientas de análisis estático. (K1)
Esta sección, Análisis estático por medio de herramientas, cubrirá los siguientes conceptos
clave:
Al igual que las pruebas dinámicas, el análisis estático busca defectos en el software
mismo, pero también puede buscar defectos en los modelos del software como los
requisitos o los modelos ejecutables así como los modelos de rendimiento del sistema que
mencionamos anteriormente.
Análisis estático implica el análisis del sistema o sus componentes por una herramienta—
eso es lo que hace diferente al análisis estático de una revisión, la cual es manual. Las
pruebas dinámicas no siempre involucran herramientas
El análisis estático puede encontrar defectos que son difíciles de encontrar o aislar en las
pruebas dinámicas.
Por último, tenga presente que el aislamiento del defecto es más fácil porque usted
encuentra el defecto, no el síntoma o la falla.
¿Qué puede ser objeto del análisis estático? Bueno, muchas cosas pueden, por lo general
más de lo esperado.
Generalmente, las personas piensan sólo en el código del programa, examinando los flujos
de control y el flujo de datos, examinando las violaciones de los estándares de codificación.
Sí, ése es un uso común del análisis estático, pero no el único.
Glosario del ISTQB
Flujo de datos: Una representación abstracta de la secuencia y los cambios posibles del
estado de los objetos de datos, donde el estado de un objeto puede ser cualquiera de los
siguientes: creación, uso o destrucción.
Hay simuladores que nos permiten analizar los modelos del programa, así como los
modelos de rendimiento.
Podemos comprobar las salidas generadas como HTML y XML acerca de la conformidad
con una sintaxis correcta, los enlaces rotos, y así sucesivamente.
Por último, incluso los análisis usuales, como la ortografía, la gramática, las
comprobaciones de los requisitos acerca de la dificultad de su lectura y la legibilidad y la
claridad de los documentos del diseño.
Al igual que con las revisiones, el análisis estático proporciona una detección temprana y
más económica de los defectos, a menudo mucho antes que la ejecución de las pruebas
comience.
Esto significa que los defectos pueden ser encontrados y eliminados en muchos
casos fuera de la ruta crítica para la versión, a diferencia de los defectos
encontrados y eliminados durante los niveles de pruebas en las últimas etapas,
como ser las pruebas de sistema y las pruebas de aceptación.
Los análisis estáticos pueden proporcionar advertencias acerca de dónde podrían existir
agrupaciones de defectos, debido a la programación peligrosa, la alta complejidad y así
sucesivamente.
Los análisis estáticos pueden localizar defectos que las pruebas dinámicas no podrían
encontrar, así como el código difícil de mantener, complejo o ilegible.
Estos beneficios se combinan para ayudarnos a mejorar la mantenibilidad del código y los
diseños, y, si recolectamos las métricas y estudiamos las lecciones aprendidas del análisis
estático, nos puede ayudar a prevenir defectos.
Los problemas típicos encontrados durante el análisis estático incluyen:
Referencia a una variable con un valor no definido, que puede hacer caer al sistema si la
variable es un puntero o un resultado erróneo, si es que son utilizados valores aleatorios en
un cálculo.
Interfaces inconsistentes entre los módulos y componentes, así como el paso de un entero
donde se requiere un número real.
Variables que nunca son utilizadas, así perdiendo espacio de memoria y código
inalcanzable (o muerto), lo cual no sólo desperdicia espacio, sino podría crear riesgos de
seguridad.
Lógica faltante o incorrecta, así como la utilización del operador de asignación en lugar del
operador de igualdad lógica en la condición de una sentencia if.
Complejidad excesiva del código, tal vez utilizando una métrica como por ejemplo la
complejidad ciclomática, acerca de la cual hablaremos más adelante en este libro.
Las violaciones de los estándares de programación son otro defecto común del análisis
estático, y muchas herramientas comerciales de análisis estático incluyen bibliotecas
enteras de estándares de codificación.
Por último, el análisis estático puede localizar las violaciones de sintaxis de código y de los
modelos del software.
Si estamos hablando del código, entonces los usuarios típicos son los programadores, con
frecuencia durante las pruebas de componente e integración, aunque ellos comenzarían
idealmente durante la codificación.
Si hablamos de diseño, entonces los usuarios típicos son los diseñadores y los arquitectos
durante el período del diseño. El modelado del rendimiento que hemos mencionado unas
cuantas veces suele ocurrir en ese punto.
Ahora, una cosa que hemos encontrado con nuestros clientes es que durante la presentación
inicial de las herramientas de análisis del código en una base de código existente, estas
herramientas pueden producir un gran número de mensajes de advertencia. Por lo tanto, le
recomendamos el siguiente proceso:
Determine cuáles reglas hará valer y cuáles no son importantes. Desactive las que
no son importantes.
Exija la utilización de las herramientas de análisis estático, pero sólo en funciones o
clases nuevas o aquellas funciones o clases que están siendo modificadas.
Haga que el programador ejecute el análisis estático y sus pruebas de unidad antes
de declarar el código como terminado y exíjale que presente los resultados del
análisis estático y las pruebas de unidad, junto con las pruebas unitarias mismas,
para una revisión del código antes de aceptar el código como terminado.
Si este proceso se aplica con diligencia en el tiempo, las partes más defectuosas del código
existente—siendo las más propensas que necesitan mantenimiento—se pondrán
gradualmente en conformidad con los estándares de codificación. En cuanto al resto del
código, oiga, si no está causando problemas, creo que las violaciones de los estándares de
codificación que existen no están creando demasiados problemas.
Algunas personas utilizan los compiladores para hacer su análisis estático, pero
hay muchas herramientas sofisticadas. Sin embargo, algunos compiladores y
entornos de desarrollo integrados son también cada vez más sofisticados en este
sentido.
Compilador: Este término no está definido en el glosario del ISTQB. La política del
ISTQB es que los términos no definidos en el glosario no pueden ser incluidos en el
examen.
3.3.1 Ejercicios
Ejercicio 1
Argumente.
En Omninet, utilizaríamos el análisis estático para el código Java, C++ u otro lenguaje de
programación utilizado para crear las aplicaciones en los servidores y el procesamiento de
los pagos y los períodos de tiempos de los quioscos. También utilizaríamos el análisis
estático en HTML en las interfaces del usuario, los repositorios de datos XML y las bases
de datos SQL.
20 Véase el libro de Capers Jones, Estimating Software Costs, para las cifras acerca de la
efectividad típica de varias actividades del aseguramiento de calidad y las pruebas.
21 Este ejercicio y su solución han sido adaptados del capítulo 9 del libro de Rex
Black Pragmatic Software Testing
El libro Estimating Software Costs de Capers Jones cita el 65% como la efectividad de
22 las revisiones de diseño y código, entonces estamos utilizando ese cálculo como una
estimación aproximada de la efectividad del análisis estático solo para ilustrar este
punto.
Capítulo 4
Técnicas de Diseño de Pruebas
“Por norma, los sistemas software no funcionan bien hasta que han sido utilizados y han
fallado repetidamente en entornos reales”
LO-4.1.3 Evaluar la calidad de los casos de prueba en términos de trazabilidad clara a los
requisitos y resultados esperados. (K2)
Esta sección, proceso de desarrollo de pruebas, cubrirá los siguientes conceptos clave:
El desarrollo o la especificación de las pruebas que deben ser ejecutadas pueden llevarse a
cabo en una secuencia sistemática de fases. El diagrama en esta figura muestra esos
métodos, asumiendo que usted está utilizando una estrategia analítica de pruebas basada en
los riesgos.
En primer lugar, tenemos el análisis para identificar las condiciones que deben ser
probadas. Si está utilizando una estrategia analítica de pruebas basada en los riesgos,
debería utilizar un análisis de los riesgos de calidad. Tenga en cuenta que los planes de
proyecto, los requisitos de producto y la especificación de diseño del sistema son todos
datos de entradas en el proceso del análisis de los riesgos de calidad. Nosotros mantenemos
la trazabilidad hacia atrás a los documentos fuentes—es decir, al plan de proyecto, los
requisitos o el diseño— para los riesgos de calidad que surgen de las declaraciones
específicas en aquellos documentos.
Producimos un juego de pruebas, un framework lógico para los casos de prueba. Además
capturamos la trazabilidad hacia atrás a la base de pruebas—en este caso los riesgos de
calidad.
Por último, el diseño de pruebas de nivel bajo o la implementación de las pruebas son
llevadas a cabo. Refinamos o elaboramos el diseño de pruebas en casos de prueba y luego
refinamos aquellos casos de prueba en procedimientos de prueba, también llamados
guiones de prueba. Otra vez, nos referimos a las especificaciones detalladas del diseño
como una entrada. Utilizamos también las pruebas existentes para la reutilización y los
estándares, como anteriormente. Las versiones tempranas del objeto de pruebas nos
permiten probar nuestras pruebas, si es que están disponibles. Y nuevamente, mantenemos
la trazabilidad de los casos y procedimientos de prueba hacia atrás a los riesgos de calidad.
Tenga en cuenta que, en la medida de lo posible, hemos utilizado entradas externas como
los planes del proyecto y los requisitos para ayudarnos a crear los entregables internos, el
testware. Una estrategia de pruebas basada netamente en los requisitos necesita estos
entregables. Una estrategia analítica basada en los riesgos puede ser llevada a cabo sin
dicha documentación, sólo con la participación de los interesados del negocio en un análisis
de los riesgos. Sin embargo, la utilización de los requisitos y los documentos del diseño
conducen a análisis de riesgos más precisos.
Idealmente, al utilizar una estrategia analítica de pruebas para desarrollar las pruebas, el
proceso del análisis ocurrirá en paralelo con la especificación de los requisitos. Esto es
mostrado en esta figura por la cronología de las pruebas paralelas y el proyecto en la parte
superior e inferior de la figura, respectivamente.
Una vez más, en condiciones ideales, el diseño de las pruebas de alto nivel se produce en
paralelo con el diseño del sistema. Eso se muestra nuevamente en esta figura como
referencia.
Esta figura muestra que hemos identificado juegos de pruebas, basado en nuestro análisis
de riesgos de calidad. Un juego de pruebas es una colección lógica de casos de prueba. Por
ejemplo, usted puede tener un juego de pruebas de rendimiento, un juego de pruebas
funcionales, un juego de pruebas de manejo de errores, y así sucesivamente.
Para cada juego de pruebas, identificamos las condiciones de las pruebas y las
características que deben ser probadas. Esto es la parte del “qué” del juego de pruebas. Para
cada juego de pruebas, identificamos también el “cómo”, las estrategias, las herramientas y
las técnicas que utilizaremos para probar estas características.
Además, especificamos los criterios de paso/falla, los cuales son los medios por los que
vamos a determinar si una prueba pasó o falló. Por ejemplo, en el caso de un juego de
pruebas de rendimiento, podríamos tener una referencia a una declaración de requisitos, que
dice, que todas las actualizaciones de la pantalla deben ocurrir en medio segundo o menos,
cuando un usuario ingresa una entrada. Estos criterios de paso/falla son también conocidos
como “oráculos de pruebas”.
Al igual que antes, en condiciones ideales, el diseño de las pruebas de nivel bajo se produce
en paralelo con el ciclo de vida de desarrollo del sistema, en este caso la implementación
del sistema. (Por esta razón, en un párrafo anterior, pudimos hablar de versiones tempranas
del objeto de pruebas que está disponible durante el diseño de las pruebas de nivel bajo, de
tal forma que podamos poner a prueba las pruebas. Este paralelismo es mostrado
nuevamente en esta figura como referencia.
En el diseño de las pruebas de nivel bajo, creamos los casos de prueba específicos y
finalmente los procedimientos de prueba que cubren las condiciones de las pruebas
establecidas en el análisis de las pruebas y el diseño de las pruebas de alto nivel. Como se
muestra en esta figura, cada prueba se ajusta a la estructura de los juegos de pruebas, los
cuales son simplemente otra vez colecciones lógicas de casos de prueba.
Las flechas de los Riesgos de Calidad hacia los Casos de Prueba muestran la información
de la trazabilidad que vamos a capturar, relacionando las pruebas con los riesgos. Cada
riesgo que debe ser mitigado por medio de las pruebas, tendrá uno o más casos de prueba
asociados a éste. No hemos mostrado todos los trazos en esta figura. Tenga en cuenta que
algunos riesgos tienen más de un caso de prueba asociado con esos riesgos. En algunos
casos, una prueba se relaciona con múltiples riesgos. En la siguiente parte de esta sección,
usted verá por qué.
Vamos a comenzar con el riesgo. El Glosario del ISTQB se refiere al riesgo como a, “Un
factor que podría resultar en futuras consecuencias negativas, generalmente expresado en su
impacto y su probabilidad”. Bien, eso es un poco difícil de comprender, entonces aquí tiene
una definición más fácil de recordar e informal para el riesgo. La posibilidad de un
resultado negativo o indeseable.
Cada riesgo tiene algún impacto o daño potencial. Esa es la parte negativa o indeseable.
Suele incluir elementos tangibles e intangibles. Por ejemplo, supongamos que la red de
cajeros automáticos de un banco se pone inoperable por un día. Hay la pérdida inmediata y
tangible de los ingresos que sucederían por las transacciones no procesadas. Hay también el
efecto a largo plazo e intangible de la insatisfacción del cliente.
Cada riesgo tiene también alguna probabilidad de convertirse en un resultado. Esto suele
ser difícil o imposible de cuantificar, porque no tenemos el mismo tipo de datos actuariales
y válidos estadísticamente para los proyectos y los productos de software que las
compañías de seguros tienen. Sin embargo, intuitivamente podemos decir que la
probabilidad es mayor que 0; las imposibilidades no son riesgos. También, la probabilidad
es menor que 1 (o 100%); las certezas no son riesgos tampoco.
Ahora, en el programa de estudios del ISTQB, hablamos acerca de los riesgos de proyecto
y los riesgos de producto. Por el momento, nos enfocaremos en los riesgos de producto.
Una definición informal del riesgo de producto que es fácil de recordar es, la posibilidad de
que el sistema fallará para satisfacer a los clientes, los usuarios u otros interesados del
negocio. Los riesgos de producto se llaman también riesgos de calidad.
Éste es un punto importante, porque las pruebas basadas en los riesgos no tienen como
objetivo probar cada posible defecto. Tampoco, el análisis de los riesgos tiene como
objetivo identificar y evaluar cada posible defecto. En cambio, utilizamos los ítems de
riesgo—las condiciones de más alto nivel de las posibles fallas—para enfocar nuestras
pruebas. Los varios niveles de riesgo, a través de los ítems de riesgo, nos ayudan a priorizar
y a ordenar nuestras pruebas, para poder ocuparnos primeramente con las áreas más
riesgosas. Los varios niveles de riesgo nos dicen dónde debemos probar más y dónde
debemos probar menos, porque deberíamos invertir más esfuerzo en las áreas más
riesgosas. Por medio de las pruebas podemos detectar los problemas que de otra manera
afectan a los clientes, y podemos encontrar un porcentaje desproporcionadamente más alto
de los problemas más importantes. A medida que probamos, reducimos el nivel de riesgo
residual a la calidad del sistema y proporcionamos los resultados basados en los riesgos,
informamos al equipo del proyecto y les ayudamos a tomar decisiones acerca de las
versiones en base a información fundamentada.
Las pruebas basadas en los riesgos, cuando son realizadas correctamente, comienzan en las
etapas del inicio del proyecto. Por medio de un comienzo temprano, éstas proporcionan
oportunidades para reducir el riesgo de calidad a través del proyecto. Identificamos los
ítems específicos de los riesgos de calidad específicos, evaluamos su nivel de riesgo y
utilizamos esa información a través del proceso de pruebas. El conocimiento de los riesgos
y sus niveles de riesgo influencian la planificación y el control de las pruebas, la
especificación de las pruebas, la preparación de las pruebas y la ejecución de las pruebas.
Los riesgos identificados, junto con su nivel de riesgo asociado, pueden ayudar con muchos
desafíos de las pruebas, así como:
Las pruebas basadas en los riesgos son una actividad de equipo, involucrando a los
interesados del negocio a través del proyecto. Algunos interesados del negocio traen
experiencia técnica, conocimiento y percepción, mientras otros traen experiencia de
negocios, conocimiento y percepción. Esta experiencia colectiva, este conocimiento y esta
percepción permiten a los interesados del negocio realizar un trabajo riguroso y exacto de la
identificación de los riesgos, la evaluación del nivel de riesgo para cada ítem de riesgo y la
determinación de los niveles y el grado de cobertura de las pruebas para abordar aquellos
riesgos.
En los métodos más maduros para el desarrollo de software, las pruebas basadas en los
riesgos son parte de un método más amplio de gestión de riesgos. Las pruebas basadas en
los riesgos ayudan a reducir la probabilidad de falla del producto y dónde queda la
probabilidad de falla del producto, para reducir el impacto de los problemas en aquellas
áreas. Las pruebas basadas en los riesgos son un método disciplinado, para metódicamente:
evaluar (y reevaluar sobre una base regular) lo que pueda ir mal con el software,
determinar, utilizando el nivel de riesgo, cuáles riesgos son importantes para ser abordados
y las acciones que deben ser implementadas para abordar aquellos riesgos.
Allá a finales de los años ochenta, cuando entramos en el negocio de las pruebas de
software de trabajos anteriores como programador y administrador de sistemas, la Única
Manera Verdadera de realizar las pruebas era con una estrategia de pruebas basada en los
requisitos. Durante el período de la preparación de las pruebas, un probador serio debía
analizar los requisitos, identificar las condiciones de las pruebas, diseñar e implementar las
pruebas para cubrir las condiciones de las pruebas y mantener la trazabilidad de las pruebas
hacia atrás a los requisitos.
Durante los períodos de la ejecución y los períodos exactos, el probador tenía que ejecutar
las pruebas e informar los resultados, incluyendo los informes en cuanto a los requisitos
cumplidos y no cumplidos basados en las pruebas.
En la década de los ochenta, ambos Boris Beizer y Bill Hetzel escribieron, en sus libros,
que el riesgo debería conducir las pruebas. Lamentablemente, no dejaron ningunas
instrucciones acerca de cómo hacerlo.
Siendo una persona quien preferiría adaptar en vez de inventar, buscó en las técnicas de los
años 90 en el mercado de las ideas. Afortunadamente, él tenía mucha experiencia con los
sistemas hardware/software, así que se encontró con el concepto del Análisis de Modos de
Fallas y Efectos. En esta técnica, usted utiliza un framework con categorías, características
de calidad (a la ISO 9126), o subsistemas. Usted luego trabaja con los interesados del
negocio clave para identificar los posibles modos de falla, predecir sus efectos en el
sistema, el usuario, la sociedad, etc. Basado en estos efectos, usted asigna la severidad, la
prioridad y la probabilidad. Usted calcula el número de prioridad del riesgo (RPN) como el
producto de estos tres valores.
Esto fue una revelación para él. El Análisis de Modos de Falla y Efectos resolvieron sus
problemas con las pruebas basadas en los requisitos. Porque esto dependió de la lluvia de
ideas de grupo o entrevistas de uno-a-uno, esto era inmune a que si recibió o no los
requisitos. (Por supuesto, si él hubiera recibido los requisitos, podía haberlos utilizado
como una entrada, pero no estaba comprometido con otro equipo para que fueran escritos).
El número de prioridad del riesgo le decía la cantidad del esfuerzo a dedicarle a la
preparación y la realización de las pruebas relacionadas con cada ítem de riesgo. El orden
de la prioridad del riesgo también le decía el orden en el cual debería ejecutar las pruebas.
Así, a lo largo de los años, hemos desarrollado un método ligero e informal que funcionará
en casi cualquier situación, aun conservando las principales ventajas del Análisis de Modos
de Falla y Efectos. Hemos desarrollado una lista de categorías clásicas de los riesgos de
calidad, así como la funcionalidad, los estados y las transacciones, la capacidad y el
volumen, la calidad de datos, el control de errores y la recuperación después de fallas, el
rendimiento, los estándares y la localización, la usabilidad, etc. Trabajando con los
interesados clave del negocio, identificamos los riesgos de calidad, luego establecemos la
prioridad para probar cada riesgo de calidad.
Si quiere algo un poco más formal, puede utilizar el ISO 9126 para estructurar su análisis
de los riesgos. Usted comienza con las seis principales características de calidad,
Funcionalidad, Fiabilidad, Usabilidad, Eficiencia, Mantenibilidad y Portabilidad. Luego,
las divide en sub características clave que aplican para su sistema, siguiendo el estándar
ISO 9126. Por último, identifica los ítems de los riesgos de calidad para cada
subcaracterística y establece la prioridad para probar cada riesgo, nuevamente trabajando
con los interesados clave del negocio.
A partir de la página siguiente, vamos a explicar la técnica informal. Sin embargo tenga en
cuenta que independientemente de la técnica, los aspectos más importantes son la
participación multifuncional de los interesados del negocio, el consenso, y una perspectiva
del mejor resultado posible.
En esta figura, usted puede observar una plantilla que puede ser utilizada para capturar la
información que usted identifica en el análisis de los riesgos de calidad.
El proceso del análisis de los riesgos de calidad consiste en las siguientes actividades. En
primer lugar, identificará los riesgos de calidad y luego evaluará sus niveles de riesgo.
Basado en el nivel de riesgo, determinará la prioridad general de las pruebas y el alcance de
las pruebas. Por último, si los riesgos surgen de los requisitos específicos o elementos de la
especificación del diseño, establezca la trazabilidad hacia atrás a estos ítems. Examinemos
estas actividades y cómo ellas generan la información para llenar esta plantilla.
Primero, recuerde que los riesgos de calidad son problemas potenciales del sistema los
cuales podrían reducir la satisfacción del usuario.
Podemos utilizar una jerarquía de las categorías de los riesgos para organizar la lista y para
refrescar su memoria. Al trabajar con los interesados del negocio, identificamos uno o más
riesgos de calidad en cada categoría y llenamos la plantilla.
Una vez que los riesgos han sido identificados, ahora podemos volver atrás y evaluar el
nivel de riesgo, porque podemos ver los ítems de riesgo en relación con los demás.
Usualmente, utilizamos dos factores principales para la evaluación del riesgo.
La primera es la probabilidad del problema, que es influenciada en su mayor parte por las
consideraciones técnicas. Entonces, a veces lo llamamos “riesgo técnico” para recordarnos
de ese hecho.
El segundo es el impacto del problema, que está influenciado la mayor parte por las
consideraciones de negocios u operaciones. Entonces, a veces lo llamamos “riesgo de
negocios” para recordarnos de ese hecho.
Tanto la probabilidad como el impacto pueden ser evaluados en una escala ordinal así como
alto, medio y bajo. Nosotros preferimos utilizar una escala de cinco puntos, de muy alto a
muy bajo.
Teniendo en cuenta la probabilidad y el impacto, necesitamos una sola medida conjunta del
riesgo para el ítem de riesgo de calidad. Utilizamos la frase número de prioridad de riesgo
para esto, aunque no es exactamente el mismo término de FMEA (Análisis de los Modos de
Fallas y los Efectos). Para crear el número de prioridad de riesgo, combinamos la
probabilidad y el impacto. Una forma es traducir la escala ordinal en una escala numérica,
por ejemplo:
1 = Muy alto.
2 = Alto.
3 = Medio.
4 = Bajo.
5 = Muy bajo.
Entonces podemos calcular el número de prioridad de riesgo como el producto de los dos
números. Es más bien poco elegante, pero funciona. Siéntase libre de elaborar sus propias
fórmulas para el cálculo de este número si la simple multiplicación no funciona.
Ahora, el número de prioridad de riesgo puede ser utilizado para la secuencia de las
pruebas. Sin embargo, todavía necesitamos determinar el alcance de las pruebas. Una forma
de hacerlo es de dividir el número de prioridad de riesgo en cinco grupos y utilizarlos para
determinar el esfuerzo de la prueba:
1-5 = Extenso.
6-10 = Amplio.
11-15 = Superficial.
16-20 = Oportunidad.
21-25 = Informar de defectos solamente.
Otra vez, siéntase libre para afinar estos grupos para que coincida con sus necesidades.
Mientras pasa por el proceso del análisis de los riesgos de calidad, es probable que usted
genere varios subproductos útiles. Estos incluyen los supuestos de la implementación que
usted y los interesados del negocio hicieron acerca del sistema en la evaluación de la
probabilidad. Usted querrá validar estos, y ellos podrían demostrar sugerencias útiles. Los
subproductos incluyen también los riesgos del proyecto que usted descubrió, los cuales el
director del proyecto puede abordar. Tal vez lo más importante es que los subproductos
incluyen los problemas con los requisitos, el diseño u otros documentos de entrada. Ahora
podemos evitar que estos problemas se conviertan en defectos reales del sistema. Observe
que los tres habilitan el rol preventivo de los defectos de las pruebas tratados anteriormente
en este libro.
Segundo, utilice un proceso de dos etapas: identifique los ítems de riesgo, a continuación
evalúe el nivel de riesgo. Los riesgos están relacionados entre sí, por lo tanto no puede
asignar el nivel de riesgo hasta que haya visto todos los riesgos.
Tercero, sea tan específico como necesite serlo, pero no más específico. Es decir, si está
considerando un ítem de riesgo y si este debería ser dividido en dos o más ítems de riesgo,
pregúntese: “¿Me ayudaría a distinguir entre los diferentes niveles de riesgo la separación
de estos ítems de riesgo en dos o más ítems de riesgo?” Si la respuesta es no, no los divida.
Por último, entienda que este proceso es falible. Usted cometerá errores, en algunos casos
debido a la información limitada. Eso está bien, siempre y cuando haga el seguimiento y
vuelva a alinear el análisis de los riesgos con las pruebas y el proyecto en hitos clave del
proyecto.
Examinemos algunas plantillas de documentación que puede utilizar para capturar la
información a medida que analiza, diseña e implementa sus pruebas. La primera es la
Especificación del Diseño de Pruebas IEEE 829.
La especificación del diseño de pruebas describe una colección de casos de prueba y las
condiciones de pruebas que abarcan en un nivel alto. Esta plantilla incluye las siguientes
secciones:
La secuencia de los juegos y casos de prueba dentro de los juegos de prueba es a menudo
dirigida por la prioridad del riesgo y el negocio. Por supuesto, la secuencia debe ser
afectada por las restricciones, los recursos y el progreso del proyecto.
Luego viene la Especificación del Caso de Prueba IEEE 829. Una especificación del caso
de prueba describe los detalles de un caso de prueba. Esta plantilla incluye las siguientes
secciones:
Si bien esta plantilla define un estándar para los contenidos, la pregunta de lo que es un
caso de prueba es ciertamente una pregunta abierta. En la práctica, los casos de prueba
varían significativamente en esfuerzo, duración y número de condiciones de pruebas
cubiertas. Finalmente viene la Especificación del Procedimiento de Prueba IEEE 829. Una
especificación del procedimiento de prueba que describe cómo ejecutar uno o más casos de
prueba. Esta plantilla incluye las siguientes secciones:
Mientras que el estándar IEEE 829 distingue entre los procedimientos de prueba y casos de
prueba, en la práctica los procedimientos de prueba son a menudo embebidos en los casos
de prueba.
El glosario define la trazabilidad como “La habilidad de identificar los ítems relacionados
en la documentación y el software, así como los requisitos con las pruebas asociadas”. Note
que es otra manera de decir que estamos asociando la prueba con la base de pruebas, lo cual
es “la documentación en la cual los casos de prueba se basan”.
Hay muchas maneras de medir la cobertura en el uso común. Para las estrategias basadas en
los requisitos, planificaríamos medir principalmente contra las especificaciones de los
requisitos. Para las estrategias de pruebas más amplias, podríamos también medir contra las
especificaciones del diseño.
Para las estrategias basadas en los riesgos, medimos principalmente contra los riesgos,
aunque también tenemos la trazabilidad de los riesgos hacia atrás a las especificaciones de
los requisitos y el diseño. Cuando la interoperabilidad es un tipo de pruebas importante,
también podría medir la cobertura de las configuraciones, las interfaces y otros también.
Hemos ilustrado una técnica para capturar la cobertura en esta figura. Podemos utilizar una
hoja de cálculo para mostrar el caso de prueba horizontalmente a través de la parte superior
y la especificación de los requisitos verticalmente en el lado izquierdo hacia abajo. Cada
celda contiene una medida del grado de cobertura que un caso de prueba dado proporciona
para un elemento de especificación dado.
Sin embargo la realidad es, que usted no lo haría probablemente de esta manera. Para un
sistema grande, puede tener cientos de elementos en su base de pruebas, y cientos de casos
de prueba. Eso resulta en una hoja de cálculo con diez miles, algunas veces cientos de miles
de celdas que hacen el seguimiento. Introduciendo la información errónea en tal hoja de
cálculo es muy posible y es una pesadilla de mantener. El mejor método es utilizar una base
de datos. Esas bases de datos son la parte esencial de las herramientas de gestión de pruebas
que pueden capturar la información de la trazabilidad.
4.1.1 Ejercicios
Ejercicio 1
Argumente.
Al realizar este análisis de los riesgos de calidad, usted debería haber recordado que los
riesgos se pueden relacionar con los quioscos, el centro de llamadas y el centro de datos.
Algunas personas tienden a olvidar todo lo que no tiene que ver con la funcionalidad de
cara al cliente, lo cual conduce a muchos problemas pasados por alto.
Otra equivocación común que la gente comete en el análisis de los riesgos es olvidar que
los riesgos no sólo se relacionan con la funcionalidad, sino también con el rendimiento, la
seguridad, la privacidad y otras características de calidad no funcionales.
Al realizar el análisis de los riesgos, usted tuvo que tener cuidado de mantener todos los
riesgos en la perspectiva mientras se asignaron los niveles de riesgo. De otra manera habría
tenido t una inflación de riesgos, donde todo sea calificado como de riesgo alto.
También debería haber estado listo para hacer algunas suposiciones razonables de la
implementación. Porque no todos los probadores son expertos técnicos, incluyendo los
tecnólogos en el proceso del análisis de los riesgos, quienes puedan llenar estos espacios en
blanco es esencial.
Para revisar el proceso, primero debería haber identificado los riesgos, después priorizarlos.
Una vez que tuviera una prioridad agregada, debería haber utilizado esa prioridad para
guiar el grado de cobertura de las pruebas en cada área de riesgo. En el libro sugerimos que
utilice cinco niveles del grado de cobertura:
Pruebas extensivas. Probar el área entera del riesgo, con muchas variaciones.
Pruebas amplias. Probar el área entera del riesgo, pero con pocas variaciones.
Pruebas superficiales: Probar una muestra del área del riesgo, explorándola
brevemente.
Pruebas de oportunidad. Probar el área del riesgo sólo si alguna otra prueba lo lleva
a usted al área.
Informar defectos. Si ve problemas en esta área del riesgo, infórmelos, pero no haga
nada más.
A medida que trabajó a través del Documentos de los Requisitos de Marketing de Omninet
y el Documento de los Requisitos del Sistema Omninet, descubriendo los riesgos asociados
con cada área, debería haber retenido la información de la trazabilidad entre la sección de
los documentos y los riesgos asociados. Esta información de la trazabilidad es útil para el
diseño de pruebas y la creación de los informes de resultados.
En la tabla 4.2, proporcionamos nuestra solución para el ejercicio del análisis de los riesgos
de calidad. En el material que sigue a la tabla, damos algunas observaciones acerca de
nuestra solución así como también algunos hallazgos interesantes que ocurrieron cuando
pasamos por el proceso del análisis de los riesgos de calidad.
Tabla 4.2: Solución-Análisis de los Riesgos de Calidad de Omninet.
Para algunos riesgos, hemos desviado el grado de cobertura de las pruebas de lo que el
número total de prioridad de riesgo sugeriría. Por ejemplo, hemos asignado las pruebas de
oportunidad para “el cierre de sesión del usuario falla”, la cual tenía un número de prioridad
de riesgo 10. ¿Por qué? Porque es una tarea de programación simple, lo más probable, y
puede realizar fácilmente su prueba de integración en algunas otras pruebas.
¿Puede detectar los otros riesgos para los cuales hemos desviado el grado de cobertura de
las pruebas? ¿Puede darse cuenta por qué? La documentación de esas decisiones y las
suposiciones es probablemente lo mejor. Sin una explicación como la que está en el párrafo
de arriba, es difícil de saber nuestro razonamiento.
Note que la relación entre los riesgos de calidad y los elementos de la especificación de los
requisitos es de muchos-a-muchos. Un requisito se puede relacionar con múltiples riesgos.
Eso está bien. Un riesgo se puede relacionar con múltiples requisitos. Eso está bien,
también, en números pequeños. Sin embargo, si encuentra que tiene demasiados requisitos
asociados con un riesgo, usted probablemente no está siendo lo suficientemente específico.
Por ejemplo, “el sistema no funciona” se relacionaría a cualquier requisito, pero no le ayuda
a darse cuenta a dónde enfocar sus pruebas.
A medida que priorizamos los riesgos, nos dimos cuenta que algunos ítems que habíamos
incluido, como dos riesgos, se plegaron en un sólo riesgo. Por ejemplo, “Los agentes del
centro de llamadas no pueden acceder/controlar las sesiones actuales”, eran originalmente
dos ítems en una línea cada uno, uno relacionado con el acceso y el otro con el control.
Cuando vimos que tenían los mismos números de riesgo de prioridad, entonces los
combinamos. Tomamos ventaja de esos descubrimientos para mantener las tablas del
análisis de los riesgos tan cortas como era posible.
Porque solamente realizamos este análisis, estamos seguros que pasamos por alto algunos
riesgos importantes. Los equipos multidisciplinarios que trabajan juntos no tienden a pasar
por alto tantos riesgos.
¿Cuáles defectos encontró en los requisitos? Es un buen beneficio secundario del análisis
de los riesgos de calidad que sirve como una forma estructurada de revisión de los
requisitos.
Ejercicio 2
Establezca la relación entre sus juegos de prueba y los riesgos que serán cubiertos.
Basado en su análisis de los riesgos, ¿Cómo secuenciaría los juegos de prueba? ¿Qué otras
consideraciones afectarían la secuenciación de los juegos de prueba?
Argumente.
Note que hemos agrupado los juegos de prueba en grupos de secuencia que serían
ejecutados en paralelo y en orden por los probadores. Si tuviera que haber orden dentro de
un grupo, éste emergería de las restricciones logísticas como la disponibilidad de los
probadores o del material de trabajo. Las restricciones logísticas podrían también resultar
en un juego de prueba siendo ejecutado en paralelo con las pruebas en otro grupo de
secuencia.
Las pruebas no están perfectamente en el orden de los riesgos, porque decidimos probar la
funcionalidad individual, antes de empezar con pruebas más complejas. Idealmente, estas
pruebas serían empujadas a las etapas tempranas de pruebas y repetidas sólo como criterios
de entrada para la prueba de sistema.
LO-4.2.1 Recordar las razones que tanto el método de pruebas basado en la especificación
(caja negra) como en la estructura (caja blanca) son útiles para el diseño de casos de
pruebas, y haga una lista de las técnicas comunes para cada uno. (K1)
LO-4.2.2 Explicar las características, cosas en común, y diferencias entre las pruebas
basadas en la especificación, las pruebas basadas en la estructura y las pruebas basadas en
la experiencia. (K2)
Esta sección, Categorías de las Técnicas de Diseño de Pruebas, cubrirá los siguientes
conceptos clave:
Hay tres tipos de técnicas de diseño de pruebas incluidas en el programa de estudios básico.
Algunas pruebas pueden ser clasificadas como basadas en la especificación. Esto es cuando
principalmente creamos las pruebas por medio del análisis de las bases de pruebas. Cuando
éstas fallan, estas pruebas revelan típicamente los defectos en la manera en la cual el
sistema se comporta. Cuando éstas pasan, estas pruebas construyen típicamente la
confianza en el comportamiento del sistema.
Algunas pruebas pueden ser clasificadas como basadas en la estructura, también llamadas
pruebas de caja blanca. Esto es cuando creamos principalmente las pruebas por medio del
análisis de la estructura del componente o sistema. Cuando éstas fallan, estas pruebas
revelan típicamente los defectos en la manera en la cual el sistema está construido.
Algunas pruebas pueden ser clasificadas como basadas en la experiencia, así como las
basadas en los ataques, las basadas en las listas de comprobación y las exploratorias.
Pruebas negativas: Pruebas con el objetivo de mostrar que una componente o sistema no
funciona. Las pruebas negativas están relacionadas con la actitud de los probadores más
que un método de pruebas específico o una técnica de diseño de pruebas, p.ej. las pruebas
con valores de entrada inválidos o excepciones. Note que este término no es
específicamente enunciado para esta sección pero es incluido aquí ya que está relacionado
con el término ataque de defectos.
Esto es cuando creamos las pruebas principalmente basadas en la comprensión del sistema,
la experiencia pasada y las suposiciones con cierta base acerca de los defectos. Cuando
fallan, estas pruebas revelan típicamente loas defectos en los lugares en los que otros
sistemas tienen defectos. Sin embargo, debido a la falta de documentación, estas pruebas a
menudo no construyen la confianza en el sistema, porque la cobertura es difícil de medir.
Las pruebas basadas en la estructura o pruebas de caja blanca, presentan algunos elementos
básicos comunes. Primero, utilizaríamos las estructuras del sistema para derivar los casos
de prueba, por ejemplo el código y diseño. Estas estructuras incluyen el código mismo, las
tablas de base de datos, las consultas o las relaciones y el diseño del sistema. El siguiente
paso típico sería que usted mida el grado de cobertura estructural para otros casos de
pruebas existentes, así como las pruebas basadas en la especificación o las pruebas basadas
en la experiencia. A continuación, si se justifica, utilizaríamos más casos de prueba que
pueden derivarse de forma sistemática para aumentar la cobertura
Cobertura de sentencias.
Cobertura de ramas o decisión.
Ataques.
Listas de comprobación.
Exploratorias.
4.2.1 Ejercicios
Ejercicio 1
Para cada juego de prueba, identifique si una, dos o todas de las siguientes tres categorías
de las técnicas de pruebas serian útiles en el diseño de los casos de prueba:
Argumente.
Ejercicio 2
Usted está probando un sistema de comercio electrónico que vende chucherías como
gorras, camisetas de baseball etc. El ejercicio consiste en crear pruebas funcionales para la
página Web que acepta los pedidos. Una pantalla prototipo de la página Web para las
entradas de los pedidos es mostrada en la figura 4.7.24
Figura
4.7: Plantilla de la página Web para las entradas de los pedidos del comercio
electrónico de Omninet.
Estos identificadores de ítems están ordenados por el precio en el catálogo de los productos
en la base de datos del sistema, donde los ítems más económicos tienen los números de
Identificador de ítem más bajos (lo más cercano a 00000) y los ítems más costosos tienen
los números de Identificador más altos (lo más cercano a 99999). Sin embargo, no se tiene
que preocupar acerca de la realización de las pruebas del orden de los datos en la base de
datos, porque no está probando el proceso de la entrada de los datos para el catálogo.
El sistema acepta una cantidad que debe ser pedida, del 1 al 99. Si el usuario ingresa un
Identificador de ítem previamente pedido y una cantidad 0, ese ítem es retirado del carrito
de compras.
Basado en estas entradas, el sistema recupera el precio del ítem, calcula el total del ítem (la
cantidad de veces el precio), y adiciona el total del ítem al total del carrito. Debido a los
límites de los pedidos con tarjetas de crédito, el máximo total para el carrito es de US$
999,99.
Nosotros dibujamos las clases de equivalencia y los valores límite para el número del
Identificador de ítem en dos maneras, como es mostrado en la figura 4.8. Hay dos maneras
de pensar acerca de este campo. Una manera es que este campo sea un entero sin signo con
un valor mínimo de 0 y un valor máximo de 99999. En ese caso, la representación lineal de
los números en la parte superior de la figura tiene sentido. Tendrá que probar cuatro valores
del Identificador de ítem, “-1”, “0”, “99999” y “100000”.
Figura 4.8: Clases de equivalencia y valores límite para el Identificador del ítem
La otra manera de pensar acerca de este campo es que éste es como una cadena de
caracteres que deben ser exactamente 5 caracteres de largo y consistir solamente de dígitos
decimales. En ese caso, la representación gráfica colocada abajo en la figura tiene sentido.
Querrá probar una cadena realmente, realmente larga (para hacer un desborde de búfer),
una cadena de 6 caracteres como “100000”, (inválida solo por el largo), dos cadenas de
cinco caracteres como “31:75” y “27/86” (inválida porque no es una cadena que consta
solamente de dígitos decimales), una cadena de 4 caracteres como “9999” (inválida sólo
por el largo), una cadena de cero caracteres como una cadena nula: “” (usualmente una
entrada de carácter interesante), y dos cadenas de cinco caracteres como “00000” y
“99999”.
¿Cuál representación es correcta? Bien, si usted puede preguntar al programador cómo está
implementado el campo, usted podría probarlo según lo que él le diga. Sin embargo, no lo
hace más dificultoso asumir que ambos podrían estar correctos y probarlo de ambas
maneras. En ese caso, si la implementación cambia, sus pruebas cubrirán todos los casos
interesantes.
Dibujamos las clases de equivalencia y los valores límite para las cantidades pedidas como
es mostrado en la figura 4.9. Observe cómo el valor cero es a veces válido y a veces
inválido, dependiendo de que si el Identificador del ítem ha sido previamente ingresado.
Figura 4.9: Clases de equivalencia y valores límite para las cantidades pedidas.
Las entradas, las acciones y los resultados esperados de las pruebas son mostrados en las
tablas de abajo.
Tabla 4.5: Solución-Casos de Prueba
Hemos asumido que el sistema aceptará el Identificador del ítem ya sea como entero (sin
ceros por delante) o como un campo de cinco caracteres con caracteres numéricos
solamente (con ceros por delante). Esa es la manera permisiva de definir el sistema, y
pensamos que los sistemas deberían ser permisivos cuando sea posible.
Hemos instruido a los probadores que confirmen los precios, probablemente utilizando un
catálogo en papel o una lista de precios y una calculadora. Cuando un oráculo fiable de
pruebas sea fácilmente de obtener y cambiante en el tiempo, es mejor no introducir
redundancia y discrepancias en última instancia por medio de la codificación en duro del
resultado esperado en el caso de prueba. En cambio, puede hacer una nota para comprobar
el resultado esperado durante la ejecución de las pruebas y posiblemente proporcionar
alguna información acerca de dónde encontrar el oráculo de pruebas.
En la prueba 3, podríamos haber notado que estamos asumiendo que usted puede pedir 100
(o más) de un solo ítem simplemente ingresando dos pedidos. ¿Debería estar bien eso?
Bien, si el objetivo del límite es prevenir que la gente pida accidentalmente demasiados de
un solo ítem, forzando al usuario a ingresar dos pedidos hace obvio que la gran cantidad de
pedidos es intencionada. Si el sistema rechazó este valor con un mensaje como, “Lo siento,
pero usted sólo puede pedir una cantidad total de 99 de cualquier ítem dado”, entonces lo
más probable es que no sería un error. Sin embargo, necesitaría de adicionar otra prueba
donde usted pediría la cantidad de 99 de un ítem en un sólo pedido.
También en la prueba 3, el “+” por delante en el total del carrito indica que usted debería
esperar el total del carrito para incluir el total previo del carrito mas la adición del total del
ítem para este ítem. En la prueba 4, el “=” por delante en el total del carrito indica que usted
debería esperar que el total del carrito no sea modificado del total anterior del carrito.
En la prueba 5, estamos asumiendo que el total del ítem para este ítem—el más costoso en
el catálogo— junto con los 100 ítems menos costosos, no excederá el límite total del pedido
de US$ 999,99. Si excede, entonces nosotros posiblemente tendríamos que eliminar ítems
del carro o pasar a pagar antes de ejecutar la prueba 5.
Note que hemos ejercido los valores límite sobre las acciones y las salidas, no sólo
entradas. Por ejemplo, la prueba 6 verifica el pago con un sólo ítem en el carrito. Las
pruebas 7 y 9 verifican el intento de pago sin ítems en el carrito. La prueba 7 debería
resultar en dos mensajes de error, uno por un Identificador incorrecto del ítem y uno por el
intento de pago con el carrito vacío. La prueba 9 debería resultar en un mensaje de error
individual por pagar con el carrito vacío. Otras pruebas verifican el pago con múltiples
ítems en el carrito.
En la prueba 13, hemos asumido que ingresando un Identificador del ítem y una cantidad
válida para algo que ya está en el carrito de compras, se adiciona al total para ese ítem. Sin
embargo, éste podría sobrescribir el total. Sin una clara explicación de por qué el sistema
debería sobrescribir en vez de añadir al total, nosotros informaríamos eso como un defecto.
Como un usuario, esperaríamos que se adicione, no se sobrescriba, así que la decisión
estará reflejada en nuestra interpretación del resultado de la prueba.
No existe un límite establecido acerca de cuántos ítems pueden estar en el carrito, pero
existe un límite establecido acerca el costo total de los ítems. Eso está cubierto por las
pruebas 18 y 19. En la prueba 18, el sistema debería permitirnos comprar US$ 999,99 en
valor total de ítems. En la prueba 19, el sistema debería rechazar el último ítem que
adicionamos—ése que pone el total de nuestro carrito tan cerca como sea posible a US$
1.000,00— pero debería permitirnos comprar los otros ítems que ya hemos añadido a
nuestro carrito.
Hasta cierto punto, este ejemplo deja al criterio del probador o la especificación de los
requisitos las preguntas de que si sería correcto un punto decimal al estilo europeo o un
símbolo de moneda en el resultado. Usualmente preferimos tener probadores inteligentes
que tomen estas decisiones a medida que ellos ejecutan las pruebas. De esa manera, si
después el sistema se ubica en otro local, entonces no necesitamos cambiar las pruebas.
Ejercicio 3
Refiérase a la tabla de decisión de los pagos en el Documento de los Requisitos del Sistema
Omninet.25
Argumente.
Cuando está empezando a diseñar las pruebas desde una tabla de decisión, revise la técnica.
La regla usual para la cobertura de una tabla de decisión es, “Por lo menos una prueba por
columna”. Si las condiciones o acciones tienen valores límite, es posible que usted desee
cubrir aquellas, las cuales podrían resultar en dos reglas por columna. Si las reglas pueden
interactuar, entonces usted debería analizar y probar la interacción también, después de
probar cada regla por sí misma.
También necesita considerar el análisis de los riesgos. En un ejercicio del análisis de los
riesgos de calidad, identificamos el “pago válido rechazado/pago inválido aceptado” como
un riesgo técnico muy bajo pero como un riesgo de negocios muy alto. Basado en eso,
decidimos que este ítem de riesgo debería recibir pruebas amplias.
¿Se recordó usted de referirse a su análisis de los riesgos de calidad para guiarse acerca de
cómo debería probar rigurosamente esta función? Si está realizando pruebas basadas en los
riesgos, eso es importante. Usted fácilmente puede desalinear sus pruebas con el nivel de
riesgo durante el diseño y el desarrollo de las pruebas. En esos casos, probará en exceso
algunos ítems de riesgo bajo y probará demasiado poco algunos ítems de alto riesgo. En el
capítulo posterior acerca de la trazabilidad, examinaremos una manera de comprobar para
asegurar que sus pruebas permanecen alineadas con su evaluación de los riesgos durante el
diseño y el desarrollo de las pruebas. En las pruebas basadas en los riesgos, su análisis de
los riesgos de calidad es su guía básica.
Por supuesto, su evaluación de los riesgos puede cambiar durante el proyecto. Si, durante el
diseño, el desarrollo o la ejecución de pruebas, usted obtiene nueva información o
percepciones que le dicen que la evaluación de los riesgos está incorrecta, usted debería
revisar la evaluación de los riesgos en vez de seguir una guía básica incorrecta.
Las pruebas amplias para esta tabla de decisión, significan que cada condición en la tabla
de decisión sea cubierta (véase la tabla 4.7). Las reglas 5 y 6 involucran una condición
compuesta, “PIN válido (para débito) o PIN no requerido (para tarjeta de crédito)”.
Entonces necesitamos una prueba para cada una de las reglas desde la regla 1 a la 4,
mientras que las reglas 5 y 6 necesitan dos pruebas cada una.
Desde el punto de vista de las pruebas, quisiéramos probar en ambas maneras que la
condición no podría ser cumplida en la regla 5. Sin embargo, por que no hay razón para
pensar que el uso de una tarjeta de crédito o débito influenciaría en la lógica del quiosco en
cuanto a períodos de tiempo válidos, no hay necesidad de incrementar el número de
pruebas para intentar todas las permutaciones.
Desde el punto de vista del diseño del sistema, pudimos prevenir el problema utilizando
una lista desplegable para pedir al usuario una cantidad. La lista solo contendría cantidades
válidas.
Otra cuestión de prueba es que necesitaremos algunos accesorios para esta prueba.
Necesitamos por lo menos una tarjeta de débito válida y una tarjeta de crédito válida. Estas
tarjetas deben estar enlazadas a las cuentas que tengan los saldos apropiados. Obtener este
tipo de accesorios de pruebas es a menudo difícil, entonces usted debería empezar a ver la
forma cómo conseguirlos tan pronto como se entere que los necesitará.
Ejercicio 4
Los quioscos públicos de acceso al Internet de Omninet, pueden estar en varios estados,
basados en la recepción de los pagos, las sesiones activas y así sucesivamente.26
Argumente.
Usted también pudo dibujar un diagrama más simple como algunos lo hacen, dejando de
lado las acciones de inicialización así como también las de filtrado.
Observe que el modelo ve el mundo desde el punto de vista del quiosco. Las transiciones en
este diagrama están definidas en el Documento de los Requisitos de Marketing y el
Documento de los Requisitos del Sistema.
Figura 4.10: Diagrama de Transición de Estados del Quiosco
Asumimos que el informe de los estados por hora para el servidor debería ocurrir en
segundo plano. También asumimos que el registro de los eventos de seguridad ocurre en
segundo plano. Estos involucrarían diagramas de transición de estados diferentes. El
diagrama mostrado, sólo aborda los eventos y las actividades en primer plano.
Elegimos representar las actividades del pago como estado único. También pudimos haber
dividido esto en una secuencia de estados. Cuando está utilizando las técnicas de pruebas
basadas en los estados, algunas veces tenemos que elegir dónde enfocar las pruebas y
dónde simplificar.
La diferencia básica entre cubrir el diagrama y cubrir la tabla es que la tabla toma en cuenta
las situaciones que “no pueden ocurrir” y “no deberían ocurrir”. Donde se necesiten
pruebas extensivas o control considerable de errores y pruebas de robustez, entonces usted
debería planificar para cubrir la tabla.
Finalmente, hemos creado los escenarios de las pruebas para cubrir el diagrama de
transición de estados. Recuerde que la regla de cobertura para el diagrama de transición de
estados es visitar cada estado y atravesar cada transición. Una vez que recibimos la
información acerca de cómo debieron ser tratadas las situaciones indefinidas en la tabla,
nosotros añadiríamos éstas como escenarios adicionales.
1. Comprobar la pantalla de
El quiosco comienza.
Bienvenida.
1. Iniciar el sistema.
2. Comprobar la indicación del
1 Idioma.
2. Tocar el teclado.
3. Comprobar las pantallas de
3. Seleccionar el idioma.
Pago.
4. Hacer un pago válido. 4. Comprobar el navegador.
(Nota: El navegador debería ser
5. Permitir al reloj 60 segundos de seleccionado por el usuario.)
expiración.
5. Comprobar la advertencia de
6. No seleccionar más tiempo. Expiración.
7. Comprobar la pantalla de
Bienvenida. Verificar la limpieza
de los archivos.
Si puede automatizar las pruebas—que podría en este caso resultar algo desafiante— usted
podría tener una herramienta que continuamente navegue a través de los estados, creando
ambas combinaciones de estados/eventos definidas e indefinidas, para ver cómo se
comporta el sistema. Usted puede descubrir problemas de agotamiento de memoria,
bloqueos y caídas intermitentes, y otros tales defectos con tales pruebas.
LO-4.3.2 Explicar el propósito principal de cada una de las cuatro técnicas, cuál nivel y tipo
de pruebas podría utilizar la técnica y cómo la cobertura puede ser medida. (K2)
LO-4.3.3 Explicar el concepto de las pruebas de casos de uso y sus beneficios. (K2)
Valor límite: Un valor de entrada o valor de salida el cual se encuentra en el borde de una
partición de equivalencia o en la distancia incremental más pequeña en cada lado de un
borde, por ejemplo, el valor mínimo o máximo de un rango. Tenga en cuenta que este
término no se enunció específicamente para esta sección, pero se lo incluye aquí, ya que es
esencial para comprender el término análisis de valor límite.
Pruebas de tabla de decisión: Una técnica de diseño de pruebas de caja negra en la cual
los casos de prueba son diseñados para ejecutar las combinaciones de entradas y/o
estímulos (causas) representadas en una tabla de decisión. Véase también tabla de decisión.
Tabla de decisión: Una tabla que muestra las combinaciones de entradas y/o estímulos
(causas) con sus productos y/o acciones (efectos) asociados, los cuales pueden ser
utilizados para diseñar casos de prueba. Tenga en cuenta que este término no se enunció
específicamente para esta sección, pero se lo incluye aquí, ya que es esencial para
comprender el término prueba de tablas de decisión.
Pruebas de transición de estados: Una técnica de diseño de pruebas de caja en la cual los
casos de prueba son diseñados para ejecutar transiciones de estado válidas e inválidas.
Véase también pruebas de conmutador de multiplicidad.
Pruebas de casos de uso: Una técnica de diseño de pruebas de caja negra en la cual los
casos de prueba son diseñados para ejecutar los escenarios de los casos de uso.
Esta sección, Técnicas Basadas en la Especificación, cubrirá los siguientes conceptos clave:
Cómo escribir casos de pruebas a partir de los modelos de software dados,
utilizando el particionamiento de equivalencias, el análisis de valores límite, las
tablas de decisión y los diagramas de transición de estados.
El principal objetivo de cada técnica y cómo la cobertura puede ser medida.
Las ideas esenciales de las pruebas de casos de uso.
Esta expectativa de equivalencia debería surgir ya sea de alguna especificación que requiere
equivalencia, o de una ley o estándar que requiere equivalencia, o simplemente del sentido
común o de expectativas razonables. Estos subconjuntos son llamados ya sea clases de
equivalencia o particiones de equivalencia.
Típicamente, para cualquier conjunto dado de casos de prueba que necesita construir,
necesita usualmente probar más de una entrada, salida, comportamiento, etc. Entonces,
repetirá este proceso de identificar y particionar27 (“to partition”) conjuntos hasta que haya
creado las particiones de equivalencia para todas las entradas, salidas, comportamientos, y
así sucesivamente.
Ahora, en este punto, usted crea sus casos de prueba. Para construir las pruebas para las
entradas, las salidas, las configuraciones o las opciones válidas o lo que sea con lo que esté
trabajando, seleccione un valor de cada partición de equivalencia válida, a continuación
defina el resultado esperado en esa situación. Repita este proceso hasta que haya
seleccionado al menos un valor representativo para cada partición de equivalencia válida en
todas las clases de equivalencia que ha creado.
Note que hemos dicho al menos una vez. Hay muchos casos donde podría seleccionar más
de un valor representativo. Por ejemplo, en el caso de las clases definidas en conjuntos que
están ordenados, podría seleccionar dos valores para cada clase, específicamente aquellos
en el límite superior e inferior de cada clase. Estos valores se denominan valores límite, y
hablaremos más acerca de esta técnica en un momento.
Además, podría seleccionar múltiples miembros de una partición cuando la partición es
particularmente importante desde una perspectiva de negocios. Alternativamente, si
considera que los defectos son particularmente probables para una cierta partición, podría
seleccionar múltiples miembros de esa partición. Al diseñar las pruebas, remítase hacia
atrás a su análisis de los riesgos para determinar el grado adecuado de cobertura de las
pruebas.
Para construir las pruebas para las entradas, las salidas, las configuraciones o las opciones
de ajuste inválidas o lo que sea con lo que esté trabajando, seleccione un valor de una—y
sólo una—partición inválida de equivalencia. Para el resto de las particiones de
equivalencia, seleccione un valor válido. La razón de esta regla es que, si prueba valores
inválidos juntos, no podrá estar seguro de que una entrada, salida, comportamiento o lo que
sea por alguna razón específica serán tratados correctamente. Por supuesto, si sospecha que
ciertos valores inválidos van a interactuar, puede añadir pruebas para ello, pero asegúrese
de que también ha probado individualmente cada valor inválido.
Después que ha seleccionado los valores válidos e inválidos, como antes, usted define el
resultado esperado en esa situación. Usted repite este proceso hasta que se haya
seleccionado al menos un valor representativo para cada partición de equivalencia inválida
en todas las clases de equivalencia que ha creado.
¿Qué tal un ejemplo? Suponga que usted está probando impresoras compatibles para una
aplicación.
Otra forma de crear particiones del conjunto de impresoras se basa en la interfaz lógica, es
decir, ¿Cómo son los datos enviados a la impresora, empaquetados de manera compacta, en
algún flujo importante? Algunas impresoras utilizan PostScript para recibir datos, algunos
HPPL, algunos ASCII, y algunos utilizan otros formatos.
Tenga en cuenta que podemos escoger la forma en la cual quisiéramos particionar basados
en lo que estamos tratando de encontrar, ya sea los defectos o construir la confianza o
reducir el riesgo. Si se asegura que la imagen se ve exactamente como la pantalla es
esencial, entonces la aplicación de la imagen es el particionamiento esencial. Si se asegura
que los drivers de las impresoras están funcionando correctamente, entonces la interfaz
lógica es la partición esencial. O, si se asegura que el hardware es compatible, entonces la
interfaz física es el particionamiento esencial. Por supuesto, podría dividir las tres formas, y
asegurarse de que tiene al menos una impresora para cada partición de equivalencia
identificada.
Hay algo bueno acerca de las pruebas de valores límite, cuando pueda hacerlo. Observe que
el particionamiento de equivalencia puede encontrar defectos en el código que maneja cada
partición de equivalencia. En otras palabras, ¿Se comporta el programa de la manera Y
cuando debería comportarse de la manera X? Sin embargo, un valor arbitrario de la
partición de equivalencia no comprueba necesariamente para ver que el programa
reconoce correctamente los miembros de la partición de equivalencia. Los valores límite,
porque comprueban los límites y son miembros de las clases de equivalencia, pueden
también encontrar defectos en el código que define los límites—las diferencias entre una
partición equivalente y la que está justo por debajo o encima de ésta. En otras palabras,
¿Muestra el programa un comportamiento Y cuando debería mostrar el comportamiento X,
o piensa éste que está tratando con la partición de equivalencia B cuando éste debería
reconocer esta situación como perteneciente a una partición de equivalencia A?
Ahora, note que sólo podemos utilizar el análisis de valores límite cuando los elementos de
la partición de equivalencia son ordenados. En otras palabras, tenemos que ser capaces de
hablar de un valor que es mayor que o menor que otro valor.
Examinemos las particiones de equivalencia y los valores límite para un campo entero.
Suponga que usted está probando un sistema de comercio electrónico. Un campo que
necesitaría probar es el que le permite a alguien especificar la cantidad de un ítem que
quiere pedir. Supongamos que su sistema permitirá que alguien pida máximo hasta 99 de
cualquier ítem dado, y que los ítems sean ítems indivisibles como libros, no ítems como la
harina que se pueden vender en casi cualquier cantidad.
Esta regla significa que los valores del 1 hasta el 99 son la partición de equivalencia válida.
Si es introducido un valor de 0 o menos, que es inválido, entonces aquellos valores forman
la partición de equivalencia inválida demasiado baja. Si un valor de 100 o más es
introducido, el cuál es inválido, entonces aquellos valores forman la partición de
equivalencia inválida demasiado alta.
Note que hay otros dos valores límite, que no se muestran aquí: el miembro más pequeño
de la partición de equivalencia inválida demasiado baja y el miembro más grande de la
partición de equivalencia inválida demasiado alta. Le podría ser difícil de identificar estos
valores extremos, porque ellos dependen de la representación interna de los números
enteros de la computadora, el número máximo de dígitos que puede ingresar en un campo,
y otras restricciones parecidas. Sin embargo, debería hacer un esfuerzo para probarlos,
porque los valores extremos son un lugar común donde se ocultan los defectos.
Para algunos esto podría ser suficientemente bueno, pero no para nosotros. Observe, la
partición de equivalencia válida incluye tanto los números positivos como los negativos y
el cero. Lo que sea que la especificación diga o no diga acerca del manejo diferente de estos
valores, nosotros sabemos que los programadores cometen errores en tales situaciones—en
parte porque nosotros solíamos trabajar como programadores y todavía programamos y
sabemos que hemos cometido esos errores. Entonces, vamos a subparticionar la partición
de equivalencia válida en tres subparticiones o subclases: válido negativo; válido cero, y
válido positivo.
¿Qué tan lejos podemos ir con el subparticionamiento? ¡Tanto así como lo necesitamos o
queramos! Mientras sigan existiendo interesantes valores de pruebas, que se ocultan en una
partición de equivalencia, podemos subparticionar esa partición para tratar de revelarlos.
Note, también, que en la figura 4.11 y la anterior, hemos dejado de lado toda una dimensión
del particionamiento, la cual es para las entradas las cuales no son ni números enteros o ni
decimales válidos en absoluto. Las entradas no numéricas para este campo decimal podría
incluir letras, espacios en blanco, signos de puntuación, caracteres de control y nulos. Para
un campo entero, podemos añadir números decimales en las entradas rechazadas, aunque
ellos sean números.
Figura 4.13: Carácter y Cadena de Texto
Esta argumentación acerca de las entradas más generales nos lleva al análisis de caracteres
y cadenas de texto. Suponga que está probando una característica de seguridad que requiere
contraseñas alfanuméricas de entre 6 y 10 caracteres de largo.
Podemos imaginar dos dimensiones del particionamiento, una basada en la longitud, una en
los caracteres de la contraseña. Tenga en cuenta que esta figura mental crea una región
válida en la gráfica, junto con cuatro regiones en las cuales la contraseña es inválida por
exactamente una razón: longitud ilegal o caracteres ilegales.
También tenemos cuatro regiones en las cuales la contraseña es inválida por exactamente
dos razones: longitud no permitida y caracteres no permitidos. ¿Necesitamos probar estas?
Bueno, tal vez.
Recuerde que las pruebas implican la selección de un subconjunto finito de pruebas que
deben ser ejecutadas a partir de un conjunto infinito de pruebas que usted podría ejecutar.
Debido a las restricciones de tiempo y dinero, la selección de una prueba significa por lo
general la deselección de alguna otra prueba. Por lo tanto, antes de que salgamos corriendo
hacia la gran nube infinita de pruebas que posiblemente podríamos ejecutar, haga memoria
en su análisis de los riesgos y pregúntese usted mismo si el nivel de riesgo asociado con
este caso de prueba justifica pruebas extensas.
DD/MM/YY
Examinemos las particiones de equivalencia y los valores límite para un campo fecha.
Suponga que usted está probando una aplicación web que le permite reservar pasajes de
avión en línea.
Un campo que necesitaría probar es el que permite a alguien especificar la fecha de salida.
Segundo, ¿Es la fecha válida en esta situación determinada? En otras palabras, ¿Es esta
fecha válida tomando en cuenta lo que le estamos pidiendo al programa que haga con esta?
Una fecha en el pasado, por ejemplo, no es una fecha válida, si estamos tratando de
especificar una fecha de salida para un vuelo que queremos reservar. Por el contrario, una
fecha en el futuro no es una fecha válida, si estamos tratando de especificar nuestra fecha
de nacimiento.
HH:MM:SS
Figura 4.15: Hora
Continuando con nuestro sistema web de reserva de vuelos, suponga que examinamos un
campo para el horario que nos pide la hora de salida preferida.
Una vez más, tenemos dos dimensiones interesantes de validez. La primera es el horario
como un valor de tiempo. Los horarios, como las fechas, son campos que normalmente
consisten en subcampos. El número de subcampos puede variar, por ejemplo, en este caso,
usted probablemente no especificaría la hora de salida preferida incluyendo el subcampo de
los segundos. De hecho, podría solamente especificar dos subcampos: la hora y AM o PM.
El formato del campo para el horario—AM/PM o de 24 horas—influye la validez del
subcampo hora.
Al igual que con las fechas, un horario puede ser válido o inválido para una situación dada.
Por ejemplo, no podemos salir en un horario que ya ha pasado. No se puede especificar un
horario de salida deseado que está después de nuestro horario de llegada deseado, en la
mayoría de los casos. Sin embargo, con los viajes en avión, si estamos volando a través de
la línea internacional del cambio de fecha, podría haber ocasiones donde las fechas y los
horarios de llegada preceden a las fechas y los horarios de salida.
Primero, mientras que el redondeo de los valores decimales puede ocurrir con números
decimales, el redondeo de cantidades significativas de dinero es usualmente considerado un
defecto. Es decir, si usted tiene cuenta de inversión con millones de dólares, generalmente
esperaría que el balance de esa cuenta sea válido hasta la más pequeña unidad monetaria
significativa. En los Estados Unidos y en una serie de otros países, eso sería centésimas de
la moneda, p.ej., los centavos.
Para otros países, la unidad significativa más pequeña sería los veinteavos de la moneda;
p.ej. en Nueva Zelanda e Israel, el dólar neozelandés y el shekel israelí son redondeados al
lugar más cercano de un veinteavo en las transacciones en efectivo. Aún para otros países la
unidad monetaria significativa más pequeña es la moneda misma, como el won coreano.
Segundo, cuando se trata de un programa que debe manejar monedas para muchos países,
se presenta la pregunta del valor de la moneda. En el ejemplo que se muestra en esta figura,
el precio máximo de oferta de una acción es 999,99. Eso es una cantidad significativa de
dinero, si estuviéramos hablando de 999,99 libras, o de 999,99 euros, o incluso de 999,99
dólares. Sin embargo, si estuviéramos hablando 999,99 wons, eso es una cantidad muy
pequeña de dinero. Los límites superiores e inferiores codificados en duro, no tendrían
sentido en tales situaciones.
Hasta ahora, hemos estado examinando las técnicas de diseño de pruebas que se aplican a
entradas, salidas, valores de configuración individuales, y etc. Con las pruebas de caso de
uso y pruebas de escenario empezamos a ver las pruebas de los flujos de trabajo completos,
una pantalla completa o una serie de pantallas que logran una tarea determinada.
Los casos de uso son una técnica de diseño de sistemas utilizada a menudo con el diseño
orientado a objetos. Para otros tipos de sistemas, la analogía es el escenario.
”… una casa con un valor de US$ 400 mil de la cuál ellos deben US$ 350 mil…”.
”… dos coches con un valor de US$ 25 mil de lo cual ellos deben US$ 17 mil…”.
”… una mora en el pago de su tarjeta Visa y una mora en el pago de los coches, diecisiete
meses y treinta y cinco meses, respectivamente ..”.
Tendríamos también que determinar, basados en las reglas de negocio, dónde John y Jenny
Stevens deberían ser aprobados para este préstamo.
Porque algunas metodologías de diseño orientado a objetos incluyen casos de uso, entonces
esta puede ser una fuente fácil de pruebas. Todo lo que tenemos que hacer es generar los
valores específicos y los resultados esperados.
Hablemos uno poco más acerca de los casos de uso, lo que son, cómo se ven y como
utilizarlos.
Los casos de uso pueden ser abstractos, en ciertos aspectos independientes del sistema
mismo, así como un caso de uso de negocio o proceso de negocio, donde la tecnología es
casi invisible. Sin embargo, los casos de uso también pueden ser muy concretos y
específicos, describiendo un caso de uso del sistema en el nivel de la funcionalidad del
sistema específico.
Cada caso de uso tiene precondiciones, las cuales deben ser verdaderas antes del primer
paso del caso de uso, y cuál debe ser verdadero para que el caso de uso continúe
satisfactoriamente. Cada caso de uso tiene poscondiciones también, las cuales son los
resultados observables y el estado final del sistema después de que los pasos del caso de
uso hayan terminado.
Un caso de uso tiene usualmente un camino del flujo principal, el flujo de trabajo o el
escenario. Estos son el conjunto de pasos más probables que ocurren, algunas veces
denominados el camino feliz. Adicionalmente, el caso de uso debería tener caminos
alternativos definidos para los problemas o las variaciones típicas previsibles.
En esta página, vemos un ejemplo de un caso de uso informal, que describe las compras de
un sitio de comercio electrónico, de la tienda del sitio web de RBCS. En la parte superior,
tenemos el flujo de trabajo normal de la compra del sitio web. Éste es un camino feliz. Note
que la precondición es de que el cliente—quién es uno de los actores en este caso de uso—
está en la tienda en el sitio web de RBCS—el cuál es el otro actor en este caso de uso—
navegando a través de los cursos, libros y otros ítems en venta allí. Primero, el Cliente
coloca uno o más ítems en su carro de compras. Luego el Cliente selecciona “pagar”.
Ahora, el sistema recopila la dirección, el pago y la información del envío del Cliente. Con
la información recopilada, el Sistema muestra toda la información para la confirmación por
parte del Cliente. Finalmente, el Cliente confirma el pedido al sistema para que sea
entregado.
Note que el resultado final, la poscondición, es que el pedido está en el sistema para ser
entregado. Presumiblemente otro caso de uso para completar el pedido describirá cómo este
pedido llega en última instancia al hogar o lugar de trabajo del cliente.
Por un lado, el Cliente podría tratar de pasar a pagar con un carro de compras vacío. En ese
caso, el Sistema da un mensaje de error.
Finalmente, el Cliente podría abandonar la transacción antes o durante el paso del pago.
Para controlar esto, el Sistema retira el Cliente del sistema después de 10 minutos de
inactividad.
Note que para derivar las pruebas para este caso de uso, usted selecciona simplemente los
datos específicos y crea los casos de prueba que corresponden al camino feliz y a los flujos
de trabajo excepcionales. Típicamente, usted ejecutaría una prueba por lo menos por cada
flujo de trabajo. Los flujos de trabajo riesgosos merecerían, por supuesto, más de una
prueba. Un número importante de particiones de equivalencia—p.ej. diferentes tarjetas de
crédito permitidas en este ejemplo—conducirían a múltiples pruebas.
Debería mencionar también que la precondición, la poscondición y los actores están
implícitos en este caso de uso en vez de que sean especificados explícitamente. Es típico
para los casos de uso informales de dejar algunos de los elementos de un caso de uso
formal. Otros elementos de un caso de uso formal no vistos aquí son: un número de
Identificación (p.ej. para la trazabilidad), un nombre, una descripción, una prioridad y una
frecuencia estimada o medida de uso. En un caso de uso formal, todos estos elementos
serían especificados explícitamente en una cabecera de un caso de uso literal o en un
bloque de texto en un caso de uso gráfico.
Está bien combinar técnicas de diseño de pruebas—de hecho, usted debería realmente—
pero en algunos casos, cosas extrañas pueden ocurrir. Por ejemplo, necesita diseñar pruebas
basadas en los casos de uso o escenarios con las particiones de equivalencia. Sin embargo,
¿Debería utilizar los valores límite?
El utilizar los valores límite podría llevarnos a crear pruebas que no son necesariamente el
uso razonable del sistema. Por ejemplo, si la aplicación utiliza un elemento sin signo de
cuatro bytes como una variable contador, ¿debería probar ordenando millones de ítems sólo
porque el software lo soporta? O ¿debería el software imponer un límite superior razonable
en la cantidad del pedido? Si es así, ¿cuál es ese límite? ¿Está especificado?
Como mencionamos antes, las suposiciones aparentemente razonables acerca de los límites
lógicos no podrían aplicarse en todas las situaciones. En ciertos casos, basados en el horario
local, un sistema de reserva de vuelos podría permitir para los viajes, fechas de salida
posteriores a las fechas de llegada.
Los casos de uso y escenarios pueden a menudo revelar el hecho de que, con frecuencia, las
especificaciones de los límites podrían no estar completas. En algunos casos, aunque el
sistema pueda manejarlo, aceptar una entrada “ridícula” constituye un defecto.
Con las tablas de decisión, continuamos con las pruebas de completos flujos de trabajo, una
pantalla entera o una serie de pantallas que logran una tarea determinada. Las tablas de
decisión son una forma agradable, compacta y fácil de leer para expresar las reglas de
negocio que determinan como una aplicación debería manejar estos flujos de trabajo.
Por ejemplo, una tabla de decisión nos puede decir cómo el sistema debería procesar un
pedido basado en el tamaño, el stock disponible, el estado en el cuál se puede enviar, y así
sucesivamente. Una tabla de decisión es una representación tabulada de las reglas, la lógica
de negocios. Estas mismas reglas pueden ser mostradas como diagramas de flujo, pero eso
no es algo que vamos a cubrir en este libro.
Si usted es un probador, la obtención de las tablas de decisión es bonito, porque las puede
utilizar para crear casos de prueba muy fácilmente. Si recibe un diagrama de flujo o una
descripción de texto de las reglas de negocio, la creación de una tabla de decisión de esas
reglas puede también hacer fácil las pruebas.
Veamos un ejemplo.
Tabla 4.9: Tabla de Decisiones de un Cajero Automático
Esta tabla muestra una tabla de decisión de un cajero automático (ATM), que sólo se ocupa
de solicitudes de retiro. Muestra el aspecto típico de una tabla de decisión. En el lado
izquierdo hay una columna con las condiciones enumeradas en la parte superior y las
acciones en la parte inferior. En cada columna de la derecha, hay una regla la cual establece
cuáles acciones son y no son tomadas basadas en cada una de las condiciones que se han
cumplido o no.
La primera regla dice que, si alguien inserta una tarjeta inválida en el cajero automático, el
cajero automático debería rechazar esa tarjeta. No debería solicitar al usuario que
introduzca o vuelva a introducir el PIN, porque ningún PIN aplica para tal tarjeta. No
debería retener la tarjeta. No debería solicitar al usuario que ingrese o vuelva a ingresar el
monto del retiro solicitado porque ninguna cuenta está asociada a la tarjeta. ¡Ciertamente,
no debería dar efectivo!
La segunda regla dice que, si alguien inserta una tarjeta válida en el cajero automático, pero
introduce un PIN inválido, el cajero automático debería solicitar al usuario que vuelva a
introducir el PIN, con la condición de que no hayan ingresado ya un PIN inválido tres
veces. La tercera regla aclara esta situación diciendo que, si el usuario introduce un PIN
inválido tres veces seguidas, debería retener la tarjeta.
La cuarta regla dice que, si alguien inserta una tarjeta válida en el cajero automático e
ingresa un PIN válido, pero una solicitud inválida de retiro, el cajero automático debería
solicitar al usuario que vuelva a introducir la solicitud de retiro.
La quinta regla—el llamado “camino feliz”—dice que, dada una tarjeta, el PIN, y la
solicitud válida de retiro, el cajero automático debería dar efectivo.
Esta tabla de decisión muestra la lógica de negocios para un cajero automático. Observe
que los guiones “-” indican condiciones que no son alcanzadas o no son aplicables para esta
regla. Las reglas son mutuamente exclusivas, porque sólo una regla puede aplicarse en un
momento determinado en el instante.
Observe que la capa de la lógica de negocios está generalmente bajo la capa de la interfaz
de usuario, de modo que en este punto el control de la sanidad básica de las entradas
debería haber sido realizado. En otras palabras, los valores límite y las particiones de
equivalencia inválidas de los campos de entrada deberían ser utilizados principalmente para
probar la validación de las entradas. Una vez que consigamos probar la lógica de negocios,
no deberíamos tener necesidad de repetir aquella validación de las entradas.
Cuando realiza pruebas con una tabla de decisión, la regla usual de la cobertura es tener por
lo menos una prueba por cada regla de negocios o columna en la tabla de decisión.
Decimos “por lo menos una prueba” porque, en algunas situaciones, más que una manera
interesante puede existir para satisfacer o no una condición y que sea valiosa de probar. Por
ejemplo, con nuestras pruebas del Cajero Automático, podríamos querer probar las tarjetas
del cajero automático vencidas, las tarjetas del Cajero Automático que utilizan una red de
efectivo no compatible, las tarjetas del Cajero Automático robadas, las licencias de
conducir u otras tarjetas con una banda magnética y las tarjetas sin banda magnética. Tenga
en cuenta que ésta es una aplicación de la técnica de particionamiento de equivalencia para
una sola columna de la tabla de decisión.
Hace años, cuando Rex Black solía conducir un poco más rápido de lo que debía, se
encontró con un policía que utilizó una computadora de mano para gestionar su notificación
por el exceso de velocidad. Esta computadora también le permitía al policía aceptar su
tarjeta de crédito para el pago de la multa—una característica práctica, porque le impidió
perder el vuelo de la aerolínea que estaba tratando de tomar con prontitud.
Como esto fue hace unos cuantos años atrás, ahora incluso más departamentos de policía
cuentan con computadoras de mano que emiten notificaciones e incluso aceptan tarjetas de
crédito para pagar las multas por las violaciones de conducción y otras infracciones.
Una tabla de decisión podría ser utilizada para diseñar y probar tal sistema. Las condiciones
que determinan las acciones que deben ser tomadas son mostradas en la tabla de decisión
en la siguiente tabla. En esta situación, puede que quiera utilizar el análisis de valores límite
para cubrir adecuadamente las reglas. Además, tendremos que considerar cómo administrar
la interacción de las reglas.
Tabla 4.10: La Tabla de Decisiones de un Sistema de la Policía
Aquí tenemos una tabla de decisión—o más probablemente una parte de una tabla de
decisión—que podría describir algunas de las acciones de tal computadora de la policía.
La primera regla dice que si el conductor tiene una licencia de conducir inválida, el
conductor será arrestado. El conductor incurrirá también en una multa de US$ 250. Las
líneas punteadas aquí nos dicen que otras condiciones y acciones podrían aplicarse también.
La segunda regla dice que si el conductor tiene una orden judicial existente para su arresto,
el conductor será arrestado. El conductor incurrirá también en una multa de US$ 250. Una
vez más, otras condiciones y acciones se podrían aplicar.
La tercera regla dice que si el conductor no ha pagado sus cuotas del registro, el conductor
debe recibir una boleta de infracción corregible que obliga al conductor a pagar la cuota en
algún plazo determinado. El conductor incurrirá también en una multa de US$ 25. Si el
conductor no paga sus cuotas, típicamente, esa notificación expirará y se convertirá en una
orden judicial de arresto.
La cuarta regla dice similarmente que si el conductor tiene un vehículo con desperfectos, el
conductor debería recibir una boleta corregible que requiere que el conductor resuelva el
problema dentro de algún plazo determinado. El conductor incurrirá también en una multa
de US$ 25. Si el conductor no resuelve el problema, típicamente esa notificación expirará y
se convertirá en una orden judicial de arresto.
Cada una del primer conjunto de las cuatro reglas se puede aplicar simultáneamente. Es
decir, estas reglas no son mutuamente exclusivas. Los totales de multa serían adicionados
en estas situaciones.
La quinta regla dice que si el conductor estaba viajando entre 1 y 10 millas por hora (o
km/hora si lo prefiere) sobre el límite de velocidad, el conductor recibirá solo una
advertencia.
La sexta regla dice que si el conductor estaba viajando entre 11 y 20 millas por hora (o
km/hora si lo prefiere) sobre el límite de velocidad, el conductor incurrirá en una multa de
US$ 75.
La séptima regla dice que si el conductor estaba viajando entre 21 y 25 millas por hora (o
km/hora si lo prefiere) sobre el límite de velocidad, el conductor incurrirá en una multa de
US$ 150.
La octava regla dice que si el conductor estaba viajando a más de 25 millas por hora (o
km/hora si lo prefiere) sobre el límite de velocidad, el conductor incurrirá en una multa de
US$ 250. El conductor será arrestado entonces.
Todas estas reglas del segundo conjunto, que consisten en 4 reglas, son mutuamente
exclusivas.
Tome en cuenta cuánto más tiempo es necesario para en la descripción de estas reglas
verbalmente o textualmente. Usted puede observar cuán compacta y aún sin ambigüedades
puede ser la representación de la tabla de decisión de las reglas de negocio.
Tenga en cuenta que la multa máxima puede ser US$ 800, basada en la interacción de las
cuatro primeras reglas y la octava regla. ¡Por supuesto, el conductor será arrestado solo una
vez!
Cuando se prueba una tabla de decisión como esta, primero tenemos que probar cada regla
por sí misma. Para las reglas definidas en intervalos, como las reglas de la cinco a la ocho,
probablemente necesitaremos dos pruebas para asegurar que los rangos son definidos
correctamente en los límites.
Una vez que hayamos probado las reglas por sí mismas, deberíamos entonces probar las
combinaciones de las reglas. Hay técnicas para decidir cómo realizarlo así, tales como los
árboles de clasificación, las tablas de todos los pares y el análisis de dominio. Estas técnicas
son descritas en el libro Advanced Software Testing for the Test Analyst.
Las tablas de decisión son buenas cuando usted está probando un sistema que controla
transacciones individuales o lotes de entradas, y cada transacción o lote es manejado de
forma independiente. Sin embargo, para algunos sistemas las series de eventos y
condiciones que han ocurrido parcialmente en el pasado, determinan cómo el sistema
responderá al evento actual y a las condiciones que predominan. Para las pruebas de estos
sistemas deberíamos utilizar los diagramas de transición de estados. Para crear un diagrama
de transición de estados, usted primero identifica los varios estados en los que el sistema
puede estar. Querrá asegurarse de que entiende los estados inicial y final. Como regla
general, los casos de prueba deberían comenzar con el sistema en el estado inicial y deben
terminar con el sistema en el estado final.
En cada estado, algún evento puede ocurrir que forzará una transición de estado. (Esto es
cierto para todos los estados excepto el estado final.). Mientras la transición de estado
ocurre, el sistema podría tomar alguna acción. En algunos casos, dos o más condiciones son
aplicadas al evento, el cual influye cuál transición ocurre—y por lo tanto cuál acción es
tomada. Después que la transición de estado ha ocurrido, el sistema está ya sea en un nuevo
estado o se ha mantenido en su estado actual.
Veamos un ejemplo.
Esta figura muestra un diagrama de transición de estados para un sistema de punto de venta,
igual al que encontraría en un supermercado o pulpería.
Hay por lo menos dos defectos en este diagrama. Primero, el cajero sólo puede terminar su
turno mientras acepta el pago del cliente. Esto es doblemente absurdo. Un cajero no debería
dejar el trabajo en medio de la atención a un cliente. El cajero no debería tener que estar en
medio de la atención a un cliente para dejar el trabajo.
Segundo, no hay ningún mecanismo para el abandono de una transacción si el cliente no
puede hacer un pago válido.
Una de las cosas buenas acerca del diagrama de transición de estados es que hace que sea
fácil de detectar problemas como éste. Esos problemas pueden esconderse en una
descripción larga de texto de los requisitos.
Como con las tablas de decisión, la representación compacta y precisa ayuda a revelar los
defectos y así acentúa el potencial de la prevención de los defectos por medio de las
pruebas—si el diseño de pruebas es realizado antes que el sistema sea construido, ¡eso es!
Y si usted persigue una estrategia de pruebas netamente reactiva, entonces perderá este
beneficio.
Note que se muestra el sistema desde el punto de vista del cajero. Le recomendamos que
vuelva a dibujar el diagrama desde el punto de vista del cliente. Luego, vuelva a dibujarlo
de nuevo desde el punto de vista del propio sistema de punto de venta.
Las acciones son también acontecimientos, pero ellas son usualmente salidas de algún tipo
de sistema o aplicación. Típicamente, una acción se inicia y termina rápidamente o en algún
período de tiempo fijo, relativamente constante. En algunos casos, encontrará un tanto
arbitrario en cuanto a si elegir el modelado de un determinado comportamiento como una
acción asociada a una transición de estado o como un estado intermedio con una transición
de estado y acción asociados.
Como con las otras técnicas formales del diseño de pruebas, hay criterios de cobertura para
los diagramas de transición de estados. Los criterios mínimos son: visitar cada estado y
atravesar cada transición. Note que si atraviesa cada transición, habrá ejercido cada par de
evento/condición en el diagrama así como también habrá observado cada acción en el
diagrama, porque las transiciones de estado son activadas por los pares evento/condición y
son tomadas acciones por el sistema durante las transiciones de estado.
Criterios más fuertes existen para la cobertura de los diagramas de transición de estados.
Por ejemplo, el criterio de la cobertura de transiciones (“switch-coverage”) de Chow
requiere la cobertura de las secuencias de las transiciones de longitud creciente. Estos
criterios son tratados en el libro Advanced Software Testing for the Test Analyst.
Tabla 4.11: Tabla de Transiciones de Estado
Los diagramas de transición de estados son bonitos, pero sólo muestran cómo el sistema
maneja los pares evento/condición para ciertos estados. ¿Qué pasa si un evento ocurre
cuando el sistema no lo está esperando? ¿Qué debería ocurrir?
Una tabla de estado-transición puede revelar situaciones indefinidas, como lo hace esta
parte de la tabla para el gráfico anterior. Puede construir estas tablas del diagrama de
transición de estados utilizando el siguiente proceso:
3. Crear una tabla con cada combinación posible del estado con el par evento/condición.
En este punto, puede haber encontrado algunos problemas de diseño del sistema. Para las
filas con las acciones y los nuevos estados indefinidos, quizás desee comprobar con la
gente para ver si aquellas son realmente situaciones las cuales no pueden suceder. Si no,
entonces ya sea el programador se acordará de codificarlos durante la implementación—la
cual es una suposición riesgosa— o el sistema tendrá un defecto de omisión que puede
resultar en un comportamiento impredecible durante su utilización.
Una vez más, como todos los demás modelos formales para el diseño de pruebas, tenemos
un criterio de cobertura para las tablas de transición de estados. Cada fila debería tener una
prueba asociada—si por ninguna otra razón se confirma que las cosas que “no puede
ocurrir” realmente no suceden.
El servidor de impresión responde a los eventos, los cuales son entradas, ya sea de los
usuarios o la impresora, basado en el estado en el que éste esté.
Cree un conjunto de casos de prueba para este diagrama. Suponga que todas las pruebas
deben comenzar en el estado inicial—mostrado con un círculo con borde doble—y deben
terminar cuando las transiciones del sistema vuelvan al estado inicial. Trate de crear el
número mínimo de casos de prueba y aún así lograr la cobertura completa de los estados y
las transiciones de estados. ¿Terminó? Bien. Debería haber creado dos casos de prueba.
Teniendo en cuenta la regla acerca de los casos de prueba que tienen que empezar y
terminar en el estado inicial, ¿Cuál es el número máximo de casos de prueba?
Es infinito. Si usted nos muestra cualquier conjunto de pruebas que piensa que es
exhaustivo, podemos añadir otro ciclo del trabajo desde el trabajo de impresión a la espera
de los usuarios y de vuelta al trabajo de impresión que es una nueva prueba. Esta propiedad,
de siempre ser capaz de añadir una única variante más a una lista, es la definición misma
del infinito contable.
Para cualquier sistema que puede describirse mediante un diagrama de transición de estados
con esos bucles en el diagrama, puede crear un número infinito de pruebas.
¿Terminó? Bien. Su tabla de transición de estados debería tener 35 filas en la tabla. ¿Tiene
40? Si es así, probablemente contó dos veces el evento “error recuperable reportado”.
LO-4.4.2 Explicar los conceptos de cobertura de sentencia y decisión, y dar las razones por
qué estos conceptos pueden también ser utilizados en otros niveles de prueba distintos a las
pruebas de componente (p.ej. en procedimientos comerciales en el nivel de sistema). (K2)
LO-4.4.3 Escribir casos de prueba de los flujos de control dados utilizando las técnicas de
diseño de pruebas de sentencia y decisión. (K3)
En esta sección, Técnicas Basadas en la Estructura, cubrirá los siguientes conceptos clave:
Empecemos con los conceptos básicos de las pruebas basadas en la estructura o de caja
blanca.
Recuerde que las pruebas basadas en la especificación, también conocidas como las
pruebas de caja negra o como las pruebas de comportamiento, son las que son diseñadas
desde la especificación del sistema. En las pruebas de comportamiento, nosotros ignoramos
el funcionamiento interno del sistema y nos enfocamos acerca de cómo este se supone que
se debe comportar.
Ahora, las pruebas basadas en la estructura, las cuáles son llamadas también pruebas
estructurales o de caja blanca, se basan en la estructura interna del sistema o en un
componente del sistema; p.ej., nosotros examinamos cómo el sistema funciona y qué hace.
Específicamente, seleccionamos las entradas, las precondiciones, las condiciones, los
eventos u otros estímulos basados en una parte de la estructura del sistema que estos
ejercerán.
Por supuesto, cuando realicemos las pruebas estructurales—porque éstas son pruebas
dinámicas—el sistema o componente presentará algún comportamiento. Tenemos que
comparar ese comportamiento con algún resultado esperado, de lo contrario no estamos
probando. No podemos derivar los resultados esperados para las pruebas estructurales por
completo de la estructura, porque de lo contrario terminamos probando el compilador, el
sistema operativo y otros elementos del entorno, más que el sistema propio. De este modo
nosotros derivamos típicamente los resultados esperados para las pruebas estructurales en
parte de la estructura, pero también de las especificaciones, las expectativas razonables, y
así sucesivamente.
Como con las pruebas de comportamiento, cuando nosotros estamos observando los
comportamientos mostrados por una prueba de estructura, nosotros podemos estar
observando comportamientos funcionales— ¿Qué hace el sistema o componente? —O
comportamientos no funcionales— ¿Cómo lo hace? —basado en la clasificación del ISO
9126.
La más simple es analizar los flujos de control en el código y utilizar ese análisis para
medir la cobertura de las pruebas existentes y para adicionar las pruebas adicionales para
alcanzar un nivel deseado de cobertura. (Hablaremos más acerca de la cobertura de código
más adelante). Estos tipos de pruebas estructurales son cubiertos en el programa de estudios
básico.
La final, la manera más complicada de diseñar las pruebas estructurales es el de analizar las
interfaces, las clases, los flujos de llamada y otros por el estilo observando las interfaces de
programación de la aplicaciones (APIs); el hardware, el software y los documentos de
diseño y los diagramas de un sistema de redes; las tablas de base de datos, las restricciones
de integridad y los procedimientos memorizados (“stored procedures”). Como antes, usted
puede analizar ese análisis para medir la cobertura de las pruebas existentes y para
adicionar pruebas adicionales para alcanzar un nivel deseado de cobertura del diseño. Este
tipo de diseño de pruebas estructurales es comúnmente utilizado durante las pruebas de
integración y de sistema. Sin embargo, estos tipos de pruebas estructurales no son cubiertos
en el programa de estudios básico.
Permítanos resaltar de nuevo un uso importante del diseño de pruebas estructural: Es una
mejor práctica para medir el grado de cobertura estructural de las pruebas basadas en la
especificación y la experiencia, de tal manera que usted pueda buscar partes importantes de
la estructura del sistema, las cuales no están siendo probadas.
Si no tiene una base en programación, podría considerar esta sección un poco difícil.
Porque comprendiendo cómo los sistemas tienden a fallar y por qué, es una habilidad clave
cuando se está haciendo el análisis de los riesgos de calidad, nosotros lo animaríamos a que
se auto enseñe un lenguaje de programación si intenta que su profesión sea la de pruebas de
software.
Hay un número de variantes aquí, pero las más comunes son las siguientes:
La ramificación ocurre cuando el programa hace una decisión acerca de que si una
situación particular de dos o más situaciones posibles existen, y luego procede a fluir el
control del programa en una manera apropiada para manejar la situación. Ya que una
manera de manejar la situación es a través de la secuencia de sentencias, el 100% de
cobertura de rama significa que alcanzaremos el 100% de cobertura de sentencia.
Ahora, cuando no sólo contamos con condiciones simples en un programa, pero con
condiciones compuestas como “(edad >= 0) && (edad < 18)”, entonces podemos hablar
acerca de la cobertura de multicondición. La cobertura de multicondición (más conocida
como la cobertura completa de condición múltiple) es el porcentaje de las condiciones de
todos los resultados de cada condición única dentro de una sentencia que ha sido evaluada
por mínimamente una de las pruebas.
Porque probando todas las combinaciones de las condiciones, también significa la prueba
de todas las condiciones posibles, el 100% de la cobertura de condición múltiple implica el
100% de cobertura de condición.
Finalmente, hay una cobertura de bucle. Ésta no es una métrica formalizada de la cobertura
estructural en el ISTQB nivel básico. Sin embargo, informalmente, podemos decir que
hemos alcanzado el 100% de la cobertura del bucle cuando tengamos un conjunto de
pruebas que obligan al programa a tomar todos los caminos del bucle cero, uno y muchas
veces.
Nosotros mencionamos arriba que el 100% de la cobertura de rama significa que hemos
alcanzado el 100% de la cobertura de sentencia. ¿Piensa usted de que el 100% de la
cobertura de sentencia significa de que alcanzaremos el 100% de cobertura de rama? La
respuesta es “no”. Si usted ha escrito programas de computación antes, sabrá de que no
cada sentencia if tiene una sentencia correspondiente else y que ningún constructo
switch/case tiene un bloque por defecto de sentencias. En tales casos, el else implícito o la
acción por defecto es “hacer nada”, la cual representa una decisión tomada. Por su puesto,
si haciendo nada es la cosa correcta para hacer, es algo que también tenemos que probar.
En este programa, la entrada es el número del cual se calcula el factorial. Está guardado en
la variable n.
¿Listo? Bueno. Usted debería ver que si usted escoge un valor de n menor que 0 y otro
valor de n mayor que 0, ejecutará cada sentencia al menos una vez.
No, necesitamos también n==0 para comprobar que el bucle no sea ejecutado.
Si probamos con n menos que 0, n igual a 0 y n mayor que cero, ¿Alcanzaría eso cobertura
de condición? Sí, porque no tenemos condiciones compuestas.
Finalmente, ¿Qué hay de la cobertura de bucle? Para la cobertura de bucle del 100%,
necesitamos de cubrir n==1 y n==el número máximo de veces en todo el bucle.
De este modo, ¿Cómo podemos utilizar la cobertura de código para diseñar las pruebas?
¿Qué bueno es este material de las pruebas estructurales para nosotros como probadores?
En debates acerca de otras pruebas y con nuestra propia experiencia personal, nos hemos
dado cuenta de que, por sí mismas, las técnicas de caja negra pueden dejar de cubrir hasta
un 75% o más de las sentencias.
Ya sea si esta gran cantidad de código no probado representa un problema o no, depende de
lo que no es cubierto, así como si los programadores probaron o no este código en las
pruebas de unidad.
Al principio de este libro hablamos del análisis estático del código. Mencionamos que
algunas herramientas de análisis estático pueden localizar segmentos del código altamente
complejos. Veamos esa medida de complejidad, la cual tiene algunas implicaciones
interesantes del diseño de pruebas.
Hemos leído un estudio de algunas personas en IBM, que examinaron una de sus
aplicaciones. Para esta aplicación, ellos no encontraron correlación entre las varias métricas
de complejidad para los varios módulos y las densidades de defectos para esos mismos
módulos. Ahora, eso puede significar que la complejidad no influencia la defectuosidad.
Sin embargo, eso podría también significar que las métricas de complejidad que ellos
examinaron no se adecuan a la captura de todos los elementos de complejidad. ¿Tal vez lo
que hace a un programa verdaderamente complejo—y así propenso a los defectos—es algo
que la mayoría de las métricas de complejidad no miden?
La otra implicación útil de esta métrica para las pruebas es cuando se evalúa un conjunto de
pruebas de unidad para una función. Usted puede extender la técnica de las gráficas del
flujo de control de McCabe para generar lo que él llama los caminos a través del grafo. El
número de caminos básicos es igual al número de pruebas básicas requeridas para cubrir el
grafo. Retornaremos a este concepto en breve, porque éste le ayudará a visualizar los
caminos básicos y las pruebas básicas como lo hablamos.
Esta figura muestra el programa que calcula el factorial en el lado izquierdo. Las líneas
punteadas del código al diagrama del flujo de McCabe en el centro de esta figura muestra
cómo las secuencias sin ramas de cero o más sentencias llegan a ser las aristas (o las
flechas), y cómo los constructos con las ramas y los bucles llegan a ser los nodos (o las
burbujas).
En la parte derecha de la figura, usted puede observar dos métodos que calculan la métrica
de la complejidad ciclomática de McCabe. El más simple es tal vez el cálculo de la “región
cerrada”. Las dos regiones cerradas, representadas por R en la ecuación superior, se
encuentran en el diagrama de abajo y mayormente en la izquierda del nodo “n<0” y abajo
en la derecha del nodo “l<=n”.
El otro método de cálculo involucra el conteo de las aristas (o flechas) y los nodos (o
burbujas).
Ahora, esto es simplemente suficiente para un programa pequeño y simple como éste. Para
funciones más grandes, dibujando el gráfico y haciendo el cálculo de éste es un verdadero
lío. De este modo, una simple regla de dedo es: Cuente los constructos de rama y bucle y
adicione 1. Las sentencias “if” y los constructos “for”, “while” y “do/while cuentan como
uno. Para los constructos switch/case, cada bloque case cuenta como uno. En los
constructos “if” y “ladder if”, el “else” no se cuenta. Para los constructos switch/case, el
bloque “por defecto” no se cuenta. Ésta es una regla heurística, pero parece que siempre
funciona.
Figura 4.21: Caminos y Pruebas Básicas
Las pruebas básicas son las entradas y los resultados esperados asociados con cada camino
básico. Usualmente, las pruebas básicas coincidirán con las pruebas necesarias para
alcanzar la cobertura de rama. Esto tiene sentido, porque la complejidad se incrementa en
cualquier momento en que más de una arista sale de un nodo en un diagrama de flujo de
McCabe. En un diagrama de flujo de McCabe, una situación donde “más de una arista de
un nodo” representa un constructo de ramas o de bucles.
¿Para qué sirve esta exquisita información? Bien, suponga que estuviese hablando con un
programador acerca de sus pruebas de unidad. Usted pregunta cuántas entradas utilizaron
ellos. Si ellos le dicen un número menor que la métrica de complejidad ciclomática de
McCabe, para el código que ellos están probando, es una apuesta segura de que ellos no
alcanzaron la cobertura de rama. Eso implica, como fue mencionado más antes, de que
ellos no cubren las particiones de equivalencia.
4.4.1 Ejercicios
Ejercicio 1
Abajo encontrará un programa simple escrito en C que acepta una cadena con caracteres
hexadecimales (entre otros caracteres no deseados). Éste ignora los otros caracteres y
convierte los caracteres hexadecimales en una representación numérica.28
Si prueba con las cadenas de entrada: “059”, “ace” y “ACD” ¿Qué niveles de cobertura
usted alcanzaría?
¿Qué cadenas de entrada podría usted añadir para alcanzar las coberturas de sentencia y
rama?
Argumente.
Las cadenas “059”, “ace” y “ACD” no alcanzan ningún nivel especifico de cobertura del
cual hablamos en el libro. Necesitaríamos añadir “xyz” o alguna otra cadena que contenga
dígitos no hexadecimales para alcanzar la cobertura de sentencia. Necesitaría probar la
cadena nula para obtener la cobertura de rama (en cuanto a no ejecutar el bucle). Para tratar
de ejecutar el bucle rigurosamente, también querríamos probar una cadena muy larga.
Mientras que no es necesario alcanzar ninguno de los niveles de cobertura estructural que
abordamos, usted podría considerar cadenas cortas mezcladas. Por ejemplo, “6dpF” prueba
cada uno de los cuatro bloques “case” en una sola prueba, y comprobar problemas que
podrían ocurrir en esas situaciones.
LO-4.5.1 Recordar las causas para escribir casos de pruebas basados en la intuición,
experiencia y conocimiento acerca de los defectos comunes. (K1)
LO-4.5.2 Comparar las técnicas basadas en la experiencia con las técnicas de pruebas
basadas en la experiencia. (K2)
En esta sección, Técnicas Basadas en la Experiencia, cubrirá los siguientes conceptos clave:
Es común encontrar que en vez de ser prediseñadas, las pruebas basadas en la experiencia
son a menudo creadas durante la ejecución de pruebas. En otras palabras, la estrategia es
dinámica o reactiva. Hablaremos acerca de las estrategias de pruebas en el siguiente
capítulo.
Al comienzo de este capítulo, hablamos acerca del análisis de los riesgos de calidad. De
este modo usted entiende ahora cómo y cuándo utilizamos los riesgos de calidad para
controlar nuestro esfuerzo de las pruebas y conseguimos la alineación del esfuerzo de las
pruebas con la calidad del sistema y con el nivel de riesgo para esa calidad.
Un método común para la mitigación de estos problemas es utilizar una lista de cartas de
pruebas (“test charters”), creada antes de la ejecución de las prueba. El tiempo que se debe
pasar en estas cartas de pruebas es frecuentemente “tiempo limitado”. Es decir, los períodos
cortos de las pruebas son concentrados en las condiciones específicas de las pruebas
asociadas con cada carta.
Con la mayoría de los métodos para las pruebas basadas en la experiencia —al menos los
métodos profesionales y serios— usted no crea todas las pruebas durante la ejecución de
pruebas. Usted tiene o desarrolla guías con anticipación.
Una lista de comprobación es tal vez lo más simple de las guías, en la cual se incluirán
descripciones cortas de las áreas de dos a cinco palabras, las características de calidad y los
rasgos para probar. Si obtiene una lista genérica de comprobación u otra para otro sistema,
necesitará adaptarla para su sistema para asegurar de que es efectiva en cuanto al
descubrimiento de defectos y la cobertura de aéreas clave.
Una taxonomía es una guía más complicada. Una taxonomía es una jerarquía de defectos
clasificada por tipo, subtipo, y así sucesivamente. Luego intentará de encontrar defectos
que son descubiertos en la taxonomía. Como se podría imaginar, las taxonomías de
defectos más efectivas son aquellas creadas por sistemas similares al que está probando
actualmente. Las taxonomías pueden ser efectivas para descubrir defectos, pero, como
cualquier método de pruebas, están enfocadas completamente en los riesgos técnicos—la
probabilidad de descubrir defectos, no influye en cuanto a la construcción de confianza; y
la reducción de los riesgos de calidad es incompleta.
Una lista de ataques es otra guía, todavía más complicada. En la lista de ataques, no tiene
solamente defectos metas que está buscando, sino también procedimientos de pruebas de
alto nivel para descubrir esos defectos. Los ejemplos más famosos de esta técnica son los
de James Whittaker’s How to Break Software and How to Break Software Security. Sin
embargo, en un ejemplo aún más antiguo—uno que precede al libro de Whittaker por más
de cinco años— es el de Brian Marick’s Craft of Software Testing. Nuevamente éste se
enfoca en los riesgos técnicos —descubriendo tantos defectos como sea posible—y no en
las demás contribuciones valiosas y potenciales que las pruebas pueden aportar al
proyecto.
Algo diferente es el concepto, desarrollado por Jon and James Bach, de utilizar un conjunto
de cartas de pruebas. Una carta de prueba es una descripción corta de la prueba que debe
ser realizada en cualquier lugar de dos a tres palabras hasta un par de frases.
Esto puede basarse en dónde esperamos descubrir los defectos, pero también puede basarse
en las características, los aspectos y las áreas clave del sistema. Entonces, como tal, es más
parecido a un método de listas de comprobación. Con el conjunto apropiado de cartas de
pruebas, esta técnica no solo puede descubrir los defectos, si no también ayuda a construir
la confianza en el sistema. Al igual que en las listas de comprobación, las cartas de pruebas
también permiten algún análisis de cobertura de pruebas en cuanto al mismo sistema en vez
de solamente una lista de defectos, que quisimos buscar.
Bien, como se podría imaginar que dado el enfoque acerca del descubrimiento de los
defectos en las técnicas, estas estrategias son a menudo muy efectivas en encontrar
defectos.
Además, debido a la especificación ligera de las pruebas, las pruebas tienden a variar de un
probador a otro y de una ejecución de pruebas a otra. Así, éstas varían más cada vez que
éstas son ejecutadas y resisten a la paradoja de pesticida explicada en el capítulo 1.
Porque las técnicas son tan diferentes a las técnicas estructurales y de comportamiento,
éstas sirven como una manera excelente para encontrar vacíos en las pruebas que
preparamos utilizando las estrategias analíticas.
Finalmente, la gente encuentra estas estrategias divertidas y creativas, porque el
descubrimiento de un defecto es a menudo uno de los aspectos más gratificantes,
intelectualmente desafiantes y algunas veces graciosos del trabajo de las pruebas. Sin
embargo, no todo es color de rosas. Como mencionamos muchas de las técnicas están
enfocadas completamente en el descubrimiento de los defectos, entonces la cobertura de las
áreas clave, las características y los rasgos de calidad son cuestionables. Aún los métodos
basados en las listas de comprobación y basados en las cartas de pruebas (“test charters”)
producen una cobertura con vacíos, porque las cartas y las listas de comprobación
representan con frecuencia la noción de una persona acerca de lo que debe ser probado, no
un consenso con todos los interesados.
Además, si las listas de comprobación o las cartas son desarrolladas o adaptadas, a la rápida
o bajo otras presiones, la persona que crea o adapta estos documentos tenderá a olvidar
cosas, conduciendo a una cobertura aún menos completa.
Las estrategias analíticas de pruebas producen una lista sólida de las condiciones de
pruebas, los ítems de los riesgos y similares, cuando son iniciadas en el comienzo del
proceso de pruebas, éstas pueden ser utilizadas para estimar el esfuerzo necesario para
preparar y ejecutar las pruebas. Aquellos productos del trabajo no estarán disponibles
cuando se utilizan las estrategias dinámicas.
En muchos casos – por ejemplo, el método de las pruebas exploratorias con las cartas de
pruebas– hay una realización extensa de interrogatorios y debates para guiar el proceso,
porque no hay un “plan de pruebas” de por sí. (Más acerca de esto en el capítulo 5). Todas
estas sesiones de debates e interrogatorios funcionan para un equipo pequeño, idealmente
colocado y en la misma zona horaria, pero ellos no crecerán a equipos grandes o
distribuidos. Además, estas estrategias, mientras son útiles como un complemento para las
estrategias analíticas, no tienden a funcionar bien en muchos proyectos si se apoyan
exclusivamente sobre estas.
Prueba Hrs./Día 42 6
Efectividad 22 44
Esta tabla muestra un caso de estudio del uso de las pruebas exploratorias como técnica
complementaria en el proyecto que se apoyó principalmente en la estrategia de pruebas
analítica basada en los riesgos. Teníamos un equipo de pruebas que consistía en siete
técnicos de pruebas, tres ingenieros y un jefe de pruebas, Rex Black.
Los técnicos de pruebas eran básicamente contratados a bajo costo a quienes le dimos
precisamente los guiones detallados de las pruebas los cuales ellos luego ejecutaron. Cada
técnico de pruebas pasa normalmente 6 horas de 9 o 10 horas en el día en realidad
ejecutando estos guiones de pruebas. Las reuniones, el correo electrónico, la actualización
de los guiones de pruebas, la asistencia a los ingenieros de pruebas y otras funciones
importantes consumieron el resto del tiempo. De este modo fueron cerca de 42 horas al día,
que se utilizaron en la ejecución de los guiones de prueba.
Sin embargo entre los tres ingenieros de prueba y Rex Black, tenían más de 20 años en total
de experiencia en pruebas, de hecho probablemente más de 30 años. De manera que no
tendrían confianza en los guiones de pruebas y la capacidad de los técnicos de pruebas para
ejecutar aquellos guiones, decidimos realizar alguna prueba exploratoria con cartas. Esto
significó que nos pondríamos de acuerdo en probar diferentes áreas que pensamos, que
merecieran nuestra atención. Sin embargo, debido a que estuvimos ocupados, pudimos
dejar de lado solamente unas 6 horas al día en total entre los cuatro de nosotros para las
pruebas exploratorias.
En otras palabras, las pruebas exploratorias representaron un 13% del esfuerzo diario de las
pruebas. Pero, como puede ver en la tabla, mientras que las pruebas basadas en guiones
encontraron 928 defectos, un 78%, las pruebas exploratorias, basadas en el esfuerzo,
encontraron desproporcionadamente un numero alto, 261, o alrededor del 22%. Si divide el
número total de defectos por las horas por día del esfuerzo de pruebas, nos da una métrica
de efectividad de 22 para las pruebas basadas en guiones y un 44 para las pruebas
exploratorias.
De este modo, este caso de estudio nos demuestra que las pruebas exploratorias son
alrededor de 2 veces más efectivas en descubrir defectos en base a hora por hora. Si
fuéramos a calcular la eficiencia e incluir el tiempo dedicado para la preparación de las
pruebas, las pruebas exploratorias serían significativamente más eficientes. Después de
todo, las pruebas basadas en guiones necesitaron un esfuerzo extenso para ser creadas. Este
caso de estudio apoya el uso de pruebas exploratorias en un proyecto.
Sin embargo, hay algunas cosas de tomar en cuenta. ¿Podríamos haber empleado los
técnicos de pruebas para realizar las pruebas exploratorias y descubrir aún más defectos?
Probablemente no, porque el nivel relativo de experiencia es importante.
Además, como el cliché de gestión dice que lo que es medido es realizado y lo que no es
medido no es realizado. Así el problema con esta figura es que estamos midiendo
solamente los defectos. ¿Cuál es el valor de las pruebas más allá de encontrar los defectos?
Bien, para uno es la construcción de confianza y para otros la mitigación de los riesgos.
Porque las pruebas exploratorias tuvieron una medida de cobertura pequeña y ninguna
trazabilidad hacia atrás a los riesgos, no hay mucha cobertura demostrable o mitigación de
los riesgos.
Finalmente, note que la regresión fue un mayor riesgo para este proyecto. Tuvimos que ser
capaces de realizar pruebas precisas de regresión, como es el caso en muchos proyectos.
Así, el valor de la reutilización de los guiones fue de valor significativo.
4.5.1 Ejercicios
Ejercicio 1
Considere la utilización de las pruebas reactivas como opuestas a las pruebas prediseñadas.
En la tabla de abajo, ponga un “+” en la columna donde el factor o interés motiva hacia la
utilización del método y un “-” en la columna donde el factor o interés desmotiva la
utilización del método.
Los métodos reactivos de pruebas como los ataques de Whittaker o las técnicas
exploratorias de Kaner/Bach/Bolton tienden a tener un gran número de defectos
identificados por las horas totales de las pruebas. Porque existe una mínima documentación,
usted puede empezar a probar inmediatamente, lo cual es útil cuando usted no está
involucrado en el proyecto desde el principio. (Suponemos que es como hacer de la
necesidad una virtud, porque la participación tardía de los probadores es una de las peores
prácticas de ingeniería de software). También debido a la mínima documentación, los
cambios en la interfaz de usuario e incluso en la funcionalidad no incurren en grandes
costos del mantenimiento de las pruebas.
Esta sección, Selección de las Técnicas de Pruebas, cubrirá los siguientes conceptos clave,
los cuales son, los factores que influencian la selección de las técnicas apropiadas del
diseño pruebas.
¿Entonces cuáles son los factores que influencian la selección de las técnicas del diseño de
pruebas?
Tipo de sistema: Es una buena idea de utilizar las tablas de decisión para probar sistemas
que procesan transacciones similares. Sistemas que deben comportarse diferente
dependiendo de lo que ha ocurrido hasta el momento son más susceptibles a las pruebas
basadas en los estados.
Requisitos del cliente o el contrato: El cliente o el contrato podría requerir que ciertas
técnicas sean utilizadas, directamente o indirectamente.
Nivel y tipo de riesgo: Deberíamos probar ciertos sistemas, como los de seguridad crítica,
en los niveles más altos posibles de seguridad. Deberíamos utilizar todas las técnicas de
pruebas aplicables.
Objetivos de las pruebas: Cuanto mayor sea el nivel de detección de defectos que queremos
alcanzar, más diversas son las técnicas que debemos utilizar. Si el objetivo principal es
encontrar muchos defectos como sea posible en un corto tiempo, entonces confiaremos
probablemente y fuertemente en las pruebas basadas en la experiencia.
Plazo y presupuesto: Si tenemos tiempo para preparar las pruebas, podemos hacerlo así. Si
tenemos dinero para herramientas de cobertura de código, entonces podemos determinar la
cobertura estructural.
Ciclo de vida del desarrollo: Como lo hablamos al principio, ciertos modelos del ciclo de
vida, como los iterativos, tienden a sufrir de los riesgos de alta regresión. Eso significa que
tenemos que buscar pruebas reutilizables.
Experiencias previas acerca de los tipos de defectos encontrados: Si tenemos una buena
idea de dónde buscar los defectos, las técnicas basadas en la experiencia que se basan en
esa experiencia funcionarán bien para nosotros.
Por supuesto, hay otros factores. Es importante, que cuando piense acerca de cómo probar,
que mantengan la mente comprometida con las necesidades del proyecto y vincule sus
pruebas a esas necesidades.
Sin embargo, la realidad es que hay más un espectro que una dicotomía. Cuanto más
precisas y detalladas las pruebas, cuanto más aprovechamos de los beneficios de la
trazabilidad, la reproducibilidad y aún la auditabilidad. Sin embargo pagamos el precio en
cuanto al costo del desarrollo y el mantenimiento, así como también la incursión del riesgo
de que los probadores pudieran desviarse de todas maneras de los guiones, así privándonos
de los beneficios que buscamos.
Cuanta menos especificación alrededor de las pruebas, cuanto más aprovechamos los
beneficios como la disminución de los costos de las pruebas, la flexibilidad mejorada y la
respuesta a las necesidades de cambio del proyecto. Sin embargo, pagamos el precio en
cuanto a la cobertura conocida, la reproducibilidad y algo similar.
La realidad es, una vez que usted separe varias personas quienes apoyan una técnica o
estrategia sobre otra, los equipos inteligentes de pruebas equilibran la el tamaño de la
documentación basada en las necesidades del proyecto. A menudo tenemos que vivir con
las restricciones como el programa y el presupuesto y a menudo necesitamos a pruebas
escritas y reproducibles. De este modo, tenemos que alcanzar un equilibrio.
Una vez estábamos conversando con un jefe de pruebas acerca del grado de detalle que él
quería en sus casos de prueba. El dijo, “Bien, si puedo dar el caso de prueba a un gorila
afeitado y esperaría que el gorila lo ejecute, ése es un caso de prueba bien escrito”.
“Ninguno”.
El no tenía una respuesta. Alguien le había dicho una vez que el estándar del gorila afeitado
era una regla difícil y rápida, y él tomó esto como la sabiduría revelada.
Es importante que tome en cuenta cómo alcanzar el equilibrio correcto de esta pregunta
acerca del detalle y la precisión del caso de prueba. La manera de alcanzar este equilibrio es
de considerar los intercambios en el espectro de la documentación de las pruebas. Las
pruebas precisas le permiten utilizar probadores con menos habilidad, pero esas pruebas no
son muy flexibles. Las pruebas imprecisas pueden cubrir más condiciones—porque ellas
son más rápidas de escribir—pero esas pruebas no son muy reproducibles, especialmente a
través de múltiples probadores. Las pruebas precisas le proporcionarán los criterios de
pruebas transparentes a usted y cualquiera que las lea, pero esas pruebas son difíciles y
costosas para mantener. Las pruebas imprecisas son rápidas de escribir, pero la cobertura
que ellas proporcionan, puede ser difícil de definir y medir.
La mayoría de los equipos de prueba no tienen guías para el grado correcto de precisión, lo
cual significa que ellos típicamente documentan en exceso o documentan muy poco. Un
buen comienzo es medir el número de palabras de la documentación en un ejemplo
aleatorio de 10, 50 o mejor todavía 100 de sus casos de prueba y procedimientos de prueba.
Ahora, por cada caso de prueba, divida el número de palabras entre el número de horas o
minutos que toma la ejecución de esa prueba. Cuanto más grande el número, cuanto más
precisa la documentación que está proporcionando a sus probadores.
A menudo, cuando realizamos este ejercicio con los clientes encontramos diferencias de
orden de magnitud entre los probadores acerca de esta métrica. Adicionalmente, no hay una
guía de gestión que diga a quién se debe proporcionar cuánto detalle. Ése es un problema
para rectificar si es que existe en su organización.
Glosario del ISTQB
Técnica de diseño de pruebas de caja negra: Procedimiento para derivar y/o seleccionar
casos de prueba basados en un análisis de la especificación, ya sea funcional o no
funcional, de un componente o sistema sin referencia a su estructura interna.
Técnica de diseño de pruebas de caja blanca: Procedimiento para derivar y/o seleccionar
casos de prueba basados en un análisis de la estructura interna de un componente o sistema.
4.6.1 Ejercicios
Ejercicio 1
Hacer una lista de los factores abordados en esta sección que afectarían a la selección de las
técnicas de pruebas y el alcance de la documentación de Omninet.
Argumente.
1. Organización de pruebas.
2. Planificación y estimación de pruebas.
3. Monitoreo y control del progreso de pruebas.
4. Gestión de configuración.
5. Riesgo y pruebas.
6. Gestión de incidencias.
LO-5.1.2 Explicar los beneficios y las desventajas de las pruebas independientes dentro de
una organización. (K2)
LO-5.1.3 Reconocer los diferentes miembros del equipo para que sean considerados para la
creación de un equipo de pruebas. (K1)
LO-5.1.4 Recordar las tareas del típico líder de pruebas y el probador. (K1)
Don Quijote: ¿Campeón solitario de Calidad? Usted puede hacerse un gran daño
político, si no entiende su rol en la compañía.
Bien, podemos probar el software o los sistemas que se nos ha entregado. Recuerde que la
definición en el glosario del término “pruebas” es: “El proceso que consiste en todas las
actividades del ciclo de vida, ambas estáticas y dinámicas, preocupadas por la
planificación, la preparación y la evaluación de los productos de software y los productos
del trabajo relacionados, para determinar que ellos satisfagan los requisitos especificados,
para demostrar que ellos están aptos para el propósito y para detectar defectos”. Esto es un
gran trabajo. De hecho, en la mayoría de las organizaciones y los proyectos, ese trabajo
necesita ser distribuido en parte al desarrollo por lo menos, las pruebas de unidad y las
revisiones del código. A menudo, un equipo de pruebas independiente se enfoca en un sólo
nivel de pruebas o dos niveles relacionados lógicamente; p.ej. Las pruebas de sistema y las
pruebas de integración de sistemas. Ésta es una misión alcanzable, con la condición de que
cada uno comprenda que no podemos ser 100% efectivos en ninguna de las siguientes 3
actividades—los requisitos de las pruebas, la comprobación de la aptitud para el propósito o
los defectos detectados. La imposibilidad de las pruebas exhaustivas limita nuestra
efectividad a menos del 100% en cualquiera de estas áreas y las restricciones del proyecto
relacionadas con el tiempo y dinero la limitarán aún más.
Cuando trabajamos con clientes hemos notado que ellos se refieren acerca de sus equipos
de pruebas como grupos de “control de calidad”. No hay una definición en el ISTQB para
este término, pero hay una definición estándar del Japón que denomina el control de calidad
como “El sistema de medios para producir económicamente productos o servicios que
satisfagan los requisitos del cliente”.
Por otro lado, la satisfacción con el software puede depender frecuentemente de un número
de intangibles que están más allá de nuestra capacidad de probar, incluyendo atributos de la
adquisición, la entrega y los procesos del soporte. Usted es un jefe de pruebas valiente que
permite la evaluación del rendimiento de su equipo por medio de las encuestas acerca de la
satisfacción de los clientes.
Jefe de Pruebas: La persona responsable para la gestión del proyecto de las actividades y
los recursos de las pruebas y la evaluación de un objeto de prueba. El individuo quién
dirige, controla, administra, planifica y regula la evaluación de un objeto de prueba.
En el capítulo 4, aprendió cómo utilizar el análisis de los riesgos de calidad para basar los
casos de prueba en los riesgos y para optimizar la secuencia y el esfuerzo de las pruebas
basadas en los niveles de riesgo. Esto quiere decir que las pruebas pueden ofrecer un
servicio de gestión de los riesgos de calidad para una organización. De hecho, podemos
medir el nivel residual del riesgo e informar nuestros resultados basados en eso. (Más
acerca de eso en una sección más adelante de este capítulo).
Podemos también ofrecer nuestros servicios como asesores de calidad. Podemos decir que
la calidad implica ambos la conformidad con los requisitos especificados y la capacidad del
sistema de satisfacer al usuario, el cliente, y las necesidades y expectativas de los
interesados. Por supuesto, no podemos hacer esto perfectamente, porque tiene que haber
por seguro alguna prueba que podríamos haber ejecutado relacionada con algún usuario u
otro que no lo vamos a conseguir.
Ahora, los problemas reales comienzan cuando los grupos aceptan la carta
(“charter”) del “aseguramiento de la calidad”. El aseguramiento de la calidad se
define según el Glosario como “La parte de la gestión de la calidad enfocada en
proveer la confianza en que los requisitos de calidad se cumplan”, suena
suficientemente tranquilo. Sin embargo, la mayoría de la gente utiliza la
definición inglesa más común de “asegurar” cuando ellos piensan en el
aseguramiento de la calidad.
De este modo esta definición dice que la misión del equipo del aseguramiento de calidad es
“prevenir riesgos relacionados con la calidad” o “asegurar o cerciorarse de la calidad”,
“informar positivamente que la calidad está presente”, “asegurar el logro de calidad”, o, tal
vez más comúnmente y más tóxicamente para la existencia continua del equipo de pruebas
o “para garantizar la calidad”. Un grupo de pruebas, especialmente uno comprometido en
un nivel alto en el final del proyecto, no puede garantizar la calidad al igual que la compra
de una balanza no puede garantizar la pérdida de peso. La calidad sale de una interacción
compleja de las características y los atributos del producto, implantada en todo el proceso—
o no. Si no se controla el proceso entero de principio a fin, no puede asegurar la calidad.
Sólo aquellos con el control de todo el proceso—p.ej., todo el equipo de gestión del
proyecto—pueden asegurar la calidad. Francamente, a menudo la designación de un equipo
como el “grupo del aseguramiento de calidad” es simplemente una forma para que el
equipo de gestión del proyecto pueda apuntar a un culpable de los problemas de calidad
cuando estos aparecen.
Asumiendo que su equipo tiene la misión de probar (o, tal vez del control de calidad),
entonces usted tiene una necesidad de gestionar el proceso. La gestión del proceso
significa, en este caso, un trabajo continuo para alinear los servicios de las pruebas que
usted provee con las necesidades de la organización, el proyecto, y el producto, dentro de
las restricciones que usted debe soportar, junto con el concepto más tradicional de gestión
en cuanto a definir y llevar a cabo un plan para el conjunto de actividades.
Algunas veces, nuestro trabajo nos lleva a lugares hermosos. Nuestros asociados y nosotros
hicimos un proyecto en Paris, Francia, justo en la primavera. Estuvimos allí para ayudar al
Jefe de Desarrollo en la construcción de un framework de pruebas de unidad automatizadas
para su equipo. Cuando llegamos, sólo para conocer quién era quién y quién más podría ser
capaz de utilizar nuestro framework, hablamos con varias personas acerca de la
organización y sus desafíos.
“Natasha”, el dijo, “es una diletante narcisista”. El no quiso decir eso como un
complemento.
“Sus operaciones de pruebas son un completo desastre. Nadie sabe que está ocurriendo allí.
Todavía ella encuentra tiempo para venir y sermonear a mis desarrolladores y líderes del
desarrollo acerca de cómo ellos pueden realizar mejores pruebas de unidad y revisiones de
código. Todos ellos se ponen tensos por sus lecciones pretenciosas—ella no sabe nada
acerca de codificar—y tengo que pasar mucho tiempo calmando sus frustraciones”.
¿Por qué estaba Natasha haciendo esto? Bueno, resultó que cuando ella tomo el
trabajo de Jefe del Aseguramiento de la Calidad (“QA”), no había una misión
definida. Ella nunca había sido antes una Jefa del Aseguramiento de la Calidad
(“QA”), así que ella le preguntó al Vicepresidente a cargo de su grupo (y también
a cargo del grupo de Boris, a propósito) qué ella debería hacer. El dijo, “Bueno,
haga Aseguramiento de la Calidad (“QA”)”. Entonces ella fue y compró un libro
acerca del Aseguramiento de la Calidad (“QA”). Éste libro afirmaba acerca del
Aseguramiento de la Calidad (“QA”) como una tarea principalmente preventiva,
enfatizando los conceptos de Gestión Total de la Calidad. Ella preguntó luego a
su jefe, el Vicepresidente, si esa era la misión correcta. El dijo, “Seguro, lo que
sea que el libro diga”.
Aquí viene el problema. Natasha olvidó de hacer que la misión sea claramente definida y
comunicada a cada uno que es parte del organigrama del Vicepresidente. De este modo, ella
no tuvo apoyo político para hacer eso. Ella agravó el problema empleando a alguien que no
era técnico—es decir, ella misma—para interactuar con los desarrolladores acerca de su
parte del trabajo del aseguramiento de la calidad. Al respecto, ella no tenía nada que
ofrecerles sino más bien frases trilladas e intimidantes.
En el nivel más bajo de independencia, las pruebas son realizadas por el autor del
ítem de prueba.
Las pruebas son realizadas por otra persona o gente dentro del mismo equipo.
Las pruebas son realizadas por una persona o gente de un equipo diferente o por
especialistas de pruebas.
En el nivel más alto de independencia, las pruebas son realizadas por una persona o
gente de una organización diferente o compañía.
Bueno, comencemos a pensar acerca de lo que las pruebas pueden hacer con respecto a los
defectos. Las pruebas pueden detectar algún porcentaje de los defectos y así ofrecer a la
organización la oportunidad de mejorar la calidad.
En otras palabras, las pruebas son como un filtro, capturando un cierto porcentaje
del material no deseado que fluye a través de éstas. En importantes circunstancias
como la purificación del agua, los sistemas de agua municipales utilizan
múltiples niveles de filtración.
Las pruebas independientes tienden a ser más efectivas que las autopruebas en encontrar
defectos.
Como regla general, lo que observamos en nuestros mejores clientes es que las pruebas son
poco independientes en los niveles de pruebas más bajos. Para las pruebas de unidad es
necesaria la amplia comprensión de la implementación de una unidad. El desarrollador—
presumiblemente—ya ha adquirido la compresión en el proceso de implementación. Sin
embargo, el autor tiene también una parcialización para creer que su solución es correcta—
sino él no la hubiera implementado de esa manera. Los estudios de Capers Jones indican
que los porcentajes de la detección de defectos para las pruebas de unidad oscilan entre el
10%(con las peores prácticas) y el 25%(con las prácticas típicas) y el 50%(con las mejoras
prácticas). Las mejores prácticas incluirían la utilización de frameworks automatizados de
las pruebas de unidad, acerca de las cuales conversaremos en el capítulo 6.
Nuestros mejores clientes realmente reservan las pruebas independientes para los altos
niveles de las pruebas, así como la prueba de sistema, la prueba de integración de sistemas
y la prueba de aceptación. Los equipos de pruebas independientes realizan la prueba de
sistema, y, si es aplicable, la prueba de integración de los sistemas, mientras que los
usuarios y los clientes realizan las pruebas de aceptación. Nuestra evaluación de los clientes
demuestra que los porcentajes promedios de la detección de los defectos para los equipos
independientes de pruebas oscilan alrededor del 85%(con las prácticas típicas), con el 95%
y arriba (con las mejores prácticas).
Entonces, arriba y más allá de un mejor nivel de detección de defectos, ¿Cuáles otros
beneficios ofrecen las pruebas independientes?
Los probadores independientes no sólo tienden a ver más defectos, ellos también ven otros
y diferentes defectos. Eso es, ellos tienden a tener un conjunto de ideas diferentes acerca de
lo que la calidad significa, a menudo un sentido más amplio, que los desarrolladores
individuales.
Además, los probadores independientes tienden a tener una actitud escéptica hacia el
producto—la antítesis de la parcialidad del autor—que los hacen suponer que si hay alguna
duda acerca del comportamiento observado, entonces es valioso de reportarlo como un
defecto.
Esto hace que los probadores independientes calificados, sean participantes muy valiosos
en las revisiones, desde los requisitos, pasando por el diseño hasta el código. Ellos tienden
a preguntar—y así ayudan a verificar—las suposiciones embebidas en las especificaciones
y la implementación.
Finalmente, hay el riesgo de que las actividades tempranas de calidad como las pruebas de
unidad se pongan peor cuando los programadores abandonen el sentido de la
responsabilidad por la calidad. Esto resulta en una caída de la calidad del producto, no
subida, porque las pruebas de alto nivel, las cuales son filtros sensitivos, a menudo son
obstruidas y vencidas por la muy baja calidad y los muchos defectos del código.
Estrategia de pruebas: Una descripción de alto nivel de los niveles de pruebas que deben
ser realizados y de las pruebas en aquellos niveles para una organización o programa (uno o
más proyectos). Note que este término no es específicamente utilizado en esta sección pero
está aquí incluido porque es esencial para comprender el término método de prueba.
En la mayoría de los niveles sénior, tenemos ingenieros de pruebas. Estos son pares
técnicos de programadores, gente que elige las pruebas como una especialidad. Ellos
escriben casos de prueba y organizan juegos de prueba. Ellos crearán, personalizarán y
utilizarán las herramientas avanzadas de pruebas, incluyendo la automatización de las
pruebas. Ellos tienden a tener habilidades únicas de las pruebas.
En el nivel más bajo, tenemos los técnicos de pruebas. Nos agrada que ellos sean
probadores hábiles y con experiencia, pero algunas veces ellos son nuevos en el campo.
Idealmente, ellos aspiran a ser ingenieros de pruebas. Sus principales tareas son ejecutar las
pruebas, informar los defectos y actualizar el estado de las pruebas. Ellos asisten a los
ingenieros de pruebas.
En muchos equipos de pruebas, tenemos otros miembros del equipo de pruebas
así como un administrador de sistemas o base de datos o ingenieros de versión o
configuración. Cuando tenemos que crear herramientas de pruebas, tenemos una
posición llamada toolsmith29 de pruebas.
Los cargos correctos para su equipo dependen de las habilidades que necesite, lo
cual es un asunto del cual hablaremos más en un momento. Necesita equilibrar
las habilidades y los cargos a través de todo el equipo de pruebas. También,
recuerde que las habilidades son complementarias y de que el todo puede ser más
grande que la suma de las partes—o menos cuando las habilidades críticas hacen
falta en todos los miembros del equipo de pruebas.
En muchos proyectos, los probadores aficionados son empleados como parte(o todos) de un
equipo de pruebas. Un probador aficionado es definido como alguien que no prueba para
vivir, pero es oficialmente empleado como un usuario del sistema, un jefe de proyecto, un
jefe de calidad, un programador, un experto comercial o del dominio o un operador de
infraestructura o TI.
Mientras que no tenemos problemas con los probadores aficionados que participan en
algunas actividades de pruebas—especialmente en dominios de negocios o tecnologías
complejos. Sin embargo, mientras un equipo se conformó exclusivamente de probadores
aficionados, ellos tendrán a menudo habilidades fuertes en algunas áreas y habilidades muy
débiles en otras áreas.
Por ejemplo, los programadores son a menudo fuertes técnicamente pero más débiles en el
conocimiento del dominio del negocio, mientras los usuarios tienden a ser técnicamente
débiles pero fuertes en el conocimiento del dominio de los negocios. En ambas formas, la
mayoría de los probadores aficionados no tienen habilidades o experiencia substancial en
las pruebas.
Las pruebas son un campo especial, con habilidades especiales. Los conceptos básicos son
cubiertos en este libro, pero se necesitan aún tres libros avanzados aún más extensos que
este libro antes de que usted haya sido expuesto a la mayoría de las prácticas comúnmente
utilizadas en las pruebas. Un aficionado no sabrá ni los conceptos básicos, y eso conduce a
muchos errores en las pruebas de principiante y que pueden ser fácilmente evitables.
La profundidad y el largo apropiado de cada flecha en la figura dependen del proyecto, el
proceso y el producto
Los equipos buenos de pruebas tienen la mezcla correcta de las habilidades basadas en las
tareas y actividades. ¿Entonces, cuáles son las habilidades necesarias de un probador o líder
de pruebas? Éstas se dividen en tres áreas principales:
Sería muy bien si pudiéramos entregarle el Currículo del Probador de Oro, un conjunto de
habilidades y experiencias que constituirían las características del probador con habilidades
perfectas. Sin embargo, las habilidades necesarias tienden a variar de un proyecto a otro, de
un producto a otro, de una organización a otra. Piense acerca de esto: ¿Cuál es la mezcla
correcta para cada uno de los siguientes proyectos?
Su proyecto actual.
Figura 5.3: Caso de Estudio: Roles, Organización y Proyecto
Esta figura muestra la organización RBCS contratada para formar un equipo de pruebas
independiente para un proyecto de un dispositivo de internet.
Un ingeniero de pruebas dirigió un equipo de tres técnicos en las pruebas del lado del
cliente. En otras palabras, el equipo fue entregado efectivamente a los clientes.
Otro ingeniero de pruebas dirigió un equipo de tres técnicos en las pruebas del lado del
servidor. En otras palabras, los sistemas finales de la parte de atrás en el centro de datos que
permiten a los dispositivos enviar y recibir e-mail, navegar la Web, etc.
También tuvimos dos toolsmiths de pruebas que construyeron generadores de carga y otras
herramientas de pruebas, principalmente para las pruebas del lado del servidor.
Todo el equipo nos informaba, porque Rex Black era el Jefe de Pruebas.
Como puede ver, el equipo de pruebas está bien alineado con la estructura del proyecto.
5.1.1 Ejercicios
Ejercicio 1
Imagine que usted es el jefe de pruebas para el proyecto Omninet, a cargo de las pruebas de
sistema e integración.
Argumente.
La figura 5.4 muestra una posible estructura organizacional para el equipo de pruebas. Hay
características notables en esta figura que llevan más explicación:
Note que esto se parece mucho a la estructura organizacional del caso de estudio del
Dispositivo de Internet, lo cual tiene sentido, porque Omninet es similar a ese proyecto.
Cuando crea un equipo de pruebas específico para un proyecto, puede construir el equipo
para reflejar las necesidades del proyecto. Para equipos que deben controlar una corriente
continua de proyectos que tienen diferencias significativas, usaríamos una estructura más
flexible y general.
LO-5.2.3 Diferenciar entre los métodos conceptualmente diferentes, así como analíticos, los
basados en modelos, los metódicos, los compatibles con un proceso o estándar, los
dinámicos o heurísticos, los consultivos y los contrarios a la regresión. (K2)
LO-5.2.7 Recordar los factores típicos que influencian el esfuerzo relacionado con las
pruebas. (K1)
LO-5.2.9 Reconocer o justificar los criterios de salida adecuados para niveles de prueba
específicos y grupos de casos de prueba (p.ej., para las pruebas de integración, las pruebas
de aceptación o los casos de prueba para las pruebas de usabilidad). (K2)
Esta sección, Planificación y Estimación de Pruebas, cubrirá los siguientes conceptos clave:
Un plan de pruebas es un plan de proyecto para las actividades de las pruebas, que
comienza con la planificación misma y yendo todo el camino hasta las actividades del
cierre de las pruebas.
Pensamos que escribir y actualizar los planes de pruebas tienen dos beneficios principales:
Algunas veces, tenemos que escribir varios planes para un único proyecto. Esto pasa
cuando estamos abordando dos niveles de pruebas, que ocurrirán en diferentes períodos de
tiempo. Esto aplica también a las pruebas que utilizan metodologías y herramientas
diferentes (así como las de rendimiento y funcionalidad). Hemos utilizado dos planes
diferentes para manejar los esfuerzos de pruebas los cuales mientras eran paralelos en el
tiempo, tenían objetivos muy diferentes (p.ej. la prueba de sistema y la prueba beta).
También utilizamos dos planes diferentes de pruebas cuando las audiencias eran diferentes,
así como con los planes de pruebas del hardware y los planes de pruebas del software.
En este caso, hay un riesgo de superposición y redundancia. Usted puede utilizar entonces
un plan maestro de pruebas para describir los elementos comunes así como también
asegurar que no hay vacíos o superposiciones inapropiadas entre los esfuerzos.
Como con cualquier plan, necesita darse cuenta del quién, el qué, el cuándo y el cómo de
las actividades de las pruebas.
Y, para que pueda seguir cumpliendo su trabajo durante la ejecución e informar sus
resultados, debe seleccionar el monitoreo, el control, las métricas, los diagramas y los
informes de las pruebas.
Monitoreo de las pruebas: Una tarea de la gestión de pruebas que se ocupa de las
actividades relacionadas con la comprobación periódica del estado de un proyecto de
pruebas. Informes preparados que comparan los estados reales del proyecto con los
planificados. Véase también gestión de pruebas.
Como lo dijimos antes, un plan de pruebas es un plan de subproyecto para la parte de las
pruebas de un proyecto. Más adelante, lo guiaremos a través de una plantilla para un plan
de pruebas. Ésta es la plantilla IEEE 829.
Usted puede adaptar el esquema IEEE 829 para el uso por cada plan de pruebas en detalle,
eso es, el plan de pruebas para cada nivel o fase. Esto también puede servir para el plan
maestro de pruebas. Por supuesto, si no tiene como requisito que debe utilizar la plantilla
IEEE 829, entonces también puede crear su propia plantilla o esquema.
Los criterios de entrada miden si nosotros y el sistema estamos listos para una
fase en particular de pruebas. ¿Están los entregables (el objeto de prueba, los
ítems de prueba) listos? ¿Está el laboratorio de pruebas listo, incluyendo los
casos, los datos, los entornos, las herramientas, etc.? ¿Están listos los
desarrolladores, los probadores y otros participantes para comenzar las pruebas?
Los criterios de entrada tienden a ser cada vez más rigurosos mientras las fases avanzan. Es
decir, los criterios de entrada para la prueba de sistema tienden a ser más formales que para
las pruebas de unidad.
Esta figura muestra un ejemplo de los criterios de entrada de una prueba de sistema para el
proyecto del dispositivo de Internet que mencionamos anteriormente.
Los criterios del 4 al 5 son reglas del modelo del ciclo de vida del desarrollo del software
asociadas con la utilización de un modelo del ciclo de vida secuencial, como lo hicimos en
este proyecto.
Los criterios del 6 hasta el 8 tienen que ver con la preparación de la calidad; Es decir, ¿Es el
sistema que debe ser probado lo suficientemente estable para obtener el beneficio de las
pruebas en este momento?
Ahora, tenga en cuenta de que “los criterios de continuación” son sólo una manera cortés de
decir “criterios de terminación” o “criterios de suspensión/reanudación” al revés. Lo
comenzamos a utilizar porque nos seguimos metiendo en problemas en la reunión de
revisión del plan de pruebas cuando la gente llegaba a la sección de los criterios de
suspensión/reanudación.
Como sea que lo denomine, como regla general, el cronograma es rey en muchos
proyectos. De este modo, si invoca a estos criterios para detener las pruebas, es muy poco
probable de que se haga popular.
Este ejemplo muestra los criterios de continuación de la prueba de sistema para el proyecto
del dispositivo de Internet.
Los criterios de salida pueden—y probablemente deben—considerar los factores del costo.
¿Cuánto hemos gastado en las pruebas? ¿Cuánto vale el producto? ¿Cuál es el costo
comparativo para encontrar el próximo defecto en las pruebas comparado con la producción
o el uso del cliente?
Los criterios de salida pueden y deben definitivamente considerar el nivel de los riesgos
residuales. ¿Cuáles son los defectos conocidos no corregidos? ¿Cuáles áreas de riesgo no
han sido cubiertas? ¿Cuáles riesgos estamos aceptando si terminamos las pruebas en este
momento?
Es importante recordar que, en última instancia, todas las decisiones hechas acerca de los
criterios son decisiones de negocios. Si está en el mundo de la seguridad crítica y misión
crítica, hay un motivo por el cual usted puede negarse absolutamente a renunciar uno o
más criterios. Sin embargo, en la mayoría de las situaciones, los jefes de proyecto y
negocios no sólo tienen derecho, pero sí un deber, un deber de responsabilidad mutua, para
considerar la calidad en el contexto de la característica, el cronograma y las restricciones de
presupuesto, los requisitos legales e industriales, las presiones competitivas y una serie de
otros factores del mundo real.
“Seguro”, él dijo. “Me reuní ayer con los inversionistas que fomentan este producto. Ellos
dijeron que teníamos que generar ingresos este año o ellos cortarían la inversión. Porque
estamos vendiendo un sistema electrónico de consumo, tenemos que ser parte de las ventas
de navidad. Eso significa que tenemos que estar en los estantes un día después del Día de
Gracias. Eso nos da tres semanas, incluyendo el aumento de la línea de producción para el
hardware. No podemos esperar más tiempo que el viernes. Hagan los últimos ajustes en el
producto ahora y envíenlo”.
Éste es un argumento poderoso, viajando hacia mucho tiempo atrás al sabio que escribió el
libro de Eclesiastés, quién dijo, “Mejor un perro vivo que un león muerto”. ¿Es la calidad
de un producto anulado mejor o peor que la calidad de un producto algo imperfecto que es
comprado por miles o millones? ¿Cuántos defectos de un software o sistema justifican
poner a una empresa fuera del negocio? Depende del producto y la empresa, ¿eh?
Finalmente, este otro ejemplo muestra los criterios de salida de la prueba de sistema para el
proyecto del dispositivo de Internet.
El criterio 1 exige la estabilidad del código antes del lanzamiento, así que lo que hemos
probado y lo que producimos son más o menos la misma cosa.
Los criterios 2 y 3 se refieren a los tipos particulares de defectos de que, si son observados,
ponen en duda el diseño del sistema.
El criterio 7 se refiere a las métricas acerca de las pruebas, las cuales veremos en una
sección más adelante.
Veamos el desarrollo de una estructura detallada del trabajo (“WBS”) para las pruebas.
Recuerde que la estructura detallada del trabajo (“WBS”) es una división jerárquica del
trabajo que debe ser realizado en un proyecto. ¿Entonces, cuáles son las principales etapas
en su proyecto de pruebas? Una estructura que hemos utilizado es la consideración del
proyecto como que consiste de alguna secuencia superpuesta de:
Planificación.
Asignación de personal (si aplicable).
Adquisición y configuración del entorno de las pruebas.
Desarrollo de las pruebas.
Ejecución de las pruebas.
Ahora, en cada etapa, necesitamos identificar las actividades principales y luego refinarlas
en tareas discretas.
Una manera de identificar las principales actividades es por medio de “una visión hacia el
futuro”. Aquí, revisamos mentalmente un proyecto típico de pruebas, preguntándonos a
nosotros mismos, basados en nuestra experiencia lo que tiende a ocurrir en cada etapa.
Otra manera de identificar las principales actividades es por medio de “una visión hacia el
pasado”. Si utiliza pruebas basadas en los riesgos, lo que hace es comenzar con la ejecución
de las pruebas y preguntarse, “¿Cuáles juegos de pruebas son necesarios para los riesgos
críticos?” Por ejemplo, podría haber identificado los principales riesgos en las áreas de
funcionalidad, rendimiento, control de errores, y así sucesivamente.
Ahora, pregúntese, ¿Cuáles tareas de desarrollo son necesarias para ejecutar estas
pruebas? ¿Cuáles tareas del entorno son necesarias para ejecutar estas pruebas?
¿Cuáles tareas de la asignación del personal son necesarias para ejecutar estas
pruebas? ¿Cuáles tareas de la planificación son necesarias para ejecutar estas
pruebas?
Recuerde, cuando se crea una estructura detallada del trabajo (“WBS”) esas tareas deben
ser cortas en duración (p.ej. pocos días). Adicionalmente, los indicadores del progreso
claramente visibles—a menudo llamados en inglés “inch-pebbles” que significa hitos
menores—deberían ser producidos frecuentemente, en vez de confiar en unos pocos
“hitos”. Con cronogramas no detallados e hitos poco frecuentes, puede quedar atrás y no
darse cuenta hasta muy tarde en el juego.
Hay dos métodos generales para la estimación (incluyendo la estimación de las pruebas).
Primero, podemos estimar las tareas individuales por medio del trabajo con el dueño de las
tareas o con los expertos. Ésta es realizada de abajo hacia arriba y es lo que hacemos
cuando construimos una estructura detallada del trabajo (“WBS”).
Segundo, podemos estimar el esfuerzo de las pruebas basados en las métricas de los
proyectos anteriores o similares o basados en los valores típicos. Si aplicamos esto en un
nivel más alto, como con una regla heurística para la proporción de probador-a-
desarrollador, entonces estamos realizando una estimación descendente. Si utilizamos los
parámetros para estimar las actividades individuales como el hallazgo de los defectos, la
corrección de los defectos, el desarrollo de los casos de prueba, etc., entonces estamos
realizando una estimación ascendente.
Ambos son útiles. Preferimos recurrir a la sabiduría del equipo para crear una estructura
detallada del trabajo (“WBS”), y luego aplicar modelos de reglas heurísticas para
comprobar y ajustar la estimación. Lo encontramos usualmente más exacto y mucho más
defendible contra las tentativas de reducir el cronograma de las pruebas (estas tentativas
son posibles en todas partes).
Cuando se estima una tarea de pruebas, tome en cuenta que probar es complejo.
El esfuerzo y la duración son influenciados por un número de factores, los cuales
caen dentro de las siguientes categorías principales.
Hay factores de los procesos: las pruebas dominantes a través del ciclo de vida, la gestión
del control de los cambios, el desarrollo en general y la madurez del proceso de pruebas, el
ciclo de vida elegido, la alineación del desarrollo y los procesos de pruebas, los resultados
de las fases anteriores de las pruebas, los niveles estimados y reales, y el tiempo necesario
para corregir esos defectos.
Hay factores que hacen demorar: un alto nivel de complejidad, muchos interesados del
negocio o en contra de los interesados de los negocios, la demasiada novedad, la
distribución geográfica y la zona horaria, la necesidad para producir documentación
detallada de las pruebas, las logísticas difíciles para el ítem de pruebas, los datos de prueba
o los productos de los resultados de las prueba, y los datos frágiles de prueba.
Cuando usted está estimando, sólo tiene que entender las técnicas de estimación pero
también cómo estos factores influencian la estimación. Las pruebas no existen en el vacío,
sino que más bien están presentes en cada parte del proyecto. Así, la desviación de la
estimación de las pruebas puede surgir a raíz de factores externos y eventos antes o durante
las pruebas.
Debería recordar que el plan de pruebas IEEE 829 incluye una sección llamada Método de
Prueba. El método de prueba es la implementación de la estrategia de pruebas para un
proyecto específico. El método de prueba es refinado en la especificación del diseño de
pruebas, acerca de lo cual usted se debería recordar del capítulo 4. Entonces, por ejemplo,
el plan de pruebas podría decir que nuestro método de prueba para las pruebas del
rendimiento debe utilizar una herramienta de pruebas automatizadas del rendimiento. La
especificación del diseño de pruebas para el juego de pruebas del rendimiento especificaría
entonces la herramienta exacta que estaríamos utilizando, cuál versión de la herramienta
que utilizaríamos, nuestras fuentes para los datos de prueba, los niveles de carga a los que
someteríamos el sistema, y así sucesivamente.
El método de prueba incluye típicamente las decisiones tomadas acerca de las pruebas,
basadas en las metas de las pruebas, las metas del proyecto y la evaluación de los riesgos.
Diferentes situaciones invocan diferentes métodos para las pruebas. Por ejemplo, si un
equipo de pruebas es involucrado muy tarde en el proyecto, con tiempo mínimo de
preparación, será forzado a confiar intensamente en un método reactivo. En situaciones
donde las regulaciones requieren la cobertura completa de los requisitos con las pruebas,
ese método no funcionaría por sí mismo; un método analítico basado en los requisitos debe
ser aplicado, ya sea sólo o de acuerdo con otros métodos. Entonces el método que debe ser
seleccionado depende del contexto. Cuando se selecciona un método, considere los riesgos,
los daños y la seguridad, los recursos y las habilidades disponibles y la tecnología.
Primeramente, encontramos las estrategias analíticas. Los dos ejemplos más comunes son
la estrategia analítica basada en los riesgos—la estrategia por defecto explicada en este
libro—y la analítica basada en los requisitos.
Algo similar a las estrategias analíticas son las estrategias metódicas con respecto a la
apariencia. Aquí, seguimos una metodología pre-planificada, p.ej., basada en las fallas,
basada en listas de comprobación o basada en la calidad. La diferencia entre éstas y el
método analítico es que con frecuencia no hay una fase del análisis donde las listas de
comprobación o la taxonomía de los defectos sean adaptadas al proyecto, como sería en el
método analítico.
Para aquellas personas que no pueden o no decidirán qué probar, les podemos ofrecer las
estrategias consultivas o dirigidas. Esto es una manera refinada de decir que exigiremos
mucho de los que no prueban, así como los desarrolladores, los analistas de negocio y otros,
para que nos digan qué probar. La diferencia entre ésta y las estrategias analíticas basadas
en los riesgos es que, en las pruebas basadas en los riesgos, nos apoyamos en todos los
interesados del negocio para que nos proporcionen información y actúen como
corresponsables en el proceso. En las estrategias dirigidas, usualmente los probadores piden
información solamente a un interesado de negocios o a un grupo de interesados del
negocio, y luego aceptan esa información como una verdad revelada. ¡Sólo funciona
cuando usted es dirigido por una persona realmente inteligente!
Finalmente, tenemos las estrategias de pruebas contrarias a la regresión. Aquí, la cosa más
importante es asegurar que la funcionalidad existente no sea dañada. Estas estrategias se
apoyan fuertemente en la reutilización del material de las pruebas, la automatización
extensiva de las pruebas y los juegos estándar de pruebas. Por supuesto, estas estrategias no
funcionarán bien en los productos de crecimiento rápido.
5.2.1 Ejercicios
Ejercicio 1
Utilizando la plantilla IEEE 829 como un punto de partida, escriba de dos a cinco ítems o
sentencias de alto nivel en cada sección.
Argumente.
OSTP-001
Introducción
Introducir el proyecto Omninet.
Mencionar que las pruebas cubren el quiosco, el centro de llamadas y el centro de
datos.
Esquematizar los riesgos de calidad claves del análisis de los riesgos.
Hacer una lista de las áreas de los riesgos de calidad para las cuales las pruebas
ocurrirán.
Hacer una lista de las áreas de los riesgos de calidad para las cuales las
pruebas no ocurrirán, para aquellas áreas las cuales la gente podría pensar
que usted cubrirá.
Mencionar que las pruebas de unidad e integración serán cubiertas en otra
parte.
Hacer una lista de los criterios de entrada (cuando esté listo para comenzar a
probar).
Hacer una lista de los criterios de salida (cuando esté listo para terminar las pruebas,
y, por inferencia porque ésta es una prueba de sistema, cuando el sistema pueda ser
enviado).
Hacer una lista de cualquiera de las situaciones que causarían que las pruebas sean
detenidas temporalmente.
Hacer una lista de los hitos clave de la estructura detallada del trabajo.
Asegúrese de incluir la finalización del análisis de los riesgos de calidad, el plan de
pruebas y la configuración del entorno de pruebas en el lado de las pruebas.
Asegúrese de incluir la finalización del plan del proyecto, el plan de la gestión de
configuración, las construcciones tempranas y las que están listas para ser probadas
en el lado del desarrollo.
Responsabilidades
Aprobaciones
Aprobaciones por los revisores e interesados del negocio claves en las pruebas.
LO-5.3.2 Explicar y comparar las métricas de las pruebas para los informes de las pruebas
y el control de las pruebas (p. ej. Los defectos encontrados y corregidos, y las pruebas
pasadas y falladas) relacionados con el propósito y el uso. (K2)
LO-5.3.3 Resumir el propósito y el contenido del documento del informe del resumen de
las pruebas de acuerdo al “Estándar para la Documentación de las Pruebas de Software”
(Estándar IEEE 829-1998). (K2)
Control de pruebas: Una tarea de la gestión de pruebas que se encarga del desarrollo y la
aplicación de un conjunto de acciones correctivas para encaminar un proyecto de pruebas
cuando el monitoreo muestra una desviación de lo que fue planificado. Véase también
gestión de pruebas.
Esta sección, Monitoreo y Control del Progreso de las Pruebas, cubrirá los siguientes
conceptos clave:
Informe del resumen de las pruebas: Un documento que resume las actividades y los
resultados de las pruebas. Éste contiene también una evaluación de los ítems de pruebas
correspondientes con los criterios de salida.
Hay una serie de métricas de las pruebas bastante comunes. Éstas incluyen lo
siguiente:
Finalmente, los costos de las pruebas, incluyendo el costo del hallazgo del próximo defecto
o la ejecución de la próxima prueba comparada con el beneficio. Recuerde que esto vincula
a los criterios de salida que mencionamos antes en una sección anterior.
Estas métricas pueden ser utilizadas para los informes de las pruebas. El informe de las
pruebas puede ser acerca del resumen o el análisis de los resultados de las pruebas.
Los análisis de las métricas pueden ocurrir en los eventos clave así como la
medición del cumplimiento de los criterios de salida para una reunión propuesta
acerca de la salida de las pruebas.
También podemos analizar varias métricas para realizar recomendaciones o guiar los
proyectos. Esto puede incluir la consideración de las métricas como el número estimado de
los defectos restantes, los costos y los beneficios de más pruebas, el nivel residual de los
riesgos o el nivel subjetivo de confianza.
Para evitar la gestión de nuestras pruebas completamente por medio de la intuición, nos
gusta utilizar métricas. Estas métricas pueden ayudarnos a evaluar si los objetivos de las
pruebas fueron adecuados para el nivel de pruebas que estamos abordando. Esto puede
también ayudarnos a evaluar la adecuación de las estrategias y actividades de pruebas. Esto
puede también ayudarnos a medir la efectividad y la eficiencia de nuestras pruebas, basadas
en nuestros objetivos.
Las métricas también pueden ser utilizadas para el control de las pruebas. Podemos
seleccionar y planificar para las acciones correctivas y las que sirven como guía basadas en
la información y las métricas de las pruebas. Esto puede influenciar las actividades de las
pruebas—u otras actividades del ciclo de vida del software.
Algunos ejemplos de las acciones del control de las pruebas incluyen lo siguiente:
Si durante las pruebas de confirmación, observamos una alta tasa de informes de defectos
reabiertos, entonces la gestión del proyecto adiciona un nuevo criterio de entrada con la
necesidad de la repetición de las pruebas de las correcciones de los defectos por los
desarrolladores antes de la integración en una construcción.
Figura 5.8: Ejemplo de métricas de pruebas
Este diagrama tiene cinco conjuntos de datos principales. Dos de los cuales están
trazados en el eje de la derecha.
Eso incluye ambos, los defectos corregidos y los defectos pospuestos, porque el
interés de este diagrama es demostrar si el estado de los defectos está tendiendo
hacia la preparación para la entrega.
El tercer conjunto de datos, mostrado con los símbolos “menos”, es el número promedio de
los defectos abiertos en una semana calendario. Esto está representado en la gráfica contra
el eje de la izquierda. El cuarto, mostrado con los símbolos “más”, es el número promedio
de los defectos resueltos en una semana dada de calendario, también graficado contra el eje
izquierdo.
El quinto conjunto de datos, mostrado con los símbolos “asterisco”, es el atraso promedio
en una semana de calendario dada.
Desde el momento que los diagramas de tendencias muestran las tendencias en el tiempo,
no es casualidad, que este diagrama incluye notaciones para explicar varias formas de las
curvas, así como la nivelación de la línea acumulativa del hallazgo de los defectos durante
el feriado de acción de gracias. Sin esas anotaciones, los observadores pueden
malinterpretar los ecos del proceso como una señal que estamos tratando de interpretar, en
este caso la calidad del producto.
Figura 5.9: Progreso de las pruebas
Otro diagrama típico muestra la tendencia del progreso a través del tiempo.
Este diagrama tiene dos conjuntos de las pruebas principales, ambos trazados en contra del
eje único del lado izquierdo. El primer conjunto de los datos son las horas planificadas de la
ejecución de las pruebas por día, representadas por las líneas discontinuas. Tome en cuenta
que las horas cambian primero hacia arriba, luego hacia abajo, durante el proyecto,
indicando una intensidad divergente y planificada de las pruebas.
El segundo conjunto de datos son las horas reales de la ejecución de las pruebas logradas
por fecha, las cuales están representadas por las cajitas, donde pensamos que el progreso
del día de la semana es normal. En otras palabras, las cajitas pueden saltar alrededor
aleatoriamente arriba y abajo de las líneas discontinuas, con la condición de que ellas
permanezcan dentro de las líneas punteadas. Para aquellas líneas fuera de las líneas
punteadas, hemos proporcionado una explicación del por qué.
Figura 5.10: Cumplimiento de los casos de pruebas planificados
Este diagrama tiene cuatro conjuntos de datos principales, todos trazados contra el eje
izquierdo. El primer conjunto de datos es el número de las pruebas planificadas que deben
ser completadas en un paso dado de las pruebas, mostradas con líneas parecidas a “rayos”.
Esta sección plana en la mitad de la línea parecida a un rayo ocurre debido a los fines de
semana, cuando no se han programado pruebas. El restablecimiento de la realización de las
pruebas—en otras palabras, por qué cada línea parecida a un rayo comienza cerca del
cero—es debido al hecho de que estamos ejecutando una secuencia de ejecuciones de
pruebas similares, utilizando la repetición de pruebas para la gestión de los riesgos de
regresión.
El tercer conjunto de datos es el número de aquellas pruebas completadas las cuales han
pasado en el final del día, representado con los símbolos “más”.
El cuarto conjunto de datos es el número de aquellas pruebas completadas las cuales han
fallado en el final del día, representadas con los símbolos “menos”.
Nuevamente, observe que hemos utilizado las notaciones para indicar los aspectos
interesantes de los conjuntos de datos, especialmente por qué razón ciertas ejecuciones de
las pruebas son más cortas que otras.
Otro diagrama, no tan típico pero útil, analiza la relación entre las categorías clave de los
riesgos de calidad (presumiblemente nuestra base de pruebas), el grado de la cobertura de
los riesgos que hemos alcanzado para cada categoría y el número de los defectos que hemos
encontrado relacionados a cada categoría de los riesgos.
Abajo, tenemos etiquetas que corresponden a cada categoría principal de riesgo. Tenemos
la trazabilidad de nuestros casos de prueba hacia atrás a los riesgos de los cuales se
derivaron, como los describimos en el capítulo 4. Utilizamos esa trazabilidad, en el nivel no
detallado de la categoría de riesgo, para crear este diagrama. También necesitaremos la
clasificación de nuestros informes de los defectos en cuanto a los riesgos con los cuales se
relacionan, y también utilizaremos esa trazabilidad para crear este diagrama.
Un informe del resumen de las pruebas describe los resultados de un nivel dado o
fase de pruebas. La plantilla IEEE 829 incluye las siguientes secciones:
Los resúmenes pueden ser entregados durante la ejecución de las pruebas, como parte de un
informe o recopilación del estado de los proyectos. Ellos también pueden ser utilizados en
el final de un nivel de pruebas como parte de las actividades del cierre de pruebas.
Figura 5.12: Resumen de casos de prueba para un nivel de pruebas
En esta figura, puede ver el resumen de los casos de prueba para un nivel de prueba. Es una
hoja de cálculo que hace el seguimiento, prueba tras prueba, del estado de las pruebas. Los
casos de prueba, agrupados en los juegos de pruebas, son mostrados en la columna C. Por
cada juego de pruebas, tenemos un responsable o asignado (en la columna A), la persona o
grupo responsable de la ejecución de la prueba. Cada juego de pruebas y caso de prueba es
representado con un número de identificación en la columna B.
Aquí está el resumen del juego de pruebas, una descripción de alto nivel de la información
recopilada de la figura anterior, la cuál era el resumen de la ejecución de los casos de
prueba. Éste da una buena descripción, juego de pruebas tras juego de pruebas, acerca de
dónde estamos en cuanto a la realización de las pruebas. Éste utiliza la palabra
“realización” en vez de finalización, porque las pruebas, las cuales son saltadas, son
contadas como realizadas y no sería bastante exacto de llamar aquellas pruebas como
finalizadas o completadas.
Usted debería examinar la figura anterior para ver cómo es derivado cada elemento de esta
hoja de cálculo.
Acaba de ver un ejemplo de un registro prueba tras prueba. El estándar IEEE 829 para la
documentación de las pruebas incluye también sugerencias acerca de qué incluir en un
registro de pruebas.
De acuerdo al estándar, un registro de pruebas debe guardar los detalles relevantes acerca
de la ejecución de las pruebas. La plantilla estándar incluye las siguientes secciones:
Como ya ha visto, las hojas de cálculo del seguimiento que capturan estos y muchos otros
detalles son frecuentemente utilizados para este propósito.
5.3.1 Ejercicios
Ejercicio 1
¿Por cada escenario, cómo presentaría estos resultados de las pruebas al equipo del
proyecto?
Si está trabajando con un grupo en este libro, argumente su solución con otros en su grupo
antes de continuar y ver nuestra solución.
Figura 5.14
Este diagrama muestra los informes de los defectos abiertos y resueltos hasta la fecha en
este escenario.
Figura 5.15
Este diagrama muestra las horas de las pruebas realizadas hasta la fecha en este escenario.
Figura 5.16
Este diagrama muestra los casos de prueba realizados en este escenario hasta la fecha.
Figura 5.17
Este diagrama muestra el riesgo residual en este escenario hasta la fecha, basado en la
cobertura de las pruebas realizadas y los defectos encontrados.
El lunes, después de intentar probar todo el día, se determinó que había la versión
incorrecta del software en el servidor Web.
El martes, el equipo de operaciones encontró que era necesaria la reinstalación del sistema
operativo en el servidor Web.
El jueves, a pesar del retoque por el equipo de operaciones, los clientes de las
pruebas no pudieron localizar el servidor en la red de pruebas.
El viernes, debido a lo que el equipo de operaciones al final determinó fue un problema de
configuración, la aplicación hacía caer al servidor repetidamente cada vez que ésta era
puesta en marcha.
Entonces, las pruebas comenzarían pero luego pararían cuando estos ejercicios tediosos
ocurren paso a paso.
Figura 5.18
Este diagrama muestra los informes de los defectos abiertos y resueltos hasta la fecha en
este escenario.
Figura 5.19
Este diagrama muestra las horas de pruebas alcanzadas hasta la fecha en este escenario.
Figura 5.20
Este diagrama muestra los casos de prueba realizados hasta la fecha en este escenario.
Figura 5.21
Este diagrama muestra el riesgo residual hasta la fecha en este escenario, basado en la
cobertura realizada de las pruebas y los defectos encontrados.
Los problemas son varios y todavía en áreas básicas que simples pruebas habrían
capturado. Por ejemplo, la aplicación no puede guardar un documento más largo que una
página.
Además, ahora recuerde que el equipo de desarrollo ha estado advirtiendo las pruebas
informalmente de que no había tiempo en el cronograma para las pruebas suficientes de
componente y de integración.
Figura 5.22 Este diagrama muestra los informes de los defectos abiertos y resueltos hasta
la fecha en este escenario.
Figura 5.23 Este diagrama muestra las horas de pruebas alcanzadas en este escenario.
Figura 5.24 Este diagrama muestra los casos de prueba realizados hasta la fecha en este
escenario.
Figura 5.25 Este diagrama muestra el riesgo residual hasta la fecha en este escenario,
basado en la cobertura de pruebas realizadas y los defectos encontrados.
Solución del Ejercicio 1
En el segundo escenario, el punto principal es no dejar que tal situación se agrave por toda
una semana. Comunicar a un superior apropiadamente pero rápidamente. Algunos
participantes en una clase dijeron que ellos conseguirían ayuda urgente del personal de
desarrollo y de la administración del sistema en el medio día del primer lunes de las
pruebas y asegurarían que la gerencia sénior se enterara de la situación si ésta persistía en el
final del día.
En el tercer escenario, el desafío es el tratamiento de los asuntos políticos asociados con las
pruebas inadecuadas de componente e integración y de las indirectas que se le han dado a
usted al respecto. Mientras usted pueda que quiera anunciar en la reunión del proyecto,
“Escuchen, el jefe de desarrollo metió la pata, incluso su propia gente dijo que él estaba
metiendo la pata y ahora no voy limpiar su desastre por él”, procediendo así crearía
típicamente tanta disensión y enemistad a largo plazo que cualquier satisfacción inicial que
podría venir de éste se esfumaría pronto. En cambio, la mayoría de la gente está de acuerdo
con ir al jefe de desarrollo temprano en la semana y crear juntos un plan de acción para la
recuperación, y anunciando ese plan conjuntamente en la reunión del proyecto sería
políticamente el plan más astuto, y, a través de una feliz coincidencia, el plan más probable
para conducir el proyecto al éxito.
La gestión de pruebas y configuración tienen una relación fuerte pero a menudo invisible.
Cuando la gestión de configuración es realizada correctamente, nosotros como probadores
rara vez lo notamos, pero cuando es realizada incorrectamente, sufrimos realmente.
Por ejemplo, usted probablemente utiliza Linux, Windows o Mac en su computador. Cada
uno de aquellos paquetes no es solamente un sistema operativo, si no que una familia de
sistemas. El sistema operativo mismo consiste en cientos de archivos individuales en su
computador. Cada uno de aquellos paquetes contiene también decenas de aplicaciones
complementarias como los navegadores, los reproductores de medios, los programas
simples de edición, los programas de redes, las herramientas de gestión de sistemas, y
similares, cada uno de los cuales a su vez consiste de diez o más archivos.
Cada uno de los archivos en todos estos programas, incluyendo los cientos de
archivos en el sistema operativo, tiene que estar construido de decenas o cientos
o aún miles de archivos. Cada uno de los archivos fuentes usados para construir
los programas y el sistema operativo contiene cinco, diez, o aún cien unidades
discretas de código, funciones u objetos dependientes del lenguaje de
programación. Cada una de esas unidades discretas de código es potencialmente
e individualmente modificable en el transcurso de un proyecto. Cada
modificación a una de esas unidades crea una versión distinta de esa unidad. Sólo
una versión de cualquier unidad puede ser incluida en un objeto individual de
pruebas. La gestión de configuración, realizada correctamente, debe gestionar esa
complejidad.
La gestión del testware y los resultados. Después de todo, los casos de prueba, los datos de
prueba, los guiones de prueba y todos los otros documentos similares tienen versiones que
están usadas. Tenemos que saber cuál versión del testware fue usada para ejecutar las
pruebas, si tenemos que decir por seguro lo que los resultados de las pruebas significan—y
lo que ellos no significan.
La gestión de los objetos de pruebas, que ha sido probada. Para que los resultados de las
pruebas sean significativos y escrutables hasta el nivel de los ítems individuales, tenemos
que saber la versión de cada unidad que haya estado presente en un objeto particular de
pruebas. Tenemos que ser capaces de relacionar cada ítem que hemos probado hacia atrás a
los componentes conocidos del sistema, de versiones conocidas.
La entrega de una versión única y conocida del objeto de prueba. Nuevamente, para ser
capaz de comprender el significado de los resultados de las pruebas, tenemos que ser
capaces de entregar una versión de las pruebas en el laboratorio de pruebas.
Ahora, esta clase de comprensión a detalle no es algo que pasa por accidente.
Tiene que ser planificado con anticipación. De este modo, durante la
planificación del proyecto y de las pruebas, los procedimientos de la gestión de
configuración e infraestructura (herramientas) deben ser seleccionados,
documentados e implementados, de manera que no ocurran sorpresas en el
momento de la ejecución de las pruebas.
¿Entonces, cuáles son las tareas clave de la gestión de configuración desde el punto de vista
de las pruebas?
Tenemos que ser capaces de guardar y controlar el acceso a los ítems que componen el
sistema. Este elemento de la gestión de configuración es llamado también control del
código fuente, sin embargo, como puede suponer de la siguiente figura, esta tarea va más
allá que sólo el código.
Porque tenemos que saber cuáles ítems de prueba estamos probando, el proceso de gestión
de configuración debe ser capaz de identificar y documentar los ítems sometidos al control.
La gestión de versión de las pruebas es el proceso de transformar los ítems de pruebas que
componen el sistema sometido a pruebas en un objeto de pruebas y luego transferir e
instalar ese objeto de pruebas en el entorno de pruebas.
El proceso de gestión de versión de las pruebas debe especificar cuidadosamente cómo las
siguientes tareas serán realizadas, quién qué papel toma y quién es responsable.
Primeramente, debemos tener algún tipo de proceso para determinar cuál objeto u objetos
de pruebas deben ser liberados para las pruebas y con qué frecuencia. ¿Debe pasar esto
semanalmente? ¿Diariamente? ¿Por horas? ¿Cada vez que le parezca a alguien?
Cuando una versión nueva del objeto de pruebas—a menudo denominada una
construcción—tiene que ser instalada en el entorno de pruebas, ¿Cuál es el proceso para
aplicar ese objeto actualizado de pruebas? ¿En otras palabras, cómo es instalada esa nueva
construcción?
Algunas veces una nueva compilación crea problemas en el entorno de pruebas los cuales
son suficientemente serios para justificar el retiro de ese objeto de pruebas. ¿Cómo
retiramos una construcción deficiente e instalamos una que funcione o volvemos a una
construcción anterior—pero que funcione?
Porque las pruebas deben ocurrir contra una versión conocida de la construcción
o el objeto de prueba, ¿Cuál es el proceso utilizado para asignar un nombre único
a cada construcción? Además, ¿De cuál forma interrogan los probadores a la
construcción para preguntar qué nivel de versión o de revisión es?
Note que ésta es una compleja delegación de responsabilidades. La definición clara de los
roles y las responsabilidades para cada paso es un deber.
Otra plantilla en el estándar IEEE 829 para la documentación es el informe de la
transmisión de los ítems de pruebas. Es el único documento en ese estándar el cuál debe ser
creado casi siempre por alguien diferente a un probador. La idea es que el equipo de
ingeniería de versión creará este documento y lo enviará al probador junto con el objeto de
prueba.
Un informe de la transmisión de los ítems de pruebas describe los ítems que deben ser
entregados para las pruebas. La plantilla del estándar IEEE 829 para los informes de la
transmisión de los ítems de pruebas incluye las secciones siguientes:
Los informes de la transmisión de los ítems de pruebas son comúnmente llamados notas de
versiones. A menudo, las notas de versiones sólo incluyen esta información y con
frecuencia son documentos informales. El nivel de formalidad debe aumentar tanto como la
complejidad—y así la probabilidad de los errores en la realización de una versión de
pruebas—crece.
5.4.1 Ejercicios
Ejercicio 1
Identificar los principales ítems que usted piense que necesitarían gestión de configuración
para Omninet.
Argumente.
Para ilustrar, por qué todo necesita gestión de configuración, considere esta anécdota. En un
proyecto, ejecutamos pruebas de seguridad de un centro de datos durante las pruebas
tempranas. Esa prueba reveló una lista de problemas, los cuales fueron entregados al
desarrollo. Después, cuando el centro de datos había crecido, nosotros repetimos las
pruebas. Cada pieza del equipo que estaba en el centro de datos, cuando la primera prueba
fue ejecutada, pasó la prueba. Cada nueva pieza del equipo falló, más exactamente de la
misma manera que el equipo original la tuvo la primera vez. La causa de los problemas, en
todos los casos, no fue el software personalizado e instalado en los servidores, sino las
opciones de configuración del sistema estándar las cuales no fueron correctamente
definidas por los administradores del sistema.
LO-5.5.1 Describir un riesgo como un problema posible que amenazaría el alcance de uno
o más objetivos del proyecto de los interesados del negocio. (K2)
LO-5.5.2 Recordar que los riesgos son determinados por medio de la probabilidad (de
ocurrencia) y el impacto (el daño que resulta si es que ha ocurrido). (K1)
LO-5.5.5 Describir y utilizar ejemplos, cómo el análisis y la gestión de riesgos pueden ser
utilizados para la planificación de pruebas. (K2)
En el capítulo 4, introducimos la idea de las pruebas como una forma de gestión de los
riesgos del producto o la calidad.
Recuerde que la plantilla del plan de pruebas IEEE 829 nos pide identificar y evaluar no
sólo los riesgos del producto, sino que también los riesgos del proyecto, específicamente
aquellos riesgos del proyecto que pondrían en riesgo nuestra aptitud de realizar el
subproyecto como planificado.
De este modo, para descubrir los riesgos del esfuerzo de las pruebas, pregúntese
y pregunte a otros interesados del negocio:
¿Qué podría salir mal en el proyecto que retrasaría o invalidaría su plan y/o estimación de
pruebas?
¿De qué tipo de resultados inaceptables de las pruebas se preocupa usted o se debe
preocupar?
Por cada riesgo del proyecto—o de hecho cualquier riesgo—tiene cuatro opciones:
Una opción es la mitigación. Las acciones de mitigación son pasos preventivos que reducen
la probabilidad o el impacto de un riesgo antes de que llegue a ser un evento o resultado
real no deseado.
Otra opción es la contingencia. Las acciones de contingencia son pasos planificados con
anticipación o reactivos que usted tomará para reducir el impacto de este evento o
resultado, si el riesgo se convierte en un evento o resultado real no deseado. Note que las
acciones de contingencia no pueden reducir la probabilidad, porque asumimos que el
evento o resultado no deseado ha ocurrido ya.
Otra opción es la transferencia. La transferencia es básicamente una acción antes del evento
en alguna otra parte para aceptar las consecuencias si el evento o el resultado no deseado en
realidad ocurren. La clave de la transferencia es que la parte que acepta tiene que aceptar
ambas consecuencias antes que el evento ocurra y si éste realmente ocurre.
Una opción final es de aceptar o ignorar el riesgo. Aquí no hacemos nada acerca del evento
o resultado no deseado de antemano, lo cual es lo mejor si tanto la probabilidad como el
impacto ¡son bajos!
Una forma de transferencia, la opción de gestión de los riesgos más típica en la vida diaria,
es la compra de seguros. Sin embargo, en la mayoría de los proyectos de software o
sistemas, esta opción no está disponible usualmente. Tome en cuenta que cuando se compra
un seguro, se paga a algún tercero para aceptar alguna de las consecuencias, usualmente las
financieras.
¿Cuáles son los riesgos de proyecto típicos para las pruebas? ¿Cuáles pasos de mitigación
y/o contingencia podemos tomar para controlarlos?
Ampliamente hablando, ¿Cuáles son algunos otros tipos de riesgos de proyecto para las
pruebas?
5.5.1 Ejercicios
Ejercicio 1
Evaluar la probabilidad y el impacto de cada riesgo en una escala de tres puntos (Alto,
Medio o Bajo).
De los riesgos que ha identificado, elija uno o dos pasos apropiados que deben ser tomados
para gestionar el riesgo.
Argumente.
Contingencia: Diseñar “puntos de recuperación” en las pruebas donde las pruebas pueden
ser iniciadas o continuadas, si fueron bloqueadas en algún otro lugar.
Contingencia: Minimizar las dependencias entre las pruebas y todo los componentes para
evitar mucho “daño colateral” cuando una prueba debe ser actualizada.
Riesgo medio: El soporte del entorno de las pruebas es poco fiable. El entorno es
complejo, que consiste de tres subsistemas principales muy diferentes.
Mitigación: Definir el apoyo de las prioridades para el equipo de pruebas durante la prueba
de sistema.
Contingencia: Minimizar las dependencias entre las pruebas y todas las componentes para
evitar un “daño colateral” cuando una prueba sea bloqueada debido a las cuestiones de
disponibilidad del entorno.
LO-5.6.2 Escribir un informe de incidencia que cubre la observación de una falla durante
las pruebas. (K3)
Esta sección, Gestión de Defectos o Incidencias, cubrirá los siguientes conceptos clave:
Esa es la suposición más segura para un jefe de pruebas. Porque la comunicación escrita
más visible, que un probador se dedica a escribir, es un informe de defecto, conviene que el
jefe de pruebas enseñe esta habilidad. Conviene que el probador aprenda esta habilidad.
Aquí está el proceso de diez pasos que utilizamos para entrenar a los probadores a escribir
buenos informes de defectos. Ha funcionado bien para nosotros.
Revisemos estos pasos con más detalle. Sin embargo antes que entremos a detalles, déjenos
apuntar que no estamos introduciendo un estilo o una guía de contenido aquí. Buenos
informes de defectos acerca de un problema se pueden diferenciar en estilo y contenido, y
eso está bien. Una de las grandes cosas acerca de escribir es que hay muchas maneras para
contar la misma historia y llegar al mismo punto. La creatividad agobiante no debería ser
una meta de los estándares para los informes de los defectos—o algunos otros productos del
trabajo que son creados por las pruebas.
Cuando haga el seguimiento a los casos de prueba escritos, debe estar listo para expandir el
caso de prueba cuando sea apropiado. A menudo le decimos a los probadores que el caso de
prueba es un mapa de caminos a lugares interesantes, así que cuando llega a algún lugar
interesante, pare y mire a su alrededor. Esta instrucción embebe la esencia de las pruebas
exploratorias aún dentro del método de pruebas más automatizado.
Cuando ejecute una prueba, tenga los resultados esperados en mente. Si algunos resultados
esperados son escritos en el caso de prueba, por supuesto, compruébelos. Sin embargo,
algunas pruebas revelarán comportamientos que mientras no fueron específicamente
puestos en la lista para que sean comprobados en el caso de prueba escrito, pueden ser
problemáticos. Recuerde que el proceso de los informes de los defectos comienza cuando
los resultados esperados son diferentes a los observados, y esté alerta por lo inesperado.
Sobre todo, la ejecución de una prueba es una tarea que necesita que su cerebro esté activo
en todos los momentos. Las pruebas poco rigurosas resultan en informes de defectos poco
rigurosos.
No todas las fallas son reproducibles, no todas las fallas no reproducibles no son
importantes. De este modo, debemos comprobar siempre la reproducibilidad de la falla
como parte de la escritura de un informe de defecto. Pensamos que tratando de reproducir
la falla tres veces es una buena regla heurística.
Porque las fallas no reproducibles pueden ser importantes, asegure de informar acerca de
las fallas intermitentes, difíciles de repetir. Los problemas de rendimiento y de fiabilidad
son notoriamente difíciles de reproducir, pero esas fallas pueden causar verdaderos
problemas para los usuarios y clientes.
Habiendo intentado de reproducir la falla, ahora usted puede anotar la tasa de la incidencia
de fallas en su informe. Por ejemplo, puede decirle a la gente que usted vio el problema
solamente una vez en tres intentos. No solamente el cuerpo del informe de defecto debe
mencionar el hecho de que la falla es intermitente, sino que también el resumen debe
mencionar la intermitencia si existe.
Algunas veces, la prueba misma es el problema. De este modo, debe aislar las anomalías
observadas —discrepancias entre los resultados reales y los esperados—antes de la decisión
de que un verdadero defecto existe.
Así, cuando reproduzca la falla, cambie las variables como las opciones o los datos de
configuración que podrían alterar el síntoma. Si es practicable, haga estos cambios uno por
uno para asegurar que sabe cuál cambio es importante.
¿Hay fallas relacionadas en el sistema sometido a pruebas? ¿Ocurre la misma falla en otros
módulos o lugares? ¿Hay más síntomas severos del mismo defecto?
Ahora, tiene que tener cuidado y evitar problemas confusos no relacionados. Eso puede
conducir a informar un comportamiento como un defecto duplicado cuando es en realidad
alguna cosa diferente. El mismo síntoma puede surgir de diferentes defectos.
Correctamente realizada, la generalización reduce el número de informes de defectos
duplicados y refina su comprensión de la falla—y su habilidad de describir esa falla en su
informe de defecto.
Si es posible, debería comparar los resultados que está viendo ahora contra los otros
resultados de las pruebas.
Si ha ejecutado pruebas de ejecución similares, examine los resultados para la misma falla.
¿Ha ejecutado usted u otro probador la misma prueba contra las versiones anteriores? ¿Ha
probado usted u otro probador condiciones similares, en otras pruebas, contra la misma
versión?
Si esta prueba ha fallado ahora, donde funcionó antes, ¿Es la falla una regresión?
Esa es una hipótesis razonable cuando un cambio introduce una falla no vista en
versiones anteriores.
Intente comparar, pero evite de pasar más tiempo en esto si la severidad y la prioridad de la
falla no garantiza el esfuerzo.
Un resumen debería poner una “línea de etiqueta” en cada informe. Ésta debería capturar la
falla y el impacto en el cliente, el usuario u otro interesado del negocio.
Una analogía útil para un resumen es el título del periódico. De hecho, una buena manera
de aprender cómo escribir buenos resúmenes es leer el título en un artículo de un periódico
y luego leer el artículo para ver si el autor ha capturado la esencia del artículo, lo cual es
realmente importante, en el título.
Esto es más difícil de lo que parece. Sin embargo, los probadores deben invertir tiempo en
escribir un buen resumen. Las ventajas de buenos resúmenes que incluyen la obtención de
la atención de la gerencia y la ayuda a establecer las prioridades de las correcciones de los
defectos. Adicionalmente, un buen resumen puede poner un nombre corto y descriptivo
acerca de un informe de defecto para los desarrolladores. Recuerde que el resumen es a
menudo la única parte del informe de pruebas que es leída en una reunión de la
clasificación de los defectos o del comité del control de cambios.
Un buen informe de incidencia o defecto debería tener tan pocas palabras como sea posible,
y no menos.
De este modo, debería leer nuevamente el informe y editarlo para eliminar las
palabras o pasos extraños. Evite ambos, los comentarios en secreto y la
conversación monótona acerca de puntos obvios. ¿Pregúntese a usted mismo, hay
algunos detalles o acciones irrelevantes?
Recuerde, durante las semanas y días finales de un proyecto, el tiempo de cada uno es
preciado. No pierda ese tiempo obligando a que la gente lea palabras sin sustancia e
innecesarias. Sin embargo, tampoco elimine algunos detalles esenciales.
Mientras que el informe de defecto es una importante manera en el cuál las pruebas
producen oportunidades a la organización de ahorrar dinero, recuerde de entregar malas
noticias gentilmente. Sea justo en el uso de sus palabras e implicaciones.
Los informes de defectos, una vez escritos, son parte del registro permanente del
proyecto. De este modo, uno nunca sabe quién leerá los informes. Algunas veces,
usted lamentará un comentario hecho en el calor del momento, especialmente si
después ese comentario es extraído fuera del contexto.
Finalmente, hay una regla que utilizamos en nuestros equipos de pruebas: Dos pares de
ojos. Antes que algún producto del trabajo sea considerado por terminado, alguien más
debe revisarlo.
Entonces, cada probador debería presentar cada informe de defecto a uno o más colegas del
equipo de pruebas para una revisión antes de que éste sea presentado. Esto no significa que
se tiene que pasar horas trabajando en cada informe, sino más bien se tiene que pedir a un
colega que compruebe el informe acerca de lo siguiente:
Recuerde que los informes de las pruebas son entregables clave del equipo de pruebas. En
nuestras evaluaciones para clientes, a menudo encontramos que los informes deficientes de
defectos son una mayor causa de fricción e ineficiencia. Entonces, el equipo de pruebas
debería presentar solamente los mejores informes posibles de los defectos, dadas las
restricciones del tiempo apropiadas para la prioridad y la severidad del defecto.
El estándar IEEE 829 para la documentación de las pruebas incluye una plantilla para los
informes de incidencias.
Ahora, antes que hablemos acerca de la plantilla, esté seguro de mantener en mente la
definición de una incidencia, una anomalía, una falla y un defecto. Una incidencia es una
situación, donde durante las pruebas, es necesaria investigación adicional. Lo que causa una
incidencia es a menudo una anomalía, una situación donde los resultados reales son
diferentes de los esperados.
Algunas veces, una anomalía resulta de una falla. Una falla ha ocurrido cuando el
ítem de prueba o el objeto de prueba se comportan incorrectamente debido a un
defecto. Sin embargo, algunas veces una anomalía resulta de los problemas con
el resultado esperado, los datos de prueba, el entorno de pruebas o las opiniones
de los probadores acerca de lo que es un comportamiento correcto.
Un resumen. Éste debería ser una línea, describiendo especialmente el impacto acerca de
los interesados de negocios.
Una descripción de la incidencia. Esto debería cubrir las entradas, los resultados esperados,
los resultados reales, la anomalía o las anomalías observadas en las entradas, la fecha y el
horario cuando las anomalías fueron observadas, el entorno de pruebas en el cuál las
anomalías fueron observadas, el identificador del caso de prueba o procedimiento que está
en progreso cuando las anomalías fueron observadas, la reproducibilidad de las fallas, quién
está informando la incidencia, y otros detalles como el impacto de la falla acerca de las
pruebas, acerca del proyecto, acerca del producto, acerca de los interesados del negocio, y
así sucesivamente.
Una vez que el informe de incidencia es reportado, éste va generalmente a través de alguna
secuencia de pasos hasta su resolución. Esta figura muestra un ejemplo de un posible
diagrama de estados para la gestión de incidencias desde su descubrimiento hasta su
resolución. Tome un momento para estudiar la figura.
Bueno, antes que dejemos esta cuestión de los informes individuales de incidencias, ¿Qué
otra información debería ser incluida en un informe de incidencia?
Ahora que hemos cubierto todas las plantillas de la documentación del estándar IEEE 829,
examinemos una descripción general de esto. Pase breves momentos estudiando esta figura
antes de que se lo describamos.
Note primero que, en el medio de la figura, mostramos la cronología del proyecto. Esto
comienza con la iniciación del proyecto, luego la planificación, luego el análisis, el diseño
y la implementación, luego la ejecución y el control de las pruebas y finalmente el cierre de
las pruebas. Estos incluyen los pasos del proceso de pruebas básico descrito anteriormente.
Esto pone cada documento del IEEE 829 en el contexto de un proyecto típico.
En el lado izquierdo de la figura, usted puede observar el rol asociado usualmente con la
producción de un producto del trabajo mostrado en la derecha.
Ahora, los probadores analizarán los requisitos, el diseño y los riesgos. Ellos elaborarán
acerca de las características que deben ser probadas e identificadas en los planes de
pruebas. Una o más especificaciones del diseño de pruebas se originarán de este análisis.
Como los probadores diseñan los casos de prueba, ellos vincularán esos casos de prueba
hacia atrás con las especificaciones del diseño de pruebas en cada especificación del caso
de prueba. Usando identificadores de los casos de prueba, como se mostró anteriormente en
este capítulo, harán posible ese vínculo. Las especificaciones del caso de prueba incluirán
información acerca de los ítems de pruebas y los entornos de prueba que deben ser
probados.
Las especificaciones del caso de prueba también incluirán los resultados esperados para los
casos de prueba.
Mientras que el probador ejecuta las pruebas, ellos registrarán los resultados de las pruebas
en los registros de pruebas. Los registros de pruebas registran los procedimientos de prueba
que están siendo ejecutados.
Durante la ejecución de las pruebas, el jefe de pruebas no solamente creará los registros de
las pruebas, pero también producirá uno o más informes de resumen de las pruebas. La
información en los registros de las pruebas hace referencia a los informes del resumen de
las pruebas. Los informes del resumen de las pruebas también están vinculados hacia atrás
con el plan de pruebas, basados en los ítems de pruebas, los criterios paso/falla de los ítems
y las tareas de pruebas planificadas y reales.
Durante el cierre de las pruebas, el jefe de pruebas podría producir un informe final del
resumen de las pruebas que resume los resultados de todo el período de la ejecución de las
pruebas.
Examine esta figura hasta que el estándar le sea claro, porque este estándar de la
documentación IEEE 829 es importante en los exámenes ISTQB Nivel Básico y Avanzado.
5.6.1 Ejercicios
Ejercicio 1
Trate de cubrir todos los puntos abordados en el estándar del informe de incidencia IEEE
829.
Argumente.
El primer problema es que el resumen está incorrecto. ¿Qué significa exactamente la frase
“demasiado tiempo”? La pregunta completa del impacto de negocios no es abordada y
necesita ser abordada por la especificación acerca de cuánto tiempo se está dando. Si el
sistema está dando 15 segundos en cada sesión, eso no es gran cosa. Si son 15 minutos,
entonces sí. Este tema es cubierto después en el cuerpo del informe del defecto, pero
muchos sistemas de seguimiento de defectos producen un informe de resumen, a menudo
utilizado en las reuniones acerca de la clasificación de los defectos, en el cual sólo es
mostrado el resumen de los mismos. Un resumen bien escrito describe el problema y su
impacto.
El cuerpo del informe también plantea más preguntas que las que responde. ¿Cuántos
períodos diferentes de tiempo fueron intentados? ¿Hay alguna relación entre el número de
períodos comprados y el tiempo dado? ¿Cuántas veces intentó el probador este
experimento? ¿Cuáles otros pasos para el aislamiento intentó el probador? Un buen informe
de defecto deja al lector con respuestas, no con preguntas.
Riesgo de proyecto: Un riesgo relacionado con la gestión y el control del proyecto (de
pruebas), p.ej. la falta de personal, los plazos estrictos, los requisitos que cambian, etc.
Véase también riesgo.
Capítulo 6
Soporte de Herramientas para las Pruebas
“La ciencia no es perfecta, con frecuencia se utiliza mal, no es más que una herramienta,
pero es la mejor herramienta que tenemos, se corrige a sí misma, está siempre
evolucionando y se puede aplicar a todo. Con esta herramienta conquistamos lo
imposible”
LO-6.1.1 Clasificar los diferentes tipos de herramientas de pruebas de acuerdo con sus
propósitos y las actividades del proceso de pruebas básico y el ciclo de vida de software.
(K2)
Esta sección, Tipos de Herramientas de Pruebas, cubrirá los siguientes conceptos clave:
Las herramientas de pruebas apoyan varias actividades que ocurren durante las pruebas.
Algunas herramientas son simplemente una ayuda para las pruebas. La hoja de cálculo es el
ejemplo más común de una herramienta de pruebas en este sentido.
Las herramientas sirven para varios propósitos durante las pruebas, en algunos casos para
múltiples propósitos. Esto incluye lo siguiente:
Las herramientas pueden automatizar las actividades que requerirían mucho tiempo,
atención, esfuerzo y recursos si las personas tuvieran que realizarlas manualmente. Un
ejemplo de esto es la comprobación de las violaciones de los estándares de codificación
utilizando una herramienta de análisis estático.
Analizador estático: Una herramienta que lleva a cabo el análisis estático. Note que este
término no es enunciado específicamente para esta sección pero está incluido aquí porque
es un sinónimo de herramienta de análisis estático.
Las herramientas pueden incrementar la fiabilidad de las pruebas. Por ejemplo, las
herramientas pueden automatizar grandes comparaciones de datos cuando los archivos o las
tablas de la base de datos están involucrados en las pruebas y las herramientas pueden
simular los comportamientos como los flujos de entradas.
Hay un gran número de herramientas de pruebas disponibles, lo cual es tanto una bendición
como una maldición, por razones que usted observará a la medida que continúe a través de
este capítulo. Para ayudar a comprender el rango del soporte de las herramientas de
pruebas, en el programa de estudios Nivel Básico, clasificamos y tratamos las herramientas
de pruebas en base a las principales actividades de las pruebas, que son cubiertas. En
algunos casos, las herramientas tienen la meta claramente en una sola actividad, pero
algunas herramientas apoyan múltiples actividades. Es posible que encuentre que algunas
herramientas de algunos proveedores agrupadas en un paquete, que apoya un rango de
actividades.
Es posible que encuentre gente que clasifica o se refiere a las herramientas en base al
propósito de la herramienta, la tecnología utilizada y la forma de adquisición de la
herramienta. Sin embargo, en cuanto a las formas adquisición de las herramientas
encontrará a menudo opciones disponibles como comerciales, libres, de código abierto y
shareware.
Algunas herramientas son principalmente utilizadas por los desarrolladores, y eso usted
observará mientras va a través de la clasificación de las herramientas en los párrafos
siguientes.
Una palabra popular y que está de moda acerca de las herramientas de pruebas es
el término “framework de pruebas”. Es posible que escuche esto de los expertos
en la automatización de pruebas y la literatura del marketing de los proveedores
de herramientas. Como muchas palabras famosas, ésta ha sido sobrecargada con
significados. Entonces, algunas veces la gente utiliza “framework de pruebas”
para querer decir una biblioteca reutilizable y extensible de pruebas que los
probadores pueden emplear para construir herramientas sofisticadas de pruebas,
e, imprecisamente, este significado es también referido como “arnés de pruebas”.
Un “framework de pruebas” puede significar un tipo de método del diseño de la
automatización de las pruebas, así como las pruebas dirigidas por los datos y por
las palabras clave. Finalmente, hay el significado más amplio del “framework de
pruebas”, el cuál es el proceso general de la ejecución de las pruebas. En este
libro y el programa de estudios Nivel Básico, el término “framework de pruebas”
significa ya sea una biblioteca reutilizable, extensible o un método del diseño de
la automatización de las pruebas.
Las herramientas del análisis estático son principalmente utilizadas por los desarrolladores
y tienen las siguientes funciones:
Generar las entradas de las pruebas o las pruebas reales de los requisitos, de la
interfaz gráfica del usuario, de los modelos del diseño y del código.
Generar los resultados esperados (aunque la fiabilidad de tales oráculos de pruebas
es a menudo limitada).
Generar frameworks, plantillas y stubs de pruebas.
Herramienta de diseño de pruebas: Una herramienta que apoya la actividad del diseño de
pruebas por medio de la generación de entradas de pruebas de una especificación que puede
ser contenida en un repositorio de una herramienta CASE, p.ej. una herramienta de gestión
de requisitos, de las condiciones de pruebas especificadas contenidas en la misma
herramienta o del código.
Ejecutan las pruebas, en otras palabras, envían las entradas para el guión automatizado y
comparan los resultados reales con los esperados.
La reproducción y captura pueden ser útiles durante las pruebas exploratorias para grabar
las pruebas que ocurrieron.
Los arneses de pruebas, los frameworks y los simuladores tienen las siguientes funciones:
Comprobar los archivos, las bases de datos o los resultados de las pruebas contra las
expectativas, ya sea durante la ejecución de las pruebas o después.
Estos pueden incluir un oráculo automatizado de pruebas en vez de la comparación
contra líneas bases estáticas.
Se los puede hacer más inteligentes programándolos para manejar las variables
dinámicas como las fechas y los horarios o para ignorar el orden de los registros
cuando el orden de la posición en los informes o consultas es ambiguo.
Las herramientas de análisis dinámico son a menudo utilizadas para comprobar las
dependencias de tiempo o las fugas de memoria.
Por supuesto, los probadores también utilizan las hojas de cálculo (¡muchas de ellas!) y
bases de datos.
6.1.1 Ejercicios
Ejercicio 1
Haga una lista de los tipos de herramientas abordados en esta sección, los cuales piensa
usted que serian útiles para Omninet.
Argumente.
Muchas de las herramientas abordadas en la sección previa serian útiles para Omninet:
(Pruebas) Dirigidas por datos (“data driven”): Una técnica de guión que guarda las
entradas de las pruebas y los resultados esperados en una tabla o una hoja de cálculo, de tal
forma que un sólo guión de control pueda ejecutar todas las pruebas en la tabla. Las
pruebas dirigidas por datos son a menudo utilizadas para apoyar la aplicación de las
herramientas de ejecución de pruebas así como las herramientas de captura/reproducción.
[Fewster and Graham] Véase también las pruebas dirigidas por palabras clave.
(Pruebas) Dirigidas por palabras clave (“key word driven”): Una técnica de guión que
utiliza archivos de datos para contener no sólo datos de prueba y resultados esperados, sino
también palabras clave relacionadas con la aplicación que está siendo probada. Las palabras
clave son interpretadas por guiones especiales de apoyo que son invocados por el guión de
control para la prueba. Véase también pruebas dirigidas por datos.
Esta sección, Uso efectivo de herramientas, los beneficios y los riesgos potenciales, cubrirá
los siguientes conceptos clave:
Posibilidad reducida de rehacer los trabajos. Hay pocas cosas más pesadas que las
pruebas manuales de regresión una vez que la prueba ha sido ejecutada dos o tres
veces. Este tedioso trabajo conduce a equivocaciones.
Coherencia y repetibilidad mejorada. Porque la gente tiende a cometer errores
cuando ejecuta las pruebas nuevamente o cuando trata de crear condiciones precisas
de pruebas cada vez, las herramientas pueden ayudarle a ejecutar exactamente las
mismas pruebas.
Evaluación objetiva. Los criterios de medición son precisos para una prueba
automatizada—Estos deben ser así. Esto es verdad especialmente para las pruebas
de cobertura, rendimiento y fiabilidad.
Informes simplificados. Las pruebas automatizadas recolectan los registros
estandarizados que fácilmente pueden ser extraídos, analizados y manipulados.
Expectativas poco realistas: Éste es el más grande. La gente espera que las
herramientas de automatización de pruebas les resuelvan todos sus
problemas, incluyendo las cuestiones del tiempo y dinero. Eso no
sucederá.
Subestimación del tiempo, el costo y el esfuerzo del desarrollo, la
ejecución y el mantenimiento. Es costoso llegar a un punto de
automatización significativa de las pruebas. La mayoría de las
organizaciones que tratan de hacerlo así, tienen muchos problemas para
lograr eso. Muchas de estas organizaciones claudican antes de llegar allí
porque no presupuestaron lo suficiente para eso. En otros casos, la
introducción inicial es alcanzada, pero los costos de ejecución y
mantenimiento de las pruebas son subestimados a largo plazo,
conduciendo al abandono de las pruebas automatizadas. Aún otra
posibilidad es que las implicaciones de los cambios en el proceso de
pruebas y la necesidad para la mejora continua en la utilización de la
herramienta son subestimados, lo cual puede conducir ya sea al abandono
o a retornos por debajo de lo óptimo de la utilización de las pruebas
automatizadas.
Utilización de la herramienta para pruebas inadecuadas. Algunas pruebas
no son simplemente automatizables. Algunas podrían ser realizadas mejor
manualmente. Algunos probadores consideran las herramientas de pruebas
automatizadas como un substituto para un buen diseño de pruebas, lo cual
no es la manera correcta de pensar acerca de las herramientas de pruebas
automatizadas.
Gestión incorrecta del control de versión y configuración de los varios
productos del trabajo. Mientras que puede ser complicado y difícil de
gestionar un gran conjunto de productos del trabajo para los casos de
prueba manuales, las pruebas automatizadas son típicamente más difíciles.
Básicamente, las pruebas automatizadas son una forma de software,
entonces todas las mejores prácticas de la gestión de configuración
tratadas en el capítulo 5 aplican.
Fracaso en el control de las cuestiones de relaciones e interoperabilidad
entre las herramientas críticas. Un conjunto completo de herramientas de
pruebas, pueden incluir las herramientas de gestión de requisitos, las
herramientas de control de versión y las herramientas de seguimiento de
defectos, posiblemente de múltiples proveedores. Puede ser complicado de
hacer funcionar estas herramientas juntas.
La herramienta huérfana o la herramienta descuidada. El proveedor de
herramientas podría terminar el negocio, retirar la herramienta, o vender la
herramienta a otro proveedor. Alternativamente, el proveedor de la
herramienta simplemente podría ignorar la herramienta, dar un soporte
inadecuado, pocas e infrecuentes actualizaciones y pocas o nada de
correcciones de defectos. Los mismos riesgos aplican para las
herramientas de código abierto, si la comunidad alrededor de la
herramienta se disuelve o se vuelve inactiva.
El riesgo del lado ciego. Cuestiones imprevistas pueden surgir totalmente,
como la incapacidad de ser compatible con una nueva plataforma.
Si usted se enfoca sólo en la ejecución de las pruebas, la automatización de las pruebas
parece muy eficiente, pero no se olvide que las pruebas automatizadas tuvieron que
ser automatizadas por alguien para ser automatizadas
Por un lado, no importa lo que cualquier folleto ilustrado o vendedor amable le diga,
recuerde que la automatización de pruebas es normalmente desarrollo de software. Usted
está programando una computadora para que se pruebe así misma o pruebe otra
computadora. Ése es un proceso no trivial que requiere mucho tiempo, habilidad y dinero.
Otro vacío emerge del nombre. Cuando piensa en “automatización de pruebas” puede que
piense en la automatización del proceso de pruebas entero, desde la planificación pasando
por el análisis, el diseño, la implementación, la ejecución, el control hasta el cierre. Sin
embargo, lo que usualmente se automatiza es solamente la ejecución de las pruebas. De
hecho, es usualmente sólo una minúscula parte del proceso de la ejecución de pruebas, el
envío de las entradas y los eventos al sistema, la comparación de los resultados esperados
con los reales, y el registro de esa comparación. Todo el trabajo previo— el análisis, el
diseño y la implementación — no sólo es no automatizado, pero de hecho es la importante
labor que se necesita para automatizar. El trabajo posterior, especialmente el análisis de los
resultados no es automatizado. En realidad, la automatización, incorrectamente realizada,
puede complicar el análisis de las pruebas falladas y aumentar el número de pruebas
falladas.
Puede ver lo que cuesta, en promedio, US$ 100 por prueba para desarrollar las pruebas
automatizadas, mientras que las pruebas manuales cuestan sólo 10US$. Entonces, usted
invierte US$ 90 por prueba en promedio para automatizar.
Note que el costo de la ejecución de las prueba es menor para las pruebas automatizadas en
este ejemplo. La diferencia entre los costos de la ejecución de las pruebas automatizadas y
manuales es de donde el ROI se obtendrá. Ahorramos US$ 25 cada vez que ejecutamos una
prueba automatizada, en promedio, en este caso de estudio hipotético. Entonces, si
ejecutamos la prueba cuatro veces, tenemos de vuelta nuestros US$ 90, mas US$ 10 de
dividendos.
Una vez más, cuanto más grande el número de pruebas, mejor será la tendencia de los
beneficios. Eso es porque la ejecución de las pruebas automatizadas incluye un componente
de costo fijo bastante grande asociado con la instalación del entorno y los datos y el
lanzamiento de las pruebas. Cuantas más pruebas tengamos que ejecutar, más pruebas
podemos extender a través de estoscostos fijos.
Ahora, aquí viene el elemento que mucha gente olvida—para su gran perjuicio—
cuando se automatizan las pruebas. Las pruebas automatizadas deben ser
mantenidas a medida que el sistema evoluciona. Note en nuestro ejemplo, que
gastamos US$ 20 más por prueba para el mantenimiento de la prueba
automatizada.
Si esto solo ocurre una vez cada 12 o 18 meses por prueba, en promedio, no es gran cosa.
Pero, ¿Supone usted que ocurre cada vez que tenemos que ejecutar las pruebas? En ese
caso, tomaría dieciocho ejecuciones de pruebas para alcanzar el equilibrio. Esas son
muchas ejecuciones de pruebas. Podría tomar años para obtener un ROI positivo.
En algunos casos, esto se pone tan difícil que la organización tiene un ROI negativo. En
otras palabras, los costos actuales del mantenimiento devoran más dinero que lo que es
ahorrado por la ejecución. Entonces, considere la estabilidad del sistema que intenta probar
con las herramientas automatizadas. Si está cambiando muy rápidamente, no tendrá un ROI
positivo a causa de los costos de mantenimiento. También, aún para los sistemas de
moderado a lento cambio, usted también necesita un framework de pruebas bien diseñado y
mantenible. Es por esto que necesita probadores hábiles involucrados en la automatización
de pruebas.
Aún si tiene un ahorro neto del esfuerzo, recuerde que las pruebas no tienen valor por sí
mismas. Las pruebas sólo tienen valor cuando ayudan a la organización a alcanzar un
objetivo valioso. Si está automatizando las pruebas de regresión, entonces debe haber
suficientes riesgos altos de regresión para justificar la repetición de esas pruebas.
Simplemente porque puede automatizar y repetir las pruebas una y otra vez con un ahorro
neto de esfuerzos no significa que usted debería automatizar. Las herramientas de pruebas
son solo eso—herramientas—y la automatización de pruebas es una técnica. Las
herramientas de pruebas y la automatización de pruebas no son estrategias de pruebas,
aunque mucha gente las confunde por tales.
Para alcanzar un retorno de inversión positivo de las pruebas automatizadas, tenemos que
automatizar las pruebas que pueden ser automatizadas.
Operaciones y mantenimiento.
Configuración y compatibilidad.
Control de errores y recuperación.
Localización.
Usabilidad.
Instalación y ajustes.
Documentación y ayuda.
De nuevo, generalmente, cualquier prueba que requiera precisión exquisita o la cuál deba
ser repetida muchas veces, esa es la prueba más apropiada para las pruebas automatizadas.
Esas pruebas incluyen típicamente lo siguiente:
Regresión y confirmación.
Pruebas de mono (o aleatorias).
Carga, volumen y capacidad.
Rendimiento y fiabilidad.
Cumplimiento de estándares.
Caja blanca, especialmente de unidad, componente e integración basadas en un API.
Complejidad estática y análisis de código.
Funcionales.
Casos de uso o escenarios de usuario.
Interfaz de usuario.
Control de fechas y horarios.
Aquí hay algunas pautas para el éxito con las herramientas de ejecución de pruebas.
En vez de eso, utilice frameworks de pruebas dirigidas por datos que separan las entradas
(los datos) de los procedimientos (los guiones) que utilizan los datos. Los expertos en
automatización pueden construir el framework y los guiones, mientras que los que no son
expertos en automatización pueden crear los datos de prueba y los resultados esperados.
Esto funciona.
En algunos casos, las técnicas dirigidas por los datos, en vez de la codificación en duro de
las combinaciones de datos en una hoja de cálculo, son capaces de generar datos utilizando
algoritmos y parámetros configurables en el tiempo de ejecución. Como ejemplo de esto,
considere una herramienta que utiliza un algoritmo para generar identificadores aleatorios
de usuarios. Un punto importante aquí es que cuando utilice los valores generados
aleatoriamente, asegúrese de utilizar un parámetro configurable en el proceso de generación
aleatoria, así que pueda recrear el patrón exacto de las entradas. De otra manera la
reproducción de las fallas puede ser difícil.
Tanto para los métodos dirigidos por datos y los dirigidos por palabras clave, la gente que
quiere construir el framework necesita experticia técnica en el lenguaje de guión. Es la
mejor práctica para separar los expertos del dominio, quienes van a construir las pruebas,
de los expertos de automatización quienes construyen las frameworks, porque cada uno
posee un conjunto de habilidades única y especial. A menudo es difícil de encontrar a
alguien que sea un experto tanto en el dominio que está probando como en la construcción
de frameworks de automatización de pruebas.
Como con algunas formas de pruebas, usted necesita un oráculo de pruebas. Una manera de
hacerlo así, es de crear una línea de base, la cual es donde los resultados esperados son
generados de la aplicación, verificados manualmente (y tal vez corregidos) y guardados
para una comparación posterior. Otra opción es la forma automatizada de la generación de
los resultados esperados mientras las pruebas se están ejecutando.
Aquí hay algunas pautas para el éxito con otros tipos de herramientas de pruebas:
Cuando se está tratando de crear pruebas de rendimiento o fiabilidad, recuerde que estas
pruebas y estas herramientas de pruebas de rendimiento requieren experticia en el
rendimiento para diseñar las pruebas e interpretar los resultados.
Cuando se están utilizando herramientas de análisis estático para hacer valer los estándares
de código, utilice una introducción en fases para el código existente.
Una vez que el código está terminado y todas las pruebas unitarias pasan, el
programador presenta su código, sus pruebas de unidad y sus resultados de las
pruebas de unidad a su líder del desarrollo para la revisión. El revisa estos ítems,
y, si son aceptables, los aprueba para una incorporación (“check-in”) oficial al
repositorio de código fuente, con una bandera que indica que están terminados.
(A propósito, ¿Debería haber incluido este proceso más gente, incluyendo una
representación del equipo de pruebas? Si. Sin embargo, eso estaba más allá del
nivel de madurez de esta organización en ese momento).
6.2.1 Ejercicios
Ejercicio 1
Argumente.
Por supuesto hay herramientas comerciales para esto, así como Segue y las
ofertas de Mercury. También existen opciones de software libre.34
A largo plazo, quisiéramos automatizar las pruebas de punta a punta por medio
de la extensión de las herramientas de interfaz gráfica de usuario — GUI — en el
quiosco y el centro de llamadas para coordinar con cada uno. Nuestros asociados
y nosotros hicimos esto para un cliente en un proyecto, donde teníamos un
servidor de respuesta de voz interactiva, dirigido por una herramienta casera de
pruebas de telefonía y un centro de llamadas dirigido por el producto QA
Partner35 de Segue (luego de SilkTest) con un ejecutivo conectándolos a ambos,
como se ve en la figura 6.4.
Figura 6.4: Una arquitectura del sistema de pruebas automatizadas
coordinando las pruebas de punta a punta.
LO-6.3.2 Formular las metas de una prueba de concepto para la evaluación de herramientas
y de una fase piloto para la implementación de herramientas. (K1)
LO-6.3.3 Reconocer esos otros factores necesarios para el buen soporte de herramientas
más que simplemente la adquisición de una herramienta. (K1)
Esta sección, Introducción de una herramienta en una organización, cubrirá los siguientes
conceptos clave.
Cualquier decisión para la automatización de las pruebas es una gran decisión. Ésta
cambiará la manera en la cual su proceso de pruebas funciona. En el caso de éxito, la
automatización de las pruebas le permitirá alcanzar objetivos actuales—y tal vez nuevos—
del equipo de pruebas en una manera más efectiva y eficiente. La selección de la
herramienta correcta es una gran parte de la automatización exitosa.
Primero, debería realizar una evaluación realista de la madurez del proceso de pruebas, el
proceso de desarrollo de software en general y la organización como un todo. ¿Cuáles son
las fortalezas y debilidades? ¿Cuáles son las oportunidades para el proceso de pruebas, el
proceso de desarrollo y la mejora organizacional creados por la utilización de las
herramientas de pruebas automatizadas? ¿Puede usted y su organización explotar
completamente esas oportunidades? Usted debería tener respuestas claras y realistas para
esas preguntas.
En este punto, es buena idea de llevar a cabo una prueba de concepto de una o más
herramientas. Esto involucra la utilización de las herramientas candidatas de pruebas para
determinar si ellas pueden probar el sistema sometido a pruebas efectivamente y
eficientemente en la infraestructura actual. Si no es posible, ¿Hay cambios factibles y
prácticos para aquella infraestructura que resolverían los problemas? ¿Puede lograr todos
sus objetivos para la automatización con esta herramienta, o tendrá que comprometerse con
algunas de éstas? Si es así entonces, ¿Son aquellos compromisos aceptables? Idealmente
usted realizaría esta prueba de concepto para todas las herramientas de su lista corta,
aunque muchas organizaciones lo encuentran demasiado laborioso. Por lo menos realice
esta prueba de concepto con la mejor herramienta de su lista corta antes de comprometerse
con esa herramienta. Muchos equipos han aprendido la sabiduría de un viejo cliché “Cásate
demasiado pronto y te arrepentirás demasiado tarde, después de un casamiento a la fuerza
con la herramienta de pruebas”
Finalmente, comprenda el caso del negocio, que lo hemos tratado en la sección previa.
Asegúrese de saber cómo establecerá el punto de equilibrio (“breakeven”) — el momento
cuando los beneficios acumulados hayan alcanzado el costo de la inversión — y cómo
medirá y creará informes acerca del retorno de inversión en el tiempo. Recuerde que dos
declaraciones de gestión claves aplican: Lo que es medido es realizado y lo que es validado
es financiado. Si no puede medir el valor de la automatización de pruebas, pronostique
¿Cuál es un candidato para el desfinanciamiento cuando el dinero no alcanza?
Un obstáculo para el éxito que a menudo encontramos con los clientes que tratan de
automatizar son los procesos de pruebas caóticos, reactivos y cortos de tiempo. Si cada día
es un nuevo día en su grupo de pruebas, y no puede predecir en lo que trabajará el próximo
día cuando se va a casa en la noche, no hay absolutamente ninguna razón para tratar de
automatizar. Recuerde, el ROI de la automatización viene de la repetición de las pruebas
una y otra vez. Entonces, primeramente tiene que tener el proceso de pruebas manual en
control y luego automatizar.
Ahora, el mayor obstáculo que encontramos con los clientes una y otra vez son las
expectativas poco realistas de la dirección de lo que la automatización producirá. Estas
expectativas nacen de dos factores principales. Uno es la frustración de la dirección con el
costo y la duración de la ejecución de las pruebas—a menudo erróneamente atribuido a los
probadores en vez de al gran número de defectos puestos en los objetos de prueba durante
los requisitos, el diseño y la implementación. El otro es el bombardeo de una exagerada
promoción de ventas y marketing en la conciencia de la ingeniería del software por los
vendedores de herramientas. Entonces, debe comunicar efectivamente los beneficios, las
limitaciones, el caso del negocio (incluyendo un modelo sólido del retorno de la inversión)
y los costos de la automatización. No comience a automatizar hasta que tenga un
financiamiento del negocio basado en expectativas realistas.
Adaptar la herramienta, los procesos y las prácticas para que se ajusten a su organización y
sus sistemas.
Mientras la automatización de pruebas puede hacer la vida de los probadores más fácil, las
pruebas automatizadas son complejas y a menudo bestias sensibles que proporcionan
resultados erróneos e inválidos si son utilizadas incorrectamente. Por lo tanto, proporcione
capacitación, entrenamiento y tutorías para los nuevos usuarios.
Para aquellos que utilizan las herramientas y especialmente aquellos que construyen los
casos de prueba y los frameworks de prueba, defina guías de uso de la herramienta. La
automatización de pruebas es desarrollo de software y el desarrollo de software sin
consistencia y diseño es un desastre.
Proporcione el soporte para el equipo de pruebas de las herramientas que utiliza. Como
mencionamos anteriormente cuando abordamos la selección de las herramientas, es donde
su plan entra en acción para la orientación y tutoría.
Sin embargo, el flujo de la información no es sólo hacia el exterior de los tutores a los
equipos que utilizan las herramientas. Debería recopilar las lecciones aprendidas de todos
los equipos que emplean las herramientas. Algunas veces a las organizaciones les gusta
tener un “comité de automatización” u otro equipo de toda la organización que se reúne
para compartir las mejores prácticas, historias de éxito y por supuesto los cuentos con
moraleja.
Una trampa común es la falta de una estrategia clara. Las organizaciones solo compran las
herramientas y después esperan que algo bueno ocurra. Esto no ocurre usualmente.
Como mencionamos antes, las expectativas poco realistas son un gran problema.
Encárguese de estos problemas donde existan.
Otra trampa es la falta de participación de los interesados del negocio. Esto no se refiere
sólo a los probadores, sino que a otros en los proyectos quienes serán afectados por las
pruebas automatizadas. El riesgo principal es la falta de participación durante el trabajo de
la automatización.
Cuando evalúe una herramienta, sea realista acerca de las habilidades de la gente
involucrada. No compre una herramienta que tiene problemas de usabilidad si tiene
probadores no técnicos quienes crearán casos de prueba y resultados esperados. La gente
frustrada comete errores, la gente frustrada no es productiva, y la gente frustrada habla mal
de la fuente de su frustración. ¿Por qué hacer la automatización más difícil de lo que ya
inherentemente es?
Como hemos mencionado antes, necesita tener un sistema estable para la exitosa
automatización de pruebas, pero mucha gente trata de automatizar un sistema
inestable sometido a pruebas. Esto usualmente fracasa.
Finalmente, hay la trampa de quedarse sin dinero antes de que los beneficios hayan
empezado a acumularse. Esto es a menudo—pero no siempre— asociado con la
subestimación del tiempo y los recursos necesarios. Sin embargo, en algunos casos la
dirección inconsecuente retira la aprobación del proyecto de automatización basada en el
cambio de prioridades. Es triste cuando esto ocurre, pero ciertamente ocurre.
Hemos hablado mucho de los puntos negativos asociados con la automatización de pruebas,
pero no porque no creamos en ésta. Creemos en ésta. RBCS/Business Innovations han
realizado decenas de proyectos de automatización de pruebas para clientes y estamos
orgullosos de realizarlos.
Sin embargo, nos gusta hacer proyectos que tengan éxito y no proyectos que
fracasan. Entonces, para asegurar que usted tenga éxito, construya un caso de
negocios de la automatización de pruebas, rompa los obstáculos, evite las
trampas de las herramientas de pruebas, realice un proyecto piloto y despliéguelo
incrementalmente. ¡Buena suerte!
Herramienta de pruebas de estrés: Una herramienta que apoya las pruebas de estrés.
Framework de pruebas unitarias: Una herramienta que proporciona un entorno para las
pruebas de unidad o componente en la cual un componente puede ser probado aisladamente
o con stubs y drivers adecuados. También proporciona otro apoyo para el desarrollador, así
como las capacidades de depuración.
6.3.1 Ejercicios
Ejercicio 1
¿Cuáles barreras debería superar para realizar un piloto con la herramienta contra el centro
de llamadas o el quiosco?
Argumente.
Por un lado, el centro de llamadas es un piloto de automatización atractivo por que puede
utilizar herramientas comerciales. Además, mientras que el riesgo de negocios es alto, el
riesgo técnico es relativamente bajo para el centro de llamadas, lo que significa que las
pruebas probablemente la mayoría de las veces pasarían y así son más eficientes para
automatizar. Ésta es la más costosa pero la menos riesgosa de las dos.
Por el otro lado, el quiosco es un piloto de automatización atractivo porque usted puede
utilizar herramientas libres, de código abierto, con cierto grado de personalización. El
riesgo técnico y de negocios son ambos altos, entonces la rentabilidad para la
automatización es clara y las pruebas revelarán defectos. Es la opción menos costosa,
ciertamente en cuanto a los costos fijos, pero esto es también más riesgoso por que las
herramientas de código abierto tienen menos antecedentes.
Personalmente, nosotros comenzaríamos con el quiosco. Una vez que tuviéramos las
pruebas automatizadas ejecutándose allí y hubiéramos demostrado la rentabilidad de la
automatización a través de los defectos encontrados y las ejecuciones rápidas de pruebas de
regresión, utilizaríamos esa historia de éxito para venderle un buen argumento a la
dirección acerca de las costosas licencias para las pruebas del centro de llamadas.
Las segundas dos barreras son cuestiones técnicas. Primero, es probable que Omninet esté
cambiando rápidamente en la interfaz del usuario. Entonces, quisiéramos realizar las
pruebas muy flexibles para esos cambios, aún en el riesgo de incrementar la probabilidad
de que se escapen defectos. Después de todo, estamos planificando realizar pruebas
exploratorias para asegurar que no se nos escape nada, así las pruebas automatizadas no
tienen que capturar cada tipo de defectos funcionales. Este método nos conduciría a
resolver también la cuarta barrera, la falta de un oráculo de pruebas completo. Dejaremos
de lado esta barrera utilizando un oráculo parcial.
Las trampas de las herramientas que hay que evitar incluyen en primer lugar la selección de
la herramienta equivocada. Especialmente con herramientas de código abierto, existe la
posibilidad de que un número de usuarios cada vez más escaso dejará a la herramienta
huérfana. Usted quisiera evaluar este riesgo, y asegurarse de que se siente cómodo
manteniendo la herramienta usted mismo si eso ocurre. Cuidadosamente evalúe la
funcionalidad, la usabilidad y la mantenibilidad de varias herramientas y reconsidere la
automatización completamente, si no puede encontrar una herramienta que va a satisfacer
las necesidades a largo y a corto plazo.
1. Alcance
Este documento especifica los requisitos de un grupo de quioscos para el acceso al Internet
denominado Omninet. Estos quioscos deberían proporcionar a los clientes que tengan
dinero en efectivo, tarjetas de crédito o tarjetas de débito el acceso simple, rápido y fiable al
Internet en lugares públicos en precios razonables por minuto de uso.
Para los propósitos de este proyecto, las siguientes abreviaciones son necesarias:
El primer conjunto de los 1.000 quioscos de Omninet debería funcionar, aceptar los pagos y
acceder al Internet en el tercer cuartal financiero.
Omninet debería proporcionar el acceso al Internet a los usuarios en los aeropuertos, los
centros comerciales, los teatros y otros lugares públicos.
3.1.1 Bienvenida
Entre las sesiones, cada quiosco de Omninet debería mostrar un mensaje de bienvenida
atractivo (véase el prototipo de la pantalla K.1).
3.1.2 Pago
Una vez que el usuario navega pasada la pantalla de Bienvenida, el quiosco debería dar al
usuario la opción de comprar un período de tiempo en la pantalla de Pago (Véase el
prototipo de la pantalla K.2). El quiosco debería vender períodos de tiempo en incrementos
de (5) minutos, hasta (1) hora.
Una vez que el período actual de tiempo está dentro de los sesenta (60) segundos de la
expiración, el quiosco debería mostrar un mensaje emergente que pregunta si el usuario
quiere comprar más tiempo (véase el prototipo de la pantalla K.9).
3.1.4 Rendimiento
En los quioscos que operan con una conexión PSTN, los usuarios deberían tener una
velocidad de conexión mayor que 50 KBPS.
En los quioscos con conexiones DSL o de cable, los usuarios deberían tener una velocidad
de conexión mayor que 128 KBPS.
3.1.5 Localización
Cada quiosco debería ser configurado para operar en el idioma local principal para su sitio
instalado.
Cada navegador del quiosco de Omninet debería ser configurado para admitir todos los
idiomas compatibles con el sistema operativo y navegador.
Porque los usuarios de Omninet accederán a Internet en lugares públicos, Omninet debería
implementar el bloqueo de los sitios para prevenir que se muestre material pornográfico,
objetable, indecente, obsceno o material violento.
Los usuarios pueden terminar las sesiones en una de las dos maneras:
3.1.8 Confidencialidad
Para proteger la confidencialidad del usuario—p.ej., las URLs visitadas — una vez que la
sesión termine, cada quiosco debería limpiar todas las cookies y otros archivos
descargados, limpiar el histórico de las URL, salir del navegador y reiniciar el navegador en
la pantalla de Bienvenida.
3.2 Administración
Los agentes del centro de llamadas también pueden realizar las actualizaciones de software
a los quioscos.
Los agentes del centro de llamadas deberían ser capaces de navegar en una lista de los
quioscos. Para cada quiosco, los agentes del centro de llamadas deben poder ver:
Los quioscos deben conectarse a la granja de servidores una vez por hora para
informar su estado.
Para aquellos quioscos que tienen usuarios activos, los agentes del centro de llamadas
deberían tener acceso a la siguiente información:
Los agentes del centro de llamadas deberían ser capaces de modificar la sesión de los
usuarios añadiendo períodos de tiempo.
La anulación supervisada es necesaria para que un agente añada más de sesenta (60)
minutos de tiempo por día.
El usuario debería recibir un mensaje de que la sesión fue terminada por una
actividad inapropiada. El mensaje debería especificar la cantidad del reembolso.
Apéndice B
La capacidad del sistema para proporcionar funciones, las cuales coincidan con las
necesidades establecidas e implícitas, cuando el software sea utilizado con las condiciones
especificadas.
1 Muy alta.
2 Alta.
3 Media.
4 Baja.
5 Muy Baja.
Requisitos de Fiabilidad del Sistema
La capacidad del sistema para ser comprendido, aprendido, utilizado y ser atractivo al
usuario y los agentes del centro de llamadas cuando es utilizado en las condiciones
especificadas.
Requisitos de Eficiencia del Sistema
La capacidad del sistema para ser modificado. Las modificaciones pueden incluir
correcciones, mejoras o adaptaciones de los cambios del software en los entornos y en las
especificaciones de requisitos y funcionales.
Requisitos de Portabilidad del Sistema
La siguiente tabla de decisiones muestra las reglas de negocio que rigen el proceso de los
pagos. El procesamiento de la lógica de los pagos que autoriza las ejecuciones de las
tarjetas de débito o crédito en el servidor de aplicaciones. El procesamiento de la lógica de
los pagos que verifica las ejecuciones de las monedas legítimas o las tarjetas correctas en el
quiosco.
Flujo del Módulo del Quiosco
Diagrama de Transiciones de Estado del Quiosco
El siguiente diagrama muestra los estados en los que el quiosco puede estar, las transiciones
que pueden ocurrir entre los estados y los eventos, las condiciones y las acciones asociadas
con aquellas transiciones.
La siguiente tabla muestra las transiciones de estados que pueden ocurrir basados en los
eventos y las condiciones que pueden influenciar el comportamiento de los quioscos.
Introducción
Bellcore
Este estándar se relaciona a las pruebas de sistema, no con las pruebas de software, pero
podría aplicarse si está probando un equipo telefónico.
La BCS tiene múltiples estándares, pero éste se relaciona específicamente con las pruebas.
Su influencia es grande porque sus conceptos y su terminología son seguidos en las
certificaciones del ISEB e ISTQB.
Sin embargo, éste tiene dos ventajas adicionales sobre la mayoría de los estándares citados
en este documento:
Estos son probablemente los estándares más citados comúnmente en los Estados Unidos,
pero una conformidad verdadera y completa es bastante rara.
Si Ud. trata de seguir los estándares IEEE, considere la compra de una copia del libro de
Michael Schmidt, Implementing the IEEE Software Engineering Standards.
Estos estándares son pocos utilizados, incluso en el trabajo del departamento de defensa de
los Estados Unidos, debido a la cantidad masiva de documentos generados.
DOD-STD-
Desarrollo de Software del Sistema del Ejército.
2167A:
DOD-STD-
Programa de Calidad de Software del Sistema del Ejército
2168:
MIL-STD- Control de Configuración—Cambios de Ingeniería, Desviaciones y
480B: Renuncias
MIL-STD- Control de Configuración—Cambios de Ingeniería (Forma Corta),
481B: Desviaciones y Renuncias
MIL-STD-
Prácticas de Especificaciones
490A:
MIL-STD-
Gestión de Ingeniería
499A:
MIL-STD- Revisiones Técnicas y Auditorías para Sistemas, Equipo, y Software de
1521: Computadoras
Este estándar se aplica para el software de aviónica, pero también es probablemente útil
para el software de seguridad crítica. Cuidado con la falta de requisitos de la cobertura de
datos.