1 - 2 - 3 - Doc - Tecnicas de Analisis
1 - 2 - 3 - Doc - Tecnicas de Analisis
ASEGURAMIENTO DE LA CALIDAD
Documento: Técnicas de Análisis
1. ANÁLISIS DE ALGORITMOS
La calidad de un programa requiere esencialmente un funcionamiento correcto, una buena documentación y
ser eficiente. El diseño descendente y un refinamiento sucesivo deberían conducir a la obtención de buenos
programas. Hoy en día la legibilidad es, sin duda, uno de los criterios más sobresalientes a la hora de decidir si
un programa es o no bueno. Gracias a los avances del Hardware, el estilo de programación se ha vuelto más
importante que el ahorro de memoria y el tiempo de ejecución.
El estilo en la construcción de programas, no es una cosa que pueda adquirirse sólo a partir del conocimiento
de las reglas de sintaxis de un lenguaje y las técnicas básicas de programación No obstante, es posible reunir
la inventiva y la ingeniosidad con unas reglas de disciplina y orden en el diseño de programas. El estilo de la
buena programación está íntimamente unido con la legibilidad de los programas. La legibilidad es la clave para
la comprensión de un programa, un programa que no se puede comprender no se podrá modificar ni mantener
actualizado.
La calidad de un programa se puede medir con diferentes parámetros, entre ellos, destacaremos:
▪ El programa debe funcionar: Un programa se dice que funciona correctamente cuando proporciona unos
resultados correctos para todo el rango posible de datos de entrada y en todos sus estados.
▪ La documentación: Es muy importante que el programa esté documentado. La documentación sirve para
ayudar a comprender y utilizar un programa. Puede ser interna (comentarios) o externa (manuales,
guías…)
▪ La eficiencia: Antiguamente los programadores gastaban mucho tiempo en ahorrar espacio de memoria
y disminución de tiempos de ejecución. Hoy, aunque se debe tener presente siempre el ahorro de memoria
y el tiempo de ejecución, los avances de hardware hacen que esta variable no sea tan exigente como en
tiempos pasados.
▪ La corrección: El programa debe coincidir exactamente con las especificaciones: proporcionar la
respuesta correcta para cualquier rango válido de datos.
▪ La flexibilidad: Los programas deben permitir cambios con ligeros retoques.
▪ La Fiabilidad: La exactitud y precisión de los resultados debe estar acorde con los tipos y rangos de datos
y las características de proceso del computador.
▪ La presentación: El formato de la presentación del código de un programa es decisivo a la hora de mejorar
su legibilidad. Hay que poner especial atención a los comentarios, identación (sangría) y nombres de las
variables.
Se recomienda descomponer el programa en módulos. Cada módulo representa una actividad completa y se
codifica independientemente.
El desarrollo se puede hacer mediante el método “Top-down” o “Bottom-up”.
Página 1 de 12
Vicerrectoría Académica IP – CFT
Dirección de Desarrollo Curricular
▪ Top-Down Es una técnica para diseñar que consiste en tomar el problema en forma inicial como una
cuestión global y descomponerlo sucesivamente en problemas más pequeños y por lo tanto, de solución
más sencilla. La descomposición del problema original (y de las etapas subsecuentes), puede detenerse
cuando los problemas resultantes alcanzan un nivel de detalle que el programador o analista pueden
implementar fácilmente.
▪ Bottom-Up Esta técnica consiste en partir de los detalles más precisos del algoritmo completando
sucesivamente módulos de mayor complejidad, se recomienda cuando ya se cuenta con experiencia y ya
se sabe lo que se va a hacer. Conforme se va alcanzando el desarrollo de módulos más grandes se
plantea como objetivo final la resolución global del problema. Este método es el inverso del anterior y es
recomendable cuando se tiene un modelo a seguir o se cuenta con amplia experiencia en la resolución de
problemas semejantes.
Hay varias razones por las que es deseable analizar el comportamiento de un algoritmo.
1. Analizando se pueden descubrir características generales y particulares de un algoritmo y evaluar la
facilidad de emplearlo en una aplicación, o compararlo con otras opciones de algoritmo para la misma
aplicación.
2. El análisis de un algoritmo sirve para entender mejor sus propiedades y puede sugerir mejoras posteriores.
3. El análisis puede servir para identificar maneras de sacar las mayores ventajas del ambiente de
programación (arquitectura de la computadora, sistema operativo, compilador), que puede tener un efecto
significativo en el desempeño del algoritmo.
4. Muchos algoritmos poseen una estructura compleja que despierta interés matemático y permite el
desarrollo de teoría útil para otras situaciones (como el análisis de otros algoritmos).
El método empleado en el análisis de un algoritmo depende por completo de la naturaleza del algoritmo que se
trate. Por otra parte, un algoritmo puede ser analizado de distintas formas y más aún si consideramos que
muchos se pueden programar iterativa o recursivamente. En algunas ocasiones se pueden establecer
esquemas generales de análisis como los que a continuación se presentan:
Correctitud
Un error común es hacer una prueba de escritorio con algunos valores y concluir que el algoritmo funciona.
Este método empírico puede no encontrar errores oscuros que no sean fáciles de detectar en pruebas
experimentales.
Página 2 de 12
Vicerrectoría Académica IP – CFT
Dirección de Desarrollo Curricular
Complejidad algorítmica
Las ideas detrás del análisis son relativamente simples aunque generalmente muy difíciles de aplicar. En el
caso de algoritmos iterativos, se carga O a cada segmento de código que no incluya ciclos y se usan las reglas
de sumas y productos de la notación asintótica para incluir ciclos.
En el caso de los algoritmos recursivos, la clave está en determinar la relación de recurrencia que describe la
complejidad y resolverla. La solución de recurrencias generalmente se obtiene por iteración, sustitución o con
el Teorema Maestro.
Aún algoritmos sencillos pueden requerir un análisis para el que se necesite un buen conocimiento de
matemáticas. Para muchos algoritmos es más sencillo realizar un análisis amortizado, tomando ideas de los
economistas. En el análisis amortizado se obtiene como resultado el costo por operación, calculando el total
para n operaciones y luego sacando un promedio, T(n)/n.
El análisis amortizado posee las siguientes características:
- Puede utilizarse para mostrar que el costo medio de una operación es pequeño.
- No interviene la probabilidad, a diferencia del análisis del caso medio.
- Garantiza el desempeño de cada operación en el caso medio.
- Es relativamente sencillo de aplicar en algoritmos sofisticados como los árboles de Fibonacci
Página 3 de 12
Vicerrectoría Académica IP – CFT
Dirección de Desarrollo Curricular
Y entonces se prosigue a
1. mostrar que hay crédito suficiente para pagar una operación, y
2. mostrar que, después de una operación, hay suficiente crédito para satisfacer la regla de uso.
El teorema maestro proporciona una solución sencilla en términos asintóticos (usando una Cota superior
asintótica) para ecuaciones de recurrencia que ocurren en muchos algoritmos recursivos tales como en el
Algoritmo divide y vencerás. Fue popularizado por el libro Introducción a los algoritmos por Cormen, Leiserson,
Rivest, y Stein, en el cual fue tanto introducido como probado formalmente. No todas las ecuaciones de
recurrencia pueden ser resueltas con el uso del teorema maestro.
El teorema maestro proporciona una solución sencilla en términos asintóticos (usando una Cota superior
asintótica) para ecuaciones de recurrencia que ocurren en muchos algoritmos recursivos tales como en el
Algoritmo divide y vencerás. Fue popularizado por el libro Introducción a los algoritmos por Cormen, Leiserson,
Rivest, y Stein, en el cual fue tanto introducido como probado formalmente. No todas las ecuaciones de
recurrencia pueden ser resueltas con el uso del teorema maestro.
Considere un problema que puede ser resuelto a través de un algoritmo recursivo como el siguiente:
Procedimiento T(n : tamaño del problema ) definición:
if n < 1 then exit
T(n/b)
T(n/b)
...repetir una cantidad de a veces...
T(n/b)
fin procedimiento
Página 4 de 12
Vicerrectoría Académica IP – CFT
Dirección de Desarrollo Curricular
En el algoritmo mostrado arriba se divide el problema original en una cantidad menor de subproblemas de
manera recursiva, cada uno de estos subproblemas siendo del tamaño de n/b. Esto podría ser visualizado como
la construcción de un árbol de llamadas al problema, siendo cada nodo del árbol una instancia recursiva del
mismo y sus hijos siendo instancias de las llamadas subsiguientes. En el ejemplo de arriba, cada nodo tendría
un número a de hijos. Cada nodo hará la cantidad de trabajo correspondiente al tamaño del subproblema n,
pasado a esa instancia en particular, estando la cantidad de trabajo realizado determinado por {\displaystyle
f(n)} {\displaystyle f(n)}. El trabajo total realizado por todas las llamadas del árbol es la suma de los trabajos
hechos por cada uno de los nodos del árbol.
Técnicas experimentales
Hay varios esquemas pero los más utilizados son el de caja negra y el de caja blanca. Son complementos
indispensables de las pruebas formales pues las constantes introducidas por la codificación de los algoritmos
pueden mermar seriamente su desempeño en la práctica.
- Caja negra: Consiste en tomar una muestra suficientemente representativa del conjunto de las posibles
entradas y verificar que la salida es la correcta sin ver la forma como el algoritmo está trabajando.
- Caja blanca: Consiste en preparar un conjunto de entradas que aseguren que cada línea de código será
ejecutada alguna vez y que las condiciones serán evaluadas en sus límites.
Es posible utilizar estos dos métodos de manera complementaria.
Página 5 de 12
Vicerrectoría Académica IP – CFT
Dirección de Desarrollo Curricular
Si el sistema falla, podrían ocurrir pérdidas económicas o humanas significativas. Por este motivo, el enfoque
descrito por Graham es penoso y peligroso.
Hoy en día se utilizan herramientas software para el modelado y simulación de sistemas para ayudar a eliminar
sorpresas cuando se construyen sistemas reactivos basados en computadora. Estas herramientas se aplican
durante el proceso de ingeniería de sistemas, mientras se están especificando las necesidades del hardware,
software, bases de datos y de personas.
Las herramientas de modelado y simulación capacitan al ingeniero de sistemas para probar una especificación
del sistema.
▪ Testopia es un administrador de casos de prueba, el cual maneja extensiones para interactuar con Bugzilla.
Testopia está diseñado para ser una herramienta genérica para el seguimiento de casos de prueba,
permitiendo a las organizaciones realizar las pruebas de software e integrar reportes de defectos
encontrados, así como el resultado de los de los caso de prueba. Testopia está diseñado desde el punto de
vista de la actividad de pruebas, este puede ser usado para llevar el seguimiento de pruebas, así como el
seguimiento virtual de cualquier proceso de ingeniería.
▪ QaManager es una aplicación web independiente de plataforma para administrar proyectos de control de
calidad de manera efectiva con una instalación muy simple. QaManager tiene seguimiento de proyectos,
administración de recursos, administración de TC, biblioteca en línea, alertas y más.
▪ El Test Environmet Toolkit (TET) se proporciona como un producto de línea de comandos de código
abierto y no compatible. Se usa ampliamente en muchas aplicaciones de prueba, incluido el programa de
certificación UNIX de The Open Group y el programa de certificación LSB de Free Standards Group.
▪ SoapUI es la herramienta de prueba funcional líder en el mundo para pruebas de SOAP y REST. Con su
interfaz gráfica fácil de usar y sus características de clase empresarial, SoapUI le permite crear y ejecutar
de manera fácil y rápida las pruebas automatizadas de funcionalidad, regresión y carga. En un entorno de
prueba único, SoapUI proporciona una cobertura de prueba completa, desde servicios web basados en
SOAP y REST hasta capas de mensajería empresarial JMS, bases de datos, aplicaciones de Internet
enriquecidas y mucho más.
▪ Solex es una herramienta gratuita de prueba de aplicaciones web de código abierto creada como
complemento para el IDE de Eclipse. Proporciona funciones para grabar una sesión de cliente, ajustarla de
acuerdo con varios parámetros y reproducirla más tarde, normalmente para garantizar que no se regrese el
comportamiento de la aplicación (con capacidades de pruebas de estrés que se agregarán en una etapa
posterior).
▪ HP LoadRunner Reduce drásticamente la cantidad de tiempo y habilidad requerida para simular las
transacciones de los usuarios en el software de prueba de carga. Integra las pruebas de carga en sus
herramientas de desarrollo: IDE, jUnit, nUnit, Jenkins, Selenium y Microsoft Visual Studio. A partir de la
versión 12.55, puede ejecutar sus scripts de JMeter e integrar JMeter con tipos de scripts adicionales en
cualquier prueba de rendimiento. Con más de 50 protocolos, puede probar fácilmente una amplia gama de
Página 6 de 12
Vicerrectoría Académica IP – CFT
Dirección de Desarrollo Curricular
aplicaciones que incluyen web, móvil, Ajax, Flex, HTML 5, .NET, Java, GWT, Silverlight, SOAP, Citrix, ERP
y más.
▪ Telerik Test Studio permite realizar pruebas automatizadas de forma rápida y sencilla, integrarlos en su
entorno de CI / CD siguiendo su ágil flujo de trabajo, encontrar defectos antes y enviar un producto de
software de mejor calidad. Automatiza las tareas manuales de control de calidad repetitivas y garantiza un
alto nivel de calidad del software continuamente a tiempo sin sorpresas de última hora.
▪ Bitbar Testing presenta una nube de dispositivos móviles con miles de dispositivos Android y iOS reales
para equipos móviles con sabores únicos para lograr pruebas continuas y aumentar la eficiencia de las
pruebas, asistida por AI Testbot.
▪ SpiraTest proporciona una solución completa de control de calidad que gestiona los requisitos, pruebas,
errores y problemas en un entorno, con una trazabilidad completa desde su inicio hasta su finalización.
Página 7 de 12
Vicerrectoría Académica IP – CFT
Dirección de Desarrollo Curricular
▪ Descubrir continuamente la información técnica, asociada con las funciones, formularios y actividades
internas que aseguran el producto.
▪ Continuar el mejoramiento del proceso de desarrollo.
▪ Establecer una igualdad de conocimiento dentro de los desarrolladores para la buena práctica de los
estándares y técnicas de desarrollo.
La inspección de Fagan (Fagan inspection) es un método de revisiones agrupadas usado para evaluar la salida
de un proceso dado.
La inspección de Fagan define un proceso como una cierta actividad con una entrada preespecificada y criterios
de salida. En cada actividad u operación para la cual se especificaron criterios de entrada y salida se puede
usar la inspección de Fagan para validar si la salida cumple con el criterio especificado para el proceso.
Ejemplos de actividades para las que se puede utilizar la Inspección Fagan son:
▪ Especificaciones de requerimientos
▪ Software / Arquitectura de Sistemas de Información (por ejemplo DYA)
▪ Programación (por ejemplo, para las iteraciones en XP o DSDM)
▪ Pruebas de software (por ejemplo, para la creación de scripts de prueba)
Dado que los costos de remediar un defecto en las primeras instancias del proceso son hasta 10-100 veces
menores que hacerlo en la fase de mantenimiento, es esencial encontrarlos lo antes posible y es aquí donde
ayuda la inspección de la salida de cada operación y su comparación con los requisitos de salida previstos.
Un típico proceso de inspección involucra las siguientes operaciones::1
▪ Planificación:
Preparación de materiales
Determinar y convocar a los participantes
Organizar la reunión
▪ Información general
Poner al tanto a los participantes acerca de los materiales a ser examinados
Asignación de roles
▪ Preparación
Los participantes se preparan para la reunión revisando los ítems a ser analizados, estudiando el material
de apoyo y preparando preguntas o señalando posibles defectos
Los participantes ensayan su rol
▪ Reunión de inspección
Comprobación efectiva de los defectos
▪ Rehacer
Es el paso en el método de inspección de software en el que los defectos encontrados durante la reunión
de inspección se resuelven por el autor, diseñador o programador. Partiendo de la lista de defectos del
documento de bajo nivel, se corrige hasta que se cumplen los requisitos en el documento de alto nivel.
Página 8 de 12
Vicerrectoría Académica IP – CFT
Dirección de Desarrollo Curricular
▪ Seguimiento
En la fase de seguimiento, bajo la responsabilidad del moderador se inspecciona que todos los defectos
encontrados en la reunión de la inspección efectivamente se hayan corregido y que no hayan aparecido
nuevos.
Página 9 de 12
Vicerrectoría Académica IP – CFT
Dirección de Desarrollo Curricular
Como existen diferentes tipos de ciclos hay que tenerlos en cuenta a la hora de analizarlos.
Los tipos son:
▪ Simple
▪ Anidado
▪ Concatenado
▪ No estructurado
Página 10 de 12
Vicerrectoría Académica IP – CFT
Dirección de Desarrollo Curricular
Además también hay que tener las diferentes sentencias que hay para representar un ciclo:
▪ While
▪ Repeat
▪ For
Para usar esta técnica es importante tener el código del programa que estamos evaluando, buscando los
algoritmos que contengan los ciclos. Una vez seleccionados los segmentos de código que contienen ciclos se
procede a dibujar el grafo, esto se hace para poder identificar el recorrido lógico del código. Con el grafo y el
código se identifica que criterio usar para aplicar pruebas. A continuación se explican los diferentes tipos de
ciclos y sentencias que se usan como criterios para evaluar ciclos.
Ciclos Simples: Estos ciclos son sencillos, generalmente tienen una condición
Para probar estos ciclos tenemos unas reglas. Teniendo en cuenta que n es el número de iteraciones del ciclo:
▪ Pasar por alto el bucle
▪ Pasar una sola vez
▪ Pasar 2 veces por el bucle
▪ Pasar m veces por el bucle, siendo m
Ciclos Anidados: Estos ciclos son aquellos que tienen un ciclo en su interior
Tenemos las siguientes reglas
• Hacer pruebas con el bucle más interno y tratarlo como si fuera simple y el
externo mantener el número mínimo de iteraciones.
• Pruebas hacia fuera, para los internos mantener valores típicos y externos
valores mínimos.
Ciclos Concatenados: Estos ciclos son aquellos que tienen un ciclo en su interior, pero a diferencia del anterior
vuelve no hasta el inicio del Ciclo externo, si no hasta sí mismo.
Para estos hay que verificar que forma de concatenación tiene, si es
concatenación independiente se prueba igual que los bucles simples,
pero si es concatenación no independiente, se trata como bucles
anidados.
Página 11 de 12
Vicerrectoría Académica IP – CFT
Dirección de Desarrollo Curricular
Ciclos No Estructurados: Estos ciclos son aquellos que utilizan programación no Estructurada.
Para este tipo de bucles se recomienda no hacer pruebas y
replantearlos, pues son una muy mala práctica de programación
y sería altamente riesgoso para el software
Fuentes:
- Técnicas de análisis y diseño de algoritmos, Ricardo Soto, PUCV,
- Introduction to Algorithms, Thomas Cormen, MIT Press, 2009
- An Introduction to the Analysis of Algorithms, Robert Sedgewick, Pearson Education, 2013
Página 12 de 12