2010-03-29 23 views
20

Recientemente, mi mentor en el trabajo me ha presentado el enfoque del desarrollo basado en pruebas, y me anima a escribir una prueba unitaria cuando "tiene sentido". Comprendo algunos de los beneficios de tener un conjunto de pruebas unitarias durante la prueba de regresión y la refracción, pero me pregunto con qué frecuencia y cómo deberíamos escribir pruebas unitarias.¿Con qué frecuencia deberíamos escribir pruebas unitarias?

Mi guía de mentor/desarrollador me pide que escriba un nuevo caso de prueba unitario para un flujo de control recién escrito en un método que ya está siendo probado por la clase de prueba existente, y creo que es una exageración. ¿Con qué frecuencia escribes tus pruebas de unidad, y qué tan detallada crees que deberían ser las pruebas de tu unidad? ¡Gracias!

+0

¿Esto realmente es TDD, o solo una unidad de prueba? – quamrana

Respuesta

23

Técnicamente, si está siguiendo un estricto desarrollo impulsado por prueba ... debe escribir sus pruebas de unidad después de haber especificado una parte de su aplicación. Usted debe ir a:

Requisitos del usuario -> Diseño Función -> Pruebas de la unidad -> Código

recuerda, Las pruebas vienen antes de Código de TDD.

+0

Y una buena ilustración aquí: http://blog.typemock.com/2008/12/starting-test-driven-development-using.html – karlipoppins

+0

-1: Si está siguiendo un estricto desarrollo basado en pruebas, el código se produce en un ciclo de * Prueba * (en singular) -> Código -> Refactorio -> Otra * Prueba *, no todas las pruebas antes del código. – quamrana

0

Como dijo Justin, debe escribir su prueba unitaria antes de escribir el código.

Si bien esto es probablemente lo mejor que se puede hacer, en algún momento es excesivo. Dependiendo del proyecto, a veces escribo una prueba unitaria solo por cada error que encuentro (y resuelvo).

Claro, probablemente echo de menos algunos de ellos, pero mi unidad de pruebas se vuelve cada vez más eficiente con el tiempo y estoy bastante seguro de que nunca voy a perder un error corregido.

1

Las pruebas unitarias deben darle confianza, que el código que escribe, hace lo que quiere. Por lo tanto, debe escribir tantas pruebas como sea necesario para darle esta confianza.

0

pruebas unitarias:

  • le dará la confianza para hacer cambios de refactorización a sabiendas de que usted no está rompiendo ninguna otra cosa.
  • actúan como una especie de "documentación viviente" de su código, lo que permite a otros saber exactamente cómo se comportará el código en diversas circunstancias.
  • al seguir un TDD estricto como se describe en @Justin, pasar todas las pruebas de unidad escritas antes de comenzar a escribir el código le hará saber cuándo está "terminado" la codificación. En mi experiencia, esto también conduce a un código simplificado y más fácil de entender (más limpio).

Como mencione su mentor, solo debe escribir pruebas unitarias que tengan sentido. La regla de oro que uso es que intento escribir pruebas unitarias para piezas de código que ejecutan lógica comercial. Por lo general, no escribo pruebas unitarias para las clases de frijoles con poco más que getters y setters.

Las pruebas unitarias generalmente se vuelven más valiosas con el tiempo a medida que se expanden y mejoran para tratar las correcciones de errores y otras mejoras de código realizadas después de la entrega inicial.

5

Debe escribir una prueba unitaria siempre que escriba cualquier código. Y, como otros han señalado, en TDD escribe las pruebas antes de escribe el código.

Si cree que es excesivo, pregúntese "si no pruebo este código, ¿cómo sé si funciona?"

+0

El único problema es que las pruebas de escritura tampoco le dicen que funcione, solo que pasa las pruebas en las que haya pensado. – darron

+0

@darron es por eso que basa las pruebas en un diseño funcional. Las pruebas le dicen que cumple con los requisitos. –

+0

@Jack: una prueba exitosa indica que el código hace lo que espera la prueba y no es garantía de que se cumplan los requisitos reales. Uno de los problemas más comunes que encuentro al verificar errores en nuestro software es que el desarrollador malinterpretó los requisitos, escribió pruebas incorrectas, luego código incorrecto y por lo tanto tuvo la impresión de que todo estaba bien, ya que las pruebas no están fallando. – jarnbjo

0

Hay una cosa fundamental acerca de las pruebas unitarias cuando se realiza el desarrollo impulsado por prueba, es decir, que la unidad prueba describe la funcionalidad. Si la prueba no define, p. cómo se comportan las entradas nulas, entonces no se puede esperar que funcione.

1

Escribir pruebas, y lo más importante, el código comprobable es una habilidad independiente, al igual que aprender a programar cada nuevo idioma es una habilidad independiente.

el blog Leer Miško Hevery 's, leer algunos libros (me gustó Test Driven por Lasse Koskela), utilizar algunas herramientas de cobertura de código como Clover, y luego escribir algunas pruebas.

A medida que escribe las pruebas, sus habilidades de prueba mejorarán, y usted comprenderá lo que implica escribir un código comprobable. Luego podrá conocer para su proyecto particular el nivel de cobertura del código que se requiere.

2

Mi plomo maestro/desarrollo me pide que escriba una nueva prueba de caja de la unidad de control que se ha escrito flujo

¿Cómo surgió que el flujo de control a ser escrito, a menos que se necesitaba para aprobar una prueba de falla? Por el definition of TDD, ningún código de producción llegará a existir, a menos que exista primero una prueba de falla que requiera la escritura de ese trozo de código. Así que debe haber estado escribiendo el código usando alguna técnica de última prueba y no TDD.

Te recomiendo que leas el artículo The Art of Agile Development: Test-Driven Development. Puede practicar TDD usando this tutorial.

Creo que su mentor con la frase "siempre que tenga sentido" puede ser perjudicial, especialmente para las personas nuevas en TDD, porque no es posible tomar una buena decisión al respecto hasta después de muchos años de experiencia, después de uno ha llegado a Ri-level. En una ocasión, al Kent Beck decided to not write a test, Ron Jeffries comentó lo siguiente: "Confío en usted y en otras tres personas para tomar buenas decisiones a corto plazo".

Siempre debe escribir primero una prueba. Todo lo que pueda romperse requiere una prueba. Solo las cosas que nunca podrían romperse, debido a que alguien cambia el código, no necesitan pruebas. Por ejemplo, el código declarativo rara vez se rompe: el código de diseño HTML estático en una página web generalmente no vale la pena probarlo automáticamente (debe probarlo manualmente para ver si se ve bien), pero vale la pena probar cualquier elemento dinámico.

0

Siempre debe escribir una prueba, si su conjunto de pruebas existente es insuficiente. La mejor señal, que tus pruebas no son suficientes, son errores. Entonces, una buena práctica es escribir una prueba unitaria por cada error que encuentre. Con el desarrollo basado en pruebas, debe comenzar con algunas pruebas, definir la funcionalidad de una clase. Test-Cobertura-Herramientas le da algunas pistas, qué partes podrían necesitar más pruebas.

0

El derecho/respuesta exhaustiva a esta pregunta debe ser siempre que sea cuestión clave para cada proceso de pruebas, pero voy a responder con simples reglas siguientes (?):

  1. Si algún caso de uso es importante escriba la prueba por separado para que alguien más (o usted en el futuro) pueda detectar ese caso al leer o fallar las pruebas.

  2. Si se preguntan por más de 5 segundos si algo es importante suficiente para probar o no, entonces supongo que es :-)

  3. Si por casualidad las pruebas de este caso es muy difícil/costoso quejan esto a su gerente/líder técnico y omita escribir la prueba.

0

Personaly Puedo utilizar las pruebas unitarias, cuando tengo datos masivos, y yo no quiero copiar/pegar un montón de System.out.println, y comprobar ellos uno a uno. Con las pruebas de Unidad, pierde 1 hora para escribirlas, y guarda muchas pruebas. Para cosas triviales, prefiero usar la técnica de impresión, o verificar las variables de depuración.

1

Yo también me he convertido en un converso reciente a TDD y me resulta extremadamente útil. La idea es tal que tan pronto como tenga una especificación, empiece a escribir pruebas unitarias. Una vez que se hayan escrito sus pruebas, una gran mayoría de su código puede provenir de esas pruebas. Lo que queda en tus pruebas es la base de tus afirmaciones y entonces tienes un patrón repetible muy bueno para: escribir prueba, implementar código, confirmar a través de afirmaciones, continuar. ¡Buen material!