2009-07-10 10 views
8

Recientemente, pasé cerca del 70% del tiempo codificando una función para escribir pruebas de integración. En un momento, estaba pensando "Maldición, todo este trabajo duro probándolo, sé que no tengo errores aquí, ¿por qué trabajo tan duro en esto? Vamos a echar un vistazo rápido a las pruebas y terminarlas ... "¿Cuántas pruebas son suficientes?

Cinco minutos después, falla una prueba. La inspección detallada muestra que se trata de un error importante y desconocido en una biblioteca de terceros que estamos utilizando.

Entonces ... ¿dónde dibuja su línea sobre qué probar sobre qué asumir en la fe? ¿Probas todo, o el código donde esperas la mayoría de los errores?

Respuesta

0

Pruebo todo. Lo odio, pero es una parte importante de mi trabajo.

+2

No puedo entender si tu intención fue escribir "Solía ​​probar" en el tiempo pasado, o "Probé todo" en el tiempo presente. – ripper234

+0

Lo siento por mi inglés. Quería decir "Lo pruebo todo" ", pero como Lars A. Brekken también dijo aquí, es muy importante dar prioridad. – Jonathan

15

En mi opinión, es importante ser pragmático a la hora de realizar pruebas. Dé prioridad a sus esfuerzos de prueba en las cosas que tienen más probabilidades de fallar, y/o las cosas que es más importante que no fallen (es decir, tenga en cuenta la probabilidad y la consecuencia).

Piense, en lugar de seguir ciegamente una métrica como la cobertura del código.

Detenga cuando se sienta cómodo con el banco de pruebas y su código. Regrese y agregue más pruebas cuando (si?) Las cosas comienzan a fallar.

+1

+1 para ** RiskedBasedTesting ** (cosas que es más importante que no fallen) – k3b

1

Si usted o su equipo ha estado siguiendo las métricas, puede ver cuántos errores se encuentran para cada prueba a medida que avanza el ciclo de vida del software. Si ha definido un umbral aceptable donde el tiempo dedicado a las pruebas no justifica el número de errores encontrados, entonces ESE es el punto en el que debe detenerse.

Probablemente nunca encuentre el 100% de sus errores.

+2

Debe cambiar" probablemente "por" nunca " –

+0

NUNCA se puede decir que un software está libre de defectos. La ausencia de evidencia no es evidencia de ausencia – StuperUser

+0

public static void main (String [] args) { System.out.print ("¡Hola mundo!"); } Es para cosas tontas como estos simples programas que guardo el probabilidad y allí. Nunca está incluido. – AlbertoPL

0

Paso mucho tiempo en pruebas unitarias, pero muy poco en pruebas de integración. Las pruebas unitarias me permiten construir una característica de una manera estructural. Y ahora tiene alguna buena documentación y pruebas de regresión que se pueden ejecutar en cada compilación

Las pruebas de integración son una cuestión diferente. Son difíciles de mantener y, por definición, integran muchas funciones diferentes, a menudo con una infraestructura con la que es difícil trabajar.

3

¡Buena pregunta!

En primer lugar - que suena como su extensa pruebas de integración valió la pena :)

Desde mi experiencia personal:

  • Si es un "campos verdes" nuevo proyecto, me gusta hacer cumplir estrictamente las pruebas unitarias y tiene un plan de prueba de integración completo (tan completo como posible) diseñado.
  • Si es un pedazo de software existente que tiene mala cobertura de la prueba, entonces yo prefieren diseñar un conjunto de integración pruebas que ponen a prueba la funcionalidad específica/ conocido. Luego introduzco las pruebas (unidad/integración) como I progreso adicional con la base de código.

¿Cuánto es suficiente? Difícil pregunta: ¡No creo que nunca haya suficiente!

+3

Creo que la verdadera pregunta es: "¿Cuándo dejan de tener sentido las pruebas?", Como programadores, ciertamente podemos pensar que "nunca puede haber suficiente cobertura" (y estoy de acuerdo en cierta medida), pero ciertamente mi jefe y el cliente mendigaría diferir. –

+1

De acuerdo, siempre es un buen saldo. Cuantificar el valor de una amplia cobertura de prueba para las partes interesadas que no son desarrolladores es un desafío. ¿Alguien tiene buenas ideas sobre cómo hacer eso? –

3

"Demasiado de todo es suficiente".

No sigo estrictas prácticas de TDD. Intento escribir suficientes pruebas unitarias para cubrir todas las rutas de código y ejercitar cualquier caso límite, creo que son importantes. Básicamente trato de anticipar lo que podría salir mal. También trato de hacer coincidir la cantidad de código de prueba que escribo con lo frágil o importante que creo que es el código bajo prueba.

Soy estricto en un área: si se encuentra un error, primero escribo una prueba que ejercita el error y falla, hago que el código cambie y verifico que la prueba pasa.

+2

+1 en escribir una prueba antes de corregir un error. – ripper234

0

Al igual que con todo en la vida, está limitado por el tiempo y los recursos y en relación con su importancia. Idealmente, probarías todo lo que razonablemente creas que podría romperse. Por supuesto, puede estar equivocado en su estimación, pero el uso excesivo para asegurarse de que sus suposiciones son correctas depende de qué tan significativo sería un error frente a la necesidad de pasar a la siguiente característica/versión/proyecto.

Nota: Mi respuesta aborda principalmente las pruebas de integración. TDD es muy diferente. Se cubrió en SO antes, y allí dejas de probar cuando ya no tienes más funciones para agregar. TDD se trata de diseño, no de descubrimiento de errores.

4

Cuando ya no tenga miedo de hacer cambios medianos a importantes en su código, es probable que tenga suficientes pruebas.

0

Trabajé en QA durante 1,5 años antes de convertirme en desarrollador.

Nunca se puede probar todo (me dijeron que cuando entrenaba todas las permutaciones de un cuadro de texto solo tomaría más tiempo que el universo conocido).

Como desarrollador no es su responsabilidad conocer o establecer las prioridades de lo que es importante probar y lo que no debe probar. Las pruebas y la calidad del producto final son una responsabilidad, pero solo el cliente puede establecer de manera significativa las prioridades de las características, a menos que le hayan asignado explícitamente esta responsabilidad. Si no hay un equipo de control de calidad y no lo sabe, solicite al director del proyecto que lo averigüe y establezca las prioridades.

Las pruebas son un ejercicio de reducción de riesgos y el cliente/usuario sabrá lo que es importante y lo que no. El uso de un primer desarrollo impulsado por prueba de Extreme Programming será útil, por lo que tiene una buena base de prueba y puede realizar una prueba de regresión después de un cambio.

Es importante tener en cuenta que debido al código de selección natural puede volverse "inmune" a las pruebas. Code Complete dice que al corregir un defecto para escribir un caso de prueba y buscar defectos similares, también es una buena idea escribir un caso de prueba para detectar defectos similares.

+1

Decir que no es su responsabilidad solo porque no está en QA se está escapando. Donde trabajo, todos somos propietarios de funciones: somos responsables de dirigir nuestras funciones desde las especificaciones hasta el diseño, la implementación, las pruebas y finalmente la implementación. Puede usar la ayuda de otras personas, ¡pero es su responsabilidad! – ripper234

+0

No creo que haya sido lo suficientemente claro con lo que quise decir. Sin duda, es responsabilidad de un desarrollador garantizar la calidad en su trabajo y en el producto que se está creando, de lo que no es su responsabilidad hacer una llamada sobre las prioridades de las características si no se han dado. – StuperUser

0

Prefiero probar la unidad tanto como sea posible. Uno de los mayores efectos secundarios (aparte de aumentar la calidad de su código y ayudar a mantener algunos errores) es que, en mi opinión, las expectativas de la prueba unitaria alta requieren para cambiar la forma en que escriben el código para mejor. Al menos, así fue como funcionó para mí.

Mis clases son más coherentes, más fáciles de leer y mucho más flexibles porque están diseñadas para ser funcionales y comprobables.

Dicho esto, los requisitos de cobertura de prueba unitaria predeterminada del 90% (línea y rama) utilizando junit y cobertura (para Java). Cuando siento que estos requisitos no se pueden cumplir debido a la naturaleza de una clase específica (o errores en la cobertura), entonces hago excepciones.

Las pruebas unitarias comienzan con cobertura, y realmente funcionan para usted cuando las ha utilizado para probar las condiciones de contorno de forma realista. Para obtener consejos sobre cómo implementar ese objetivo, las otras respuestas tienen todo correcto.

0

This article ofrece algunas ideas muy interesantes sobre la eficacia de las pruebas de usuario con diferentes números de usuarios. Sugiere que puede encontrar aproximadamente dos tercios de sus errores con solo tres usuarios que prueban la aplicación, y hasta el 85% de sus errores con tan solo cinco usuarios.

Las pruebas unitarias son más difíciles de poner en un valor discreto. Una sugerencia a tener en cuenta es que las pruebas unitarias pueden ayudar a organizar sus ideas sobre cómo desarrollar el código que está probando. Una vez que haya escrito los requisitos para un fragmento de código y tenga una forma de verificarlo de manera confiable, puede escribirlo de manera más rápida y confiable. libro clásico

2

Gerald Weinberg "The Psychology of Computer Programming" tiene un montón de buenas historias sobre la prueba. Uno me gusta especialmente es en el capítulo 4" Programming as a Social Activity " 'Bill', pregunta un compañero de trabajo para revisar su código y se encuentra diecisiete errores en tan sólo trece declaraciones Las revisiones de código proporcionan ojos adicionales para ayudar a encontrar errores, cuantos más ojos utilices, más posibilidades tienes de encontrar errores sutiles. Como Linus dijo: "Teniendo suficientes ojos, todos los errores son superficiales", tus pruebas son básicamente ojos robóticos. quién revisará su código tantas veces como desee a cualquier hora del día o de la noche y le informará si todo sigue siendo kosher.

Cuántas pruebas son suficientes depende de si está desarrollando desde cero o manteniendo una sistema existente.

Al comenzar desde cero, no quiere pasar todo el tiempo escribiendo pruebas y termina fallando en la entrega porque el 10% de las características que pudo codificar se probaron exhaustivamente. Habrá cierta cantidad de priorización para hacer. Un ejemplo son los métodos privados. Como los métodos privados deben ser utilizados por el código visible de alguna forma (public/package/protected), se puede considerar que los métodos privados están cubiertos por las pruebas de los métodos más visibles. Aquí es donde debe incluir algunas pruebas de caja blanca si hay algunos comportamientos importantes u oscuros o casos extremos en el código privado.

Las pruebas deben ayudarlo a asegurarse de que 1) comprenda los requisitos, 2) respete las buenas prácticas de diseño al codificar la capacidad de prueba, y 3) sepa cuándo el código existente deja de funcionar. Si no puede describir una prueba para alguna función, estoy dispuesto a apostar que no comprende la función lo suficiente como para codificarla limpiamente. Usar el código de prueba unitaria te obliga a hacer cosas como pasar argumentos como cosas importantes como conexiones de bases de datos o fábricas de instancias en lugar de ceder a la tentación de dejar que la clase haga demasiado y convertirse en un objeto 'Dios'. Dejar que tu código sea tu canario significa que eres libre de escribir más código. Cuando falla una prueba anterior, significa una de dos cosas, ya sea que el código ya no cumpla con lo esperado o que los requisitos para la función hayan cambiado y la prueba simplemente necesite actualizarse para ajustarse a los nuevos requisitos.

Al trabajar con el código existente, debe poder mostrar que todos los escenarios conocidos están cubiertos para que cuando llegue la próxima solicitud de cambio o solución de error, pueda explorar el módulo que considere oportuno sin el persistente preocupación, "¿y si rompo algo?", que lleva a pasar más tiempo probando incluso las pequeñas correcciones, entonces fue necesario cambiar realmente el código.

Por lo tanto, no podemos ofrecerle un número de pruebas rápido pero debe buscar un nivel de cobertura que aumente la confianza en su capacidad para seguir realizando cambios o agregar características, de lo contrario probablemente haya alcanzado el punto de devoluciones disminuidas.

Cuestiones relacionadas