Documentos de Académico
Documentos de Profesional
Documentos de Cultura
• Errores
• advertencias
• mensajes
Contratos de código:
Son un modo de generar advertencias y mensajes para los casos que consideremos.
Así podemos estar atentos a aquellos casos en los que hayamos pensado.
Para ello se utiliza System.Diagnostics.Contract que permitirá usar los en todos
Ensure y Requieres para nuestros propósitos
Contract.Ensures(Contract.Result<int>()>0);
//codigo del metodo
return dimension;
}
Método Requieres:
contract.Requieres<Argument Exception>(dimension>0);
//codigo del metodo
}
se nos avisa si hemos roto la regla en algun caso, por ejemplo, asignando el valor 0
Los casos de prueba suelen tener un formato concreto para llevar su seguimiento e
informe especificando que es lo que se prueba, cuales son las condiciones premisas,
cual es el resultado esperado y cual es el resultado obtenido.
Un posible formato es:
Son siempre lsa primeras pruebas que hay que realizar, pues revisan la estructura y
funcionalidad interna del programa. Asi se puede encontrar defectos basicos de
software no relacionados con la innterfaz del usuario.
. Prueba del camino básico: se basa en el principio que establece que cualquier
diseño procedimental se puede representar mediante un grafo de flujo. La
complejidad ciclomática de dicho grafo establece el numero de caminos
independientes. Cada uno de estos caminos se corresponde con un nuevo conjunto de
sentencias o una nueva condición.
El funcionamiento de este método consiste en definir los diferentes bloques para cada
camino posible y obtener los diferentes caminos para recorrelo por todas las opciones
posibles evitando saltarnos ninguna(examinar todos los caminos posibles y sus tutas
sin dejarnos ninguno).
Ejemplo: tenemos un programa que comprueba si son números pares y, de ser así.
Comprueba si son múltiplos recíprocos, Si los dos son impares, comprueba también
si son múltiplos de 3, y si no es ninguna de las anteriores, comprueba también si son
múltiplos recíprocos.
Tenemos 5 bloques:
• Inicio
• son los dos pares
• son los dos impares
• uno es par y otro es impar
• son múltiplos recíprocos
• son múltiplos de tres
• Prueba de condiciones: evalúan los casos posibles, en este caso deforma que
solo provengan de condicionales. Se estipula que si un mismo conjunto de
casos de prueba evaluá correctamente una condición o serie de condiciones, se
utiliza un método muy similar a una tabla de verdad, en donde se especifica
también la operación relacional.
Para que las pruebas sean efectivas, no deben ser redundantes, por lo que al
hacer la tabla de verdad hay que tener presentes las condiciones
cortocircuitadas. De este modo, para evaluar la expresión del estilo(E1||E2),
solo deberíamos evaluar el valor de E2 cuando E1 sea falso, ya que cuando al
expresión E1 es verdadera la comprobación termina por no ser necesario
evaluar el valor E2.
• Prueba de bucles: no evalúan como el resto de pruebas de caja blanca las
condiciones de dicho bucle, sino las posibilidades que nos ofrece. Todos los
bucles tienen una condición que nos establece la cantidad de interacciones que
nos va a realizar dicho bucle. Para evaluar correctamente todas las opciones,
tenemos que valorar los siguientes comportamientos para un bucle con”n”
iteraciones :
◦ El flujo del programa no entra ninguna vez al bucle.
◦ pasa una vez por el bucle.
◦ pasa dos veces por el bucle.
◦ pasa m veces por el bucle, siendo m<n.
◦ Hace n-1 y n+2 iteraciones en el bucle.
Para los bucles anidados, hay que realizar dichas evaluaciones en el bucle mas
interno e ir subiendo nivel a nivel, Primero de manera independiente y luego de
forma coherente con el resto de bucles de los que depende por la anidación.
•
.Análisis de valores límite: es una técnica equivalente a la partición
equivalente. Indica
que, si especificamos un rango delimitado de valores o un número de
valores
específicos, también se deberá probar por el valor inmediatamente superior
e
inmediatamente inferior de dichas cotas. Si nuestras cotas de valores son
“a” y “b”,
deberemos probar los valores “a-1”, “a+1”, “b-1” y “b+1”.
También hay que realizar la misma operación en las condiciones que estén
delimitadas
en tamaños, como por ejemplo un array de dimensión 5.
Para estas cuestiones y criterios, hay que aplicar estos valores en la salida
de la
aplicación para evitar errores en los límites de los elementos en donde
escribimos la
salida de la aplicación.
3.3.3 Rendimiento
Las pruebas de rendimiento miden el tiempo que le ha tomado a la aplicación realizar una acción
específica. Aunque depende de la máquina donde se está ejecutando la aplicación, sigue
teniendo validez, ya que permite probar y controlar el tiempo para un equipo concreto como
realizar operaciones de diferentes formas y ver cuál conlleva un mejor rendimiento.
Para realizar estas mediciones, se puede usar un cronómetro llamado StopWatch. Con él se
puede ver lo que ha tardado la aplicación en ejecutar los comandos mediante milisegundos,
aunque también se pueden usar los ticks o ciclos de proceso. Solamente hay que instanciar el
cronómetro y arrancarlo para que comience a medir.
En este programa , se utiliza un algoritmo que recorre una colección y guarda en
otra lista los valores de dicha colección.
La operación realizada con LINQ tarda mucho mas que si se utiliza un filtrado
“manual”. No siempre lo mas sencillo es mas eficaz, En muchas ocasiones la
busqueda que realiza el gestor de una base de dadtos es mas eficaz que cualquier
filtrafo u ordenacion mediante código.
En ocasiones, la Heurista de la operación nos impedirá obtener caminos mas cortos
para mejorar el rendimiento, pero no conviene caer en esta mala praxis, ya que a la
larga se produciran errores de rendimiento.
3.3.4 COHERENCIA
Las pruebas de coherencia son subjetivas, es decir, no están ligadas a la propagación
ni a los datos en si mismos, Se enfocan en el estudio del flujo de trabajo(workflow)
de la aplicación de un modo coherente.
Ejemplo: Supongamos que estamos desarrollando una aplicación que gestionará los
empleados y pedidos de un restaurante de comida a domicilio. Los empleados tienen
un”tipo” que especifica su función en la empresa, como”cocina”o”repartidor”. Por
ellos, aunque nuestra aplicación establezca perfectamente un empleado asignado para
repartir el pedido, no tiene sentido si el empleado asignado es un cocinero, por tanto
la aplicación no es coherente, puesto que funciona correctamente, sin errores, pero
permite operaciones que no tienen sentido en el ámbito sobre el que trabajamos .
Hoy en día para esta tarea existe la programación de pruebas automáticas que se crea
cada vez que se implementa una nueva funcionalidad o método, y las que nos
permiten ejecutar las baterías de pruebas de una manera ordenada visualizando todos
los resultados.
3.4.1 Metodologia
3.4.2 Nunit
Nunit es una aplicación disponible como extensión que permitirá la integración con el
entorno de desarrollo.
El instalador nos proveerá de las dll necesarias en el sistema. Para poder utilizarlo, se
debe agregar la referencia a “nunit.framework” e incluir el espacio de nombres en
nuestras clases test.
Después se instala extensión de VS para integrar los resultados en el sistema. Se
busca “nunit” desde el administrador de extensiones y se instala.
Con esto, se tendría el IDE preparado para trabajar con Nunit.
Para ver un ejemplo del uso de NUnit se ve su funcionamiento mediante un
proyecto. Crearemos un nuevo proyecto, una biblioteca de clases por ejemplo,
Dentro de dicho proyecto, crearemos las clases. En una implementaremos diversos
diversos métodos