Es.
Incluso si solo realiza pruebas de unidad, no es raro tener más código dentro de las pruebas que el código realmente probado. No hay nada malo en ello.
Considera un código simple:
public void SayHello(string personName)
{
if (personName == null) throw new NullArgumentException("personName");
Console.WriteLine("Hello, {0}!", personName);
}
¿Cuáles serían las pruebas? Hay al menos cuatro casos simples para probar aquí:
-
El nombre de la persona es null
. ¿Se lanza realmente la excepción? Eso es al menos tres líneas de código de prueba para escribir.
-
El nombre de la persona es "Jeff"
. ¿Obtenemos "Hello, Jeff!"
en respuesta? Son cuatro líneas de código de prueba.
-
El nombre de la persona es una cadena vacía. ¿Qué salida esperamos? ¿Cuál es la salida real? Pregunta adicional: ¿coincide con los requisitos funcionales? Eso significa otras cuatro líneas de código para la prueba de la unidad.
-
El nombre de la persona es lo suficientemente corto para una cadena, pero es demasiado largo para combinarlo con "Hello, "
y el signo de exclamación. ¿Qué pasa? ¹
Esto requiere una gran cantidad de código de prueba. Además, las piezas de código más elementales a menudo requieren un código de configuración que inicializa los objetos necesarios para el código en prueba, lo que a menudo también conduce a la escritura de talones y simulacros, etc.
Si la proporción es muy grande, en cuyo caso puede verificar algunas cosas:
-
¿Hay duplicación de código en las pruebas? El hecho de que sea el código de prueba no significa que el código se deba duplicar (copiar y pegar) entre pruebas similares: tal duplicación dificultará el mantenimiento de esas pruebas.
-
¿Hay pruebas redundantes? Como regla general, si elimina una prueba de unidad, la cobertura de la rama debería disminuir. Si no lo hace, puede indicar que la prueba no es necesaria, ya que las rutas ya están cubiertas por otras pruebas.
-
¿Está probando solo el código que debe probar? No se espera que pruebe el marco subyacente de las bibliotecas de terceros, sino exclusivamente el código del propio proyecto. .
Con las pruebas de humo, las pruebas de sistema e integración, las pruebas funcionales y de aceptación y las pruebas de carga y carga, agrega aún más código de prueba, por lo que no debería preocuparse tener cuatro o cinco pruebas de LOC para cada LOC de código real. acerca de.
Una nota sobre TDD
Si le preocupa el tiempo que lleva probar su código, es posible que lo esté haciendo mal, ese es el código primero, y luego las pruebas. En este caso, TDD puede ayudarlo alentarlo a trabajar en iteraciones de 15 a 45 segundos, cambiando entre el código y las pruebas. De acuerdo con los defensores de TDD, acelera el proceso de desarrollo al reducir tanto la cantidad de pruebas que necesita realizar como, lo que es más importante, la cantidad de código de negocio que se debe escribir y, especialmente, reescribir para las pruebas. / p>
¹ Sea n la la longitud máxima de una cadena . Podemos llamar a SayHello
y pasar por referencia una cadena de longitud n - 1 que debería funcionar bien. Ahora, en el paso Console.WriteLine
, el formato debe terminar con una cadena de longitud n + 8, lo que resultará en una excepción. Posiblemente, debido a los límites de memoria, incluso una cadena que contenga n / 2 caracteres dará lugar a una excepción. La pregunta que debe hacerse es si esta cuarta prueba es una prueba unitaria (parece que es una, pero puede tener un impacto mucho mayor en términos de recursos en comparación con las pruebas unitarias promedio) y si prueba el código real o el marco subyacente.