Pregunta

Si tengo un código que tiene cobertura de la prueba 80% (todas las pruebas pasan), es justo decir que es de mayor calidad que el código sin cobertura de la prueba?

O es que es justo decir que es más fácil de mantener?

¿Fue útil?

Solución

En un sentido estricto, no es justo para hacer cualquier reclamación hasta que se establezca la calidad de la serie de pruebas. Pasando 100% de las pruebas no es significativa si la mayoría de las pruebas son triviales o repetitivo entre sí.

La pregunta es:? En la historia del proyecto, hizo ninguna de esas pruebas Destape errores El objetivo de una prueba es encontrar errores. Y si no lo hicieron, no pudieron como pruebas. En lugar de mejorar la calidad del código, puede ser que solamente se le da una falsa sensación de seguridad.

Para mejorar que los diseños de prueba, se puede utilizar (1) whitebox técnicas, (2) técnicas de caja negra, y (3) las pruebas de mutación.

(1) Estos son algunos buenos whitebox técnicas para aplicar a sus diseños de prueba. Una prueba whitebox se construye con el código fuente específica en mente. Un aspecto importante de pruebas de caja blanca es la cobertura de código:

  • ¿Es cada función se llama? [Cobertura funcional]
  • se ejecuta cada declaración? [Declaración coverage-- Tanto la cobertura funcional y la cobertura de sentencias son muy básicas, pero mejor que nada]
  • Para cada decisión (como if o while), tiene usted una prueba de que las fuerzas que es cierto, y otra que las fuerzas que es falsa? [Cobertura de la Decisión]
  • Para cada condición que es una conjunción (usos &&) o disyunción (usos ||), tiene cada subexpresión tiene una prueba donde es verdadero / falso? [Cobertura Condición]
  • la cobertura
  • Loop:? ¿Tiene una prueba de que las fuerzas de iteraciones 0, 1 iteración, 2 iteraciones
  • ¿Está cada break de un lazo cubierto?

(2) técnicas de caja negra se utilizan cuando los requisitos están disponibles, pero el código en sí no lo es. Estos pueden conducir a pruebas de alta calidad:

  • Haga su análisis de la caja negra cubren múltiples objetivos de prueba? Usted quiere que sus pruebas sean "grasa":. No sólo prueba de la característica X, sino que también prueban Y y Z. La interacción de diferentes características es una gran manera de encontrar errores
  • El único caso de que no desea que las pruebas "grasa" es cuando se está probando una condición de error. Por ejemplo, las pruebas de entrada de usuario válido. Si se trató de lograr múltiples objetivos de prueba de entrada no válidos (por ejemplo, un código postal válido y una dirección de calle no válida) es posible que en un caso es enmascarar el otro.
  • Considere los tipos de entrada y formar una "clase de equivalencia" para los tipos de entradas. Por ejemplo, si su código prueba a ver si un triángulo es equilátero, la prueba que utiliza un triángulo de lados (1, 1, 1) es probable encontrar el mismo tipo de errores que los datos de prueba (2, 2, 2) y (3, 3, 3) se encontrará. Es mejor gastar su tiempo pensando en otras clases de entrada. Por ejemplo, si el programa se encarga de impuestos, tendrá una prueba para cada nivel de impuestos. [Esto se llama partición de equivalencia.]
  • Casos especiales son a menudo asociados con defectos. Sus datos de prueba deben tener también valores límite, como los de, por encima o por debajo de los bordes de una tarea de equivalencia. Por ejemplo, en la prueba de un algoritmo de clasificación, tendrá que probar con una matriz vacía, un único conjunto de elementos, una matriz con dos elementos, y luego un arsenal muy grande. Usted debe considerar los casos de frontera no sólo para la entrada, pero para la salida también. [Este es el análisis de llamada límite-valor.]
  • Otra técnica es "adivinar error." ¿Tiene la sensación de que si se intenta alguna combinación especial que puede obtener su programa de romper? A continuación, sólo probarlo! Recuerde: Su objetivo es encontrar errores, no para confirmar que el programa es válido . Algunas personas tienen la habilidad para adivinar error.

(3) Por último, supongamos que ya tiene un montón de pruebas agradables para whitebox cobertura y técnicas de caja negra aplicada. ¿Qué más puedes hacer? Es tiempo de Prueba de sus pruebas . Una técnica que puede utilizar es pruebas de mutación.

En las pruebas de mutación, que haga una modificación a (una copia de) su programa, con la esperanza de creatinag de un error. Una mutación podría ser:

Cambiar una referencia de una variable a otra variable; Insertar los abs () función; Cambio menos-que a mayor que; Eliminar una declaración; Reemplazar una variable con una constante; Eliminar un reemplazo de métodos; Eliminar una referencia a un método súper; Cambio de orden de los argumentos

Crear varias decenas de mutantes, en varios lugares en su programa [aún necesitará el programa para compilar el fin de la prueba]. Si las pruebas no encuentran estos errores, entonces ahora tiene que escribir una prueba que puede encontrar el error en la versión mutada de su programa. Una vez que una prueba detecta el fallo, que ha matado al mutante y puede intentar otra.


Addendum : Olvidé mencionar este efecto: Bugs tienden a agruparse . Lo que esto significa es que el más errores que se encuentra en un módulo, mayor será la probabilidad de que encontrará más errores. Por lo tanto, si usted tiene una prueba que falla (es decir, la prueba es satisfactoria, ya que el objetivo es encontrar errores), no sólo en caso de que corregir el error, pero usted debe escribir también más pruebas para el módulo, utilizando el técnicas anteriores.

Mientras que usted está encontrando errores a un ritmo constante, los esfuerzos de prueba deben continuar. Sólo cuando hay una disminución en la tasa de nuevos errores encontró en caso de que tenga la confianza de que usted ha hecho buenos esfuerzos de prueba para esa fase de desarrollo.

Otros consejos

Por una definición que es más fácil de mantener, ya que cualquier cambio importante tiene más probabilidades de ser atrapado por las pruebas.

Sin embargo, el hecho de que el código pasa las pruebas de unidad no significa que sea intrínsecamente de mayor calidad. El código aún podría estar mal formateado con comentarios irrelevantes y estructuras de datos inapropiados, pero todavía puede pasar las pruebas.

Yo sé que codifican preferiría mantener y ampliar.

Código sin ningún tipo de pruebas puede ser muy alta calidad, fácil de leer, hermosa y eficiente (o basura total), así que no, no es justo decir que el código con cobertura de la prueba el 80% es de mayor calidad que el código sin cobertura de la prueba .

Podría ser justo decir que el código 80% cubierto con bien pruebas es probablemente de calidad aceptable, y probablemente relativamente fácil de mantener. Pero garantiza poco, la verdad.

Yo lo llamaría más-refactorable. Refactorización pone muy fácil si el código está cubierto con gran cantidad de pruebas.

Sería justo decir que sea más fácil de mantener.

Yo estaría de acuerdo acerca de la parte de mantener. Michael plumas recientemente publicaron un video de una excelente charla de su llamado " La profunda sinergia entre la capacidad de prueba y el buen diseño " en la que discute este tema. En la charla se dice que la relación es de una manera, que es, el código que está bien diseñado es comprobable, pero el código comprobable no es necesariamente bien diseñado.

Vale la pena señalar que la transmisión de video no es muy grande en el video, por lo que podría ser vale la pena descargar si usted quiere ver en su totalidad.

Me he estado preguntando esta pregunta desde hace algún tiempo en relación a "cobertura de condición". Así que ¿qué hay de esta página de atollic.com "¿Por qué el análisis de cobertura de código? "

Más técnicamente, el análisis de la cobertura de código se encuentra en su programa de áreas que no esté prevista en los casos de prueba, lo que le permite crear pruebas adicionales que cubren partes de lo contrario no probados de su programa. Por tanto, es importante entender que cobertura de código le ayuda entender la calidad de sus procedimientos de prueba, no la calidad de la propio código .

Esto parece ser bastante relevante aquí. Si usted tiene un conjunto de casos de prueba que logra alcanzar un cierto nivel de (código o de otro tipo) de cobertura, entonces usted está bastante probable invocando el código bajo prueba con un conjunto más exhaustivo de los valores de entrada! Esto no le dirá mucho sobre el código bajo prueba (a menos que el código sopla hacia arriba o genera defectos detectables), pero le da confianza en el caso de test conjunto .

cubo de Necker cambio de vista, el código de prueba está siendo probado por el código bajo prueba!

Hay muchas maneras de garantizar que un programa hace lo que se propone, y para asegurarse de que no hay modificaciones llevar a efectos no deseados.

La prueba es uno. Evitar la mutación de los datos es otro. Así que es un sistema de tipos. O la verificación formal.

Así que, aunque estoy de acuerdo que la prueba es generalmente una buena cosa, un porcentaje dado de la prueba no puede significar mucho. Prefiero confiar en algo escrito en Haskell, sin pruebas de que en una librería PHP bien probado

Licenciado bajo: CC-BY-SA con atribución
scroll top