¿Cómo utilizar las pruebas unitarias como fuente de información?

8

Un colega mío estuvo una vez en un seminario sobre desarrollo ágil, donde escuchó que es posible usar pruebas unitarias como documentación técnica. Algo así como usar pruebas unitarias como un ejemplo de cómo usar la clase.

Una búsqueda rápida en Google proporcionó TDD y documentación , lo que demuestra que debería ser posible. Pero mirando nuestro código, veo que obviamente no pudimos implementar pruebas unitarias de esa manera.

En mi opinión, las pruebas unitarias están ahí para probar el código como una unidad mínima, incluso con la ayuda de clases y funciones simuladas y falsas.

Entonces, las preguntas son:

  • ¿No es tarea de las pruebas funcionales mostrar cómo se debe usar una clase (o conjunto de clases)?
  • Si es posible utilizar pruebas unitarias como documentación técnica, ¿hay algunas pautas sobre cómo implementar dichas pruebas unitarias?
BЈовић
fuente
2
Las pruebas unitarias son una fuente de documentación, pero a menudo no deberían ser la única fuente.
Garrett Hall
"Pero al mirar nuestro código, veo que obviamente no pudimos implementar pruebas unitarias de esa manera". ...? ¿Significa que sus pruebas unitarias no son entendibles como código de ejemplo?
Steven Jeuris
@StevenJeuris Tenemos muchas pruebas unitarias de c ++, y algunas son largas (más de 30 líneas). Nunca examiné las pruebas unitarias para ver cómo se usa la clase. Para eso utilicé la documentación de doxygen que tenemos y el código (donde se usa una clase específica), y traté de entender del código de la clase lo que está haciendo. Esto es algo nuevo para mí
B 17овић

Respuestas:

10

Si está aplicando TDD, entonces cada prueba unitaria que escribió corresponde a una funcionalidad de una clase. Entonces, a medida que escribe pruebas, en realidad está creando las funcionalidades de clase, las dependencias, las excepciones y también la documentación de la clase.

Si no está aplicando TDD, las pruebas unitarias le darán una idea sobre la clase y lo que hace. Los nombres de las pruebas unitarias son muy descriptivos, por lo que no necesita crear una documentación principalmente.

Considere una prueba unitaria como

public void Customer_Service_Can_Register_New_Customers(){...}
public void Customer_Service_Cannot_Register_Customers_With_Duplicate_Emails(){...}

Estos son métodos descriptivos y fáciles de leer también. Entonces también sirven como documentación.

Mert Akcakaya
fuente
4

Las pruebas unitarias, si están bien escritas, sirven como documentación de una clase o método o lo que sea.

Las bien escritas conducen a una mayor comprensión al ser fácil de entender lo que están probando, pero incluso las pruebas deficientes le dan al lector una idea de cómo se supone que debe actuar la cosa que se está probando y qué cosas el autor pensó que era importante probar.

Heck, se me conoce por escribir pruebas unitarias para bibliotecas externas, no porque necesiten pruebas, sino porque quiero asegurarme de que mi comprensión de la biblioteca es correcta. Y en el futuro, si alguien tiene preguntas sobre cómo estoy usando las cosas, bueno, eso entiendo, justo en el código de prueba.

Michael Kohne
fuente
3
¡Buena sugerencia sobre pruebas para código externo!
1
Las pruebas que verifican su comprensión de una biblioteca se conocen como Pruebas de caracterización .
Carl Manaster
2
@CarlManaster: creo que me gusta el término Prueba de aprendizaje un poco mejor: sé que Feathers los agrupa con las Pruebas de caracterización, pero creo que es útil distinguir las pruebas destinadas a permitirte cambiar algo de forma segura (Pruebas de caracterización) de las pruebas que solo dicen usted acerca de algo
Michael Kohne
2

Si bien las pruebas funcionales pueden ayudarlo a comprender toda una funcionalidad, una prueba unitaria puede ayudarlo a comprender un pequeño alcance de código (como un solo método).

Las buenas pruebas unitarias también servirán como buena documentación técnica, y hay algunas cosas que pueden ayudar a escribir pruebas buenas, simples y útiles. Los dos puntos más importantes que he encontrado son

  • Asegúrese de que todas sus pruebas sean independientes. Debería poder ejecutar cualquier subconjunto de pruebas, en cualquier orden.

  • Asegúrese de probar solo una cosa en cada prueba. Esto mantiene sus pruebas específicas, simples, pero no frágiles.

Oleksi
fuente
2

La idea de las pruebas como criterios de aceptación / documentación es excelente. Sin embargo, las pruebas unitarias tienden a centrarse en el diseño de arquitectura / código en lugar de historias de usuarios; tratar de documentar casos o requisitos de uso de nivel superior puede ser incómodo. No lo he investigado mucho (todavía), pero el desarrollo impulsado por el comportamiento podría ayudar con ese problema.

ptyx
fuente
1

Encuentro ejemplos mucho más fáciles de aprender que la documentación y las pruebas unitarias sirven como tal. No solo eso, sino que me muestran, por ejemplo, qué NO hacer con una unidad.

Sin embargo, no pueden ser la única forma de documentación. Uno debe darse cuenta de que todos los cerebros funcionan de manera diferente. Esa es una cosa que creo que las personas que recomiendan usar JUST pruebas unitarias como su documentación o SOLO el código se pierden por completo. Aún más conmovedor es el hecho de que incluso los cerebros individuales aprenden cosas diferentes de diferentes medios. Aprendo algo completamente diferente de un diagrama de clase de lo que hago solo mirando el código o leyendo documentos de API.

Pero al final del día, si los diagramas y los documentos API son todo lo que tienes, entonces probablemente estoy jodido. Necesito ejemplos Necesito ver que algo se use. Podría buscar el código para esto, y sin ningún otro ejemplo con el que estoy atrapado, pero esto nunca me dirá tanto como una buena prueba de unidad.

Edward extraño
fuente
0

Las pruebas de hoy son todo un desastre de terminología donde diferentes personas significan cosas ligeramente diferentes y las definiciones han cambiado con el tiempo.

Por ejemplo, TDD solía ser algo que ahora se llama BDD. La distinción se debe a que lo que era la prueba unitaria a través del desarrollo basado en pruebas es ahora un enfoque mucho más detallado para los métodos de prueba (generalmente generados por herramientas automatizadas). Lo que solía ser TDD era una forma un poco más gruesa de probar unidades del tamaño de clases, lo que creo que ahora se llama prueba funcional.

La idea de que puede usar (alguna forma de) prueba es que puede escribir una prueba que se parezca a cómo el usuario usaría una unidad de su código. Se convierte en un ejemplo para los documentos y una prueba al mismo tiempo.

Entonces, si tuviera una clase de red simple (por ejemplo). En lugar de probar cada método individualmente, se acercaría a la prueba de que la clase es la unidad que necesita prueba. Luego, su prueba de unidad ejercitaría toda la unidad llamando al método para inicializar el objeto, configurando el host y el puerto, y llamando a un método para enviar datos, posiblemente llamando a un método para recibir también.

Todo eso puede caber en una única 'prueba unitaria' que probaría el objeto configurándolo en un estado configurado y haciendo que funcione. Otras pruebas unitarias lo ejercitarían con datos incorrectos, pero no es necesario incluirlos en la documentación.

Hoy en día, esto no se considera prueba de unidad, pero todo se reduce a su definición de unidad.

gbjbaanb
fuente
Las pruebas unitarias y las pruebas funcionales son cosas diferentes. Si comienza a abrir y cerrar conexiones y utiliza recursos reales, está realizando pruebas funcionales, y esas pruebas son lentas, mientras que las pruebas unitarias tienen que ser muy rápidas.
B 3овић
1
Te has metido en la exageración de las pruebas unitarias. No se supone que sean pequeños, rápidos o cualquier otra cosa que no sea un medio para probar una unidad de código de forma aislada. Todo lo demás está hecho para hacer que las herramientas agrupadas parezcan correctas. Pueden ser lentos y correr a diario, y grandes y llenos de ejemplos para trabajar una clase a fondo. No existe una definición definida simplista de una prueba unitaria. No se obsesione con alguna definición arbitraria de lo que se supone que debe hacer, pruebe su código de forma aislada, burlándose o tropezando con conexiones externas y tendrá buenas pruebas.
gbjbaanb