¿Hasta qué punto debería probar lo que no debería ocurrir?

7

En el caso de las pruebas unitarias, estoy probando tantos casos como puedo que cuando hago X , Y sucede.

También me preocupa en algunos casos que cuando hago X , Z no sucede.

Pero por el bien de la protección, también podría probar que A, B, C ... tampoco ocurren. Y siguiendo esa dirección, básicamente podría probar mil millones de cosas que no deberían suceder y, en muchos casos, nunca sucederán.

Mi pregunta es: ¿en qué momento crees que estás siendo demasiado a la defensiva y cuándo es todavía útil?

Usemos este bit de pseudo código como ejemplo

void MyFunction()
{
    if (X)
    {
        A();
    }
    else
    {
        B();
    }

    C();
}

void AnotherFunction()
{
   //Irrelevant code
}

Aquí están las pruebas que puedo tener:

  • A sucede cuando X es verdadera
  • A no sucede cuando X es falso
  • B no sucede cuando X es verdadera
  • B sucede cuando X es falso
  • C ocurre cuando X es verdadera
  • C ocurre cuando X es falso

Esto es lo que yo haría. Pero siguiendo ese razonamiento, también podría probar que no se llama a AnotherFunction cuando X es verdadera o falsa, al igual que estoy probando que C se llama cuando X es verdadera y falsa o que A / B no se llama cuando X es falsa / verdadero.

Y siguiendo ese camino, literalmente podría probar un millón de cosas que no deberían suceder en cada caso de prueba que pueda encontrar. Solo para asegurarnos de que los próximos desarrolladores no rompan el código.

En mi ejemplo, podría decir "esto es demasiado obvio para probarlo", pero estoy seguro de que puede imaginar un punto en el que el código podría ser tan frágil / complejo que se podrían hacer pruebas de muchas cosas diferentes que no deberían suceder. Mi pregunta es: ¿debería probarse y hasta qué punto?

¿Hay algún tipo de regla? ¿Me estoy perdiendo algo en el conocimiento de la prueba de unidad?

Por un lado, siento que esto es más seguro y ofrece una buena defensa contra casi cualquier cosa que se me ocurra. Por otro lado, esto es demasiado defensivo y abominable de mantener, y consume mucho tiempo, ya que puedes codificar "todo lo que puedas imaginar".

Tenga en cuenta que apliqué esto a las llamadas de función, pero se extiende a todo lo que sigue la línea de "probar cosas que no deberían suceder".

¿Dónde debería uno dejar de probar en esa dirección?

    
pregunta Gil Sand 06.04.2017 - 15:24

1 respuesta

5

Las pruebas tienen algunos propósitos.

  1. Asegúrese de que se cumplan los requisitos.
  2. Asegúrese de que el código se comporte como se espera.
  3. Describe el comportamiento esperado del código.

Además, las pruebas que escribas deben darte valor. El valor proviene del cumplimiento de uno de esos propósitos.

Por ejemplo, escribir una prueba para asegurarse de que 2 + 2 realmente produce 4 es algo que podría hacer, ya sabe, para asegurarse de que el compilador y su CPU funcionen como se diseñó. Pero eso no le da mucho valor y no justifica escribir la prueba. (Tampoco cumple realmente con el propósito de una prueba.)

Es posible escribir pruebas para asegurarse de que no se llame a RandomOtherFunction , pero es probable que eso no le dé valor. No es (típicamente) cumplir uno de esos propósitos. Es describir lo que no es el código. Y eso sería imposible escribir todo lo que el código no es. Tampoco es valioso para usted saber qué no es el código y que los rayos solares o las líneas solares no lo han modificado.

Las pruebas que especifican demasiado de lo que no es su programa también hacen que sea difícil de cambiar. ¿Qué sucede si, por algún motivo en el futuro, tiene que comenzar a usar RandomOtherFunction en un lugar al que no estaba acostumbrado? Ahora tienes que refactorizar muchas pruebas además de hacer el trabajo. Las pruebas no lo ayudaron a hacer el cambio ni a hacerlo de manera segura, solo lo hicieron más difícil.

Dejas de escribir pruebas cuando no te dan valor. El valor que justifique la escritura de una prueba depende de usted y su organización. Si su compañía realmente quiere pagarle para que escriba un millón de pruebas sobre lo que no es el software, está bien. Deja que te paguen por ese "valor". (También es posible que desee buscar un nuevo trabajo porque no puedo imaginar una empresa que pague por ese tipo de valor que dura mucho tiempo).

    
respondido por el Becuzz 06.04.2017 - 15:51

Lea otras preguntas en las etiquetas