unit-testing - test - tipos de pruebas unitarias
¿Qué es una prueba unitaria y cómo lo haces? (7)
Duplicado exacto de muchas publicaciones:
¿Qué es la prueba unitaria?
¿Qué hace una buena prueba de unidad?
Nuevo en pruebas unitarias
Pruebas unitarias - definiciones
Pruebas de unidades de aprendizaje
Cómo burlarse y probar la unidad
Pruebas unitarias: preguntas para principiantes
Y muchos más ...
Además, Google para el sitio: stackoverflow.com "cómo hacer" prueba de la unidad
He leído algunas preguntas sobre pruebas unitarias, pero no sé exactamente qué es o cómo lo haces. Esperaba que alguien me dijera lo siguiente:
- ¿Qué es exactamente la prueba de unidad IS? ¿Está integrado en el código o se ejecuta como programas separados? ¿O algo mas?
- ¿Cómo lo haces?
- ¿Cuándo debería hacerse? ¿Hay momentos o proyectos para no hacerlo? ¿Es todo comprobable por unidad?
Muchas gracias por la ayuda.
¿Qué es exactamente la prueba de unidad IS? ¿Está integrado en el código o se ejecuta como programas separados? ¿O algo mas?
Desde MSDN : el objetivo principal de las pruebas unitarias es tomar la pieza más pequeña de software comprobable en la aplicación, aislarla del resto del código y determinar si se comporta exactamente como esperabas.
Básicamente, estás escribiendo pequeñas partes de código para probar los bits individuales de tu código. En el mundo de .net, podría ejecutar estos pequeños bits de código usando algo como NUnit o MBunit o incluso las herramientas de prueba incorporadas en Visual Studio. En Java, puedes usar JUnit. Esencialmente, los corredores de prueba construirán su proyecto, cargarán y ejecutarán las pruebas unitarias y luego le informarán si pasan o fallan.
¿Cómo lo haces?
Bueno, es más fácil decirlo que hacerlo para probar la unidad. Se necesita un poco de práctica para ser bueno en eso. Necesita estructurar su código de una manera que haga que la prueba unitaria sea fácil para que sus pruebas sean efectivas.
¿Cuándo debería hacerse? ¿Hay momentos o proyectos para no hacerlo? ¿Es todo comprobable por unidad?
Deberías hacerlo donde tenga sentido. No todo es adecuado para pruebas unitarias. Por ejemplo, el código de UI es muy difícil de probar por unidad y a menudo obtiene pocos beneficios al hacerlo. Sin embargo, el código Business Layer a menudo es muy adecuado para las pruebas y es allí donde se concentra la mayoría de las pruebas unitarias.
Las pruebas unitarias son un tema masivo y para obtener una comprensión completa de cómo puede beneficiarlo mejor, le recomiendo obtener un libro sobre pruebas unitarias, como " Desarrollo basado en pruebas mediante el ejemplo ", que le dará una buena comprensión de los conceptos. y cómo puede aplicarlos a su código.
¿Qué es la prueba unitaria?
La prueba unitaria simplemente verifica que las unidades individuales de código (principalmente funciones) funcionan como se espera. Usualmente usted escribe los casos de prueba usted mismo, pero algunos pueden generarse automáticamente.
El resultado de una prueba puede ser tan simple como una salida de consola, a una " luz verde " en una GUI como NUnit , o un marco de lenguaje diferente específico.
La realización de pruebas unitarias está diseñada para ser simple, generalmente las pruebas se escriben en forma de funciones que determinarán si un valor devuelto es igual al valor que esperabas cuando escribiste la función (o el valor que esperarás cuando finalmente lo escribas) esto se llama Desarrollo controlado por prueba cuando primero escribe las pruebas).
¿Cómo se realizan las pruebas unitarias?
Imagine una función muy simple que le gustaría probar:
int CombineNumbers(int a, int b) {
return a+b;
}
El código de prueba de la unidad se vería así:
void TestCombineNumbers() {
Assert.IsEqual(CombineNumbers(5, 10), 15); // Assert is an object that is part of your test framework
Assert.IsEqual(CombineNumbers(1000, -100), 900);
}
Cuando realice las pruebas, se le informará que estas pruebas han pasado. Ahora que ha creado y ejecutado las pruebas, sabe que esta función o unidad en particular funcionará como espera.
Ahora imagine que viene otro desarrollador y cambia la función CombineNumbers()
por rendimiento, o por algún otro motivo:
int CombineNumbers(int a, int b) {
return a * b;
}
Cuando el desarrollador ejecuta las pruebas que ha creado para esta función muy simple, verán que el primer Assert
falla, y ahora saben que la compilación está rota.
¿Cuándo debe realizar las pruebas unitarias?
Deben hacerse tan a menudo como sea posible. Cuando realiza pruebas como parte del proceso de desarrollo, su código se diseñará automáticamente mejor que si acaba de escribir las funciones y luego se mueve. Además, conceptos como Dependency Injection van a evolucionar de forma natural en su código.
El beneficio más obvio es saber, en el futuro, que cuando se realiza un cambio, ninguna otra unidad de código se vio afectada si todos pasan las pruebas.
¿Qué es prueba unitaria? Es complicado de definir. A nivel técnico, construyes funciones que llaman funciones en tu base de código y validan los resultados. Básicamente, obtienes un montón de cosas como "assert (5 + 3) == 8", simplemente más complicado (como en DataLayer (MockDatabase ()). GetUser (). Name == "Dilbert"). En el nivel de vista de herramienta, agrega una verificación automatizada específica del proyecto si todo sigue funcionando como si supusiera que las cosas funcionaron. Esto es muy, muy útil si se refactoriza y si implementa algoritmos complicados. El resultado generalmente es un montón de documentación y muchos menos errores, porque el comportamiento del código está fijado.
Construyo casos de prueba para todos los casos extremos y los ejecuto de manera similar al funcionamiento de un recolector de basura generacional. Mientras implemento una clase, solo corro los casos de prueba que involucran a la clase. Una vez que termine de trabajar en esa clase, ejecuto todos los tests de unidad para ver si todo funciona.
Debe probar tanto como sea posible, siempre que el código de prueba sea lo suficientemente fácil como para no ser probado. Dado que, no, no todo es comprobable de una manera sensata. Piensa en las interfaces de usuario. Piensa en un conductor para un transbordador espacial o una bomba nuclear (al menos no con pruebas JUnit puras;)). Sin embargo, muchos y muchos códigos son verificables. Las estructuras de datos son Los algoritmos son La mayoría de las clases de Applicationlogic son. ¡Pruébalo!
HTH. tetha
En la parte "Cómo hacerlo":
Creo que la introducción a ScalaTest hace un buen trabajo al ilustrar diferentes estilos de pruebas unitarias.
En la parte "Cuándo hacerlo":
Las pruebas unitarias no son solo para probar. Al hacer las pruebas unitarias, también forzará el diseño del software a algo que sea comprobable por unidad. Muchas personas opinan que este diseño es, en su mayoría, Good Design (TM), independientemente de otros beneficios de las pruebas.
Entonces, una razón para hacer una prueba unitaria es forzar su diseño a algo que, con suerte, será más fácil de mantener que lo que sería si no lo hubiera diseñado para pruebas unitarias.
Encuentro que la manera más fácil de ilustrarlo es mirar algún código. Esta página de introducción en el sitio NUnit es una buena introducción al qué y cómo
http://www.nunit.org/index.php?p=quickStart&r=2.5
¿Todo es comprobable? En general, si calcula algo, entonces sí. Sin embargo, el código de la UI es un problema completamente diferente, ya que simular que los usuarios hagan clic en los botones es complicado.
¿Qué debería probar? Tiendo a escribir pruebas sobre las cosas que sé que van a ser difíciles. Transiciones de estado complicadas, cálculos críticos de negocios, ese tipo de cosas. En general, no estoy demasiado preocupado por probar cosas básicas de entrada / salida, aunque los puristas sin duda dirán que estoy equivocado en ese frente y todo debería probarse. Como tantas otras cosas, ¡no hay una respuesta correcta!
Las pruebas unitarias implican dividir su programa en piezas y someter cada pieza a una serie de pruebas.
Por lo general, las pruebas se ejecutan como programas separados, pero el método de prueba varía según el idioma y el tipo de software (GUI, línea de comandos, biblioteca).
La mayoría de los idiomas tienen marcos de pruebas unitarias , debe buscar uno para los suyos.
Las pruebas generalmente se ejecutan periódicamente, a menudo después de cada cambio en el código fuente. Cuantas más veces, mejor, porque antes detectarás problemas.
Qué...
Una metodología para probar código automáticamente contra una batería de pruebas, diseñado para aplicar los resultados deseados y gestionar el cambio.
Una "unidad" en este sentido es el componente atómico más pequeño del código que tiene sentido para probar, por lo general un método de alguna clase, por ejemplo. Parte de este proceso es la creación de objetos auxiliares (o "simulacros") que le permiten trabajar con una unidad como un objeto independiente.
Cómo...
Casi siempre, el proceso de pruebas unitarias está integrado en un IDE (o mediante extensiones) de manera que ejecuta las pruebas con cada compilación. Existe una serie de marcos para ayudar a la creación de pruebas unitarias (y de hecho simulacros de objeciones), a menudo denominadas unidad foo (cf jUnit, xUnit, nUnit). Estos marcos proporcionan una forma formal de crear pruebas.
Como proceso, el desarrollo impulsado por prueba (TDD) a menudo es la motivación para la prueba unitaria (pero la prueba unitaria no requiere TDD) que supone que las pruebas forman parte de la definición de la especificación y, por lo tanto, requiere que se escriban primero, con código solo escrito para "resolver" estas pruebas.
Cuando...
Casi siempre Es posible que los proyectos muy pequeños y desechables no valen la pena, pero solo si está seguro de que realmente son desechables. En teoría, cada programa orientado a objetos se puede probar por unidades, pero algunas pautas de diseño lo hacen difícil. Notoriamente, el patrón de singleton es problemático, donde los marcos de inyección de dependencias están muy orientados a las pruebas unitarias.