.net - tipos - pruebas unitarias visual studio 2017
¿Pruebas unitarias o funcionales? (8)
Recientemente he oído hablar de Pruebas funcionales sobre Pruebas unitarias.
Entiendo que Unit Testing prueba cada una de las posibilidades de una determinada pieza de código desde su forma más atómica. Pero ¿qué pasa con las pruebas funcionales?
Esto me parece que solo prueba si el código funciona, pero ¿es tan confiable como la prueba de unidad?
Me han dicho que había dos escuelas de pensamiento para el asunto. Los cereales preferirían la prueba unitaria, otras pruebas funcionales.
¿Hay buenos recursos, enlaces, libros, referencias o alguno de ustedes que pueda explicar y aclarar mi camino en el tema?
¡Gracias!
Hay un lugar para ambos en la mayoría del trabajo de desarrollo.
Las pruebas unitarias están ahí para probar pequeñas unidades de código, para ver que funcionen como se espera.
Las pruebas funcionales están ahí para probar que la funcionalidad general del sistema es la esperada.
Están en diferentes niveles y ambos deben ser utilizados.
La respuesta de Jason es correcta. Los diferentes tipos de pruebas tienen diferentes propósitos, y se pueden colocar en capas para obtener los mejores resultados (buen diseño, cumplimiento de especificaciones, defectos reducidos).
- Prueba de unidad = diseño de unidades (con desarrollo impulsado por prueba o TDD)
- Pruebas de integración = hacer que todas las piezas trabajen juntas.
- Pruebas de aceptación del cliente = ¿Cumple con los requisitos del cliente?
- Pruebas manuales = a menudo cubre la interfaz de usuario; probadores dedicados pueden encontrar lo que la automatización pierde
- Pruebas de carga = qué tan bien funciona el sistema con cantidades realistas de datos
Hay alguna superposición entre estas categorías; Las pruebas unitarias pueden especificar el comportamiento, por ejemplo.
Y hay otros; para más de lo que la mayoría de la gente quiere saber, consulte Pruebas de software .
Un punto que la gente perdió es que las pruebas de unidad están probando piezas de código de forma aislada . Las buenas pruebas unitarias no llegan a la base de datos, por ejemplo. Esto tiene dos ventajas: hace que las pruebas se ejecuten rápido, por lo que las ejecutará más a menudo y lo obliga a escribir clases acopladas libremente (mejor diseño).
Pediste recursos; Recomiendo el libro de Roy Osherove The Art of Unit Testing con ejemplos en .NET . Si bien ningún libro es perfecto, este ofrece muchos consejos excelentes para escribir buenas pruebas.
EDITAR: Y para escribir pruebas contra el software existente, nada mejor que el libro de Michael Feathers Trabajando efectivamente con el código heredado .
Las pruebas funcionales, también llamadas Pruebas del sistema , tienen como objetivo probar el sistema completo y verificar que se cumplan los requisitos funcionales.
Las pruebas unitarias tienen como objetivo probar las "unidades", es decir, las funciones o los métodos a partir de los cuales se construye el sistema de forma aislada . A veces se llama prueba de desarrollador. La prueba de unidad puede ser difícil después del hecho, por eso TDD escribe la prueba antes del código.
Esos son complementarios, ya que las unidades pueden trabajar de forma independiente y no cuando se integran todas juntas, o pueden pasar las pruebas unitarias y no cumplir con todos los requisitos del producto.
Las pruebas unitarias prueban sus unidades de código (métodos, etc.) para asegurarse de que hacen lo que usted espera que hagan.
Las pruebas funcionales prueban el diseño de su sistema para asegurarse de que las piezas interactúen correctamente. Si escribe un comando que toma e int y devuelve una cadena y la prueba completamente, puede estar seguro de que funciona. Pero si no tiene pruebas del sistema, es posible que nunca note que el resto del código cree que puede aceptar un valor nulo, pero no puede.
Ambos tipos de pruebas son importantes.
Edición: Para agregar una vista ligeramente diferente a lo que gbjbaanb dijo:
- Prueba de unidad = mi código funciona
- Prueba funcional = mi diseño funciona
- Prueba de integración = mi código está usando tus cosas de terceros correctamente (bases de datos, etc.)
- Prueba de aceptación de fábrica = mi sistema funciona
- Prueba de aceptación del sitio = su código apesta, ¡¡esto no es lo que pedí!?!
Las pruebas unitarias y las pruebas funcionales tienen dos resultados diferentes.
La prueba de unidad verifica que una pequeña pieza de código funciona como se espera. El desarrollador generalmente lo hace para asegurarse de que el código funcione correctamente. Por lo general, también están automatizados por un marco de prueba.
Las pruebas funcionales verifican que una característica funciona como se espera al atravesar un determinado camino a través del programa. Por lo general, son ejecutados por una persona en el software, lo que garantiza que el programa funcionará de la manera que se supone para el usuario. Como tal, es de nivel superior y, por lo tanto, prueba varias unidades a la vez.
Creo que ambos son importantes. Sin embargo, si tiene recursos limitados y tiene que elegir / elegir técnicas, y creo que depende de los productos que cree, pero para lo que hago (los productos de control de automóviles usados por los seres humanos a través de algunos botones) las pruebas funcionales son las más importantes. Comprueba y garantiza que cuando el usuario obtiene el producto, hace lo que se supone que debe hacer. Esto no significa que debamos excluirnos de las pruebas unitarias, pero si se trata de una tarea fácil, lo más importante es garantizar que la experiencia del usuario sea excelente y que el producto salga a la luz.
Si produce, por ejemplo, un motor de base de datos (o algún otro producto que no sea necesariamente para el usuario), la prueba de unidad puede ser lo que realmente debe hacer.
Una prueba unitaria prueba una parte del código y confirma a un programador que otra parte del código está haciendo lo que se supone que debe hacer. En el desarrollo dirigido por pruebas, la prueba de la unidad se escribe primero y se observa que falla, antes de que se escriba el código que hace que la prueba pase. Los programadores están interesados en Pruebas Unitarias. La prueba unitaria es rápida de ejecutar.
Una prueba de función prueba su requisito de caja negra y demuestra que una parte de la funcionalidad del usuario está en su lugar. Por ejemplo, si presiono el botón rojo grande, la campana comienza a sonar. La prueba funcional podría no ser un código de prueba. Quizás haya un proceso mecánico que haga que suene la campana al presionar el botón. Los clientes están interesados en las pruebas funcionales, ya que confirman que se trata de un proceso de alto nivel si funcionan de una manera que comprenden. A menudo son lentos de ejecutar.
La prueba unitaria frente a la prueba funcional no es un xor
, sino más bien un and
. La prueba de unidad consiste en probar las unidades de forma aislada, mientras que la prueba funcional consiste en probar el conjunto en integración (¿todas las unidades funcionan juntas correctamente?).
Ambos son componentes necesarios de buenas prácticas de ingeniería de software.
- Prueba unitaria = más baja, nivel granular.
- Prueba funcional = nivel medio, modular.
- Prueba de integración = nivel de aplicación superior.
- Prueba de aceptación de fábrica = ver que todo funcione
- Prueba de aceptación del sitio = verlo fallar todo :)
Todo lo anterior es útil pero no son mutuamente excluyentes. Debería estar haciendo la mayoría de ellos, pero la cantidad de tiempo que gasta en cada parte depende de los resultados que obtenga de ellos, eso es todo. Si su código es demasiado modular para ser fácilmente probado en una unidad, entonces dedique sus esfuerzos a las pruebas funcionales. Si estás escribiendo una biblioteca de componentes pequeños, pasa tu tiempo en la unidad probándolos, y si estás escribiendo sistemas de control para misiles militares, definitivamente deberías probar la aceptación del sitio (ya que las explosiones, incluso cuando falla, son divertidas :))