2010-08-06 8 views
6

Recientemente tuve la oportunidad de ver un montón de pruebas sin ninguna afirmación. Esas pruebas tenían que ser pruebas de precisión.Tiene una unidad/prueba de integración sin afirmar que exista?

Creo que lo único que se puede probar con estas pruebas es comprobar si no se producen excepciones durante el flujo de ejecución. Pero de todos modos, realmente no entiendo cómo podemos verificar la exactitud del código sin pruebas afirmativas, incluso los métodos que no hacen nada pueden pasar tales pruebas.

Así que me pregunto qué puede ser el propósito de tales pruebas y qué más se puede probar con eso?

+0

Parece que las excepciones se usaron para situaciones que no son excepcionales (como la validación). Eso es lo que estas pruebas señalan como "diseño defectuoso" – Surya

Respuesta

4

Les dejaría tener derecho a existir si están probando algún "código heredado", código que nadie realmente tiene un buen control. No, si están ahí para mostrar una "alta cobertura de código".

Es un primer paso para obtener algo de confianza en el código. El control invisible es: "no se lanzan excepciones". Sin embargo, una vez que hayas completado la aplicación en algunas pruebas de humo como estas, el siguiente paso sería convertir la verificación implícita en un control explícito; ponte tu límite de pensamiento y crea cambios observables que puedes afirmar de tus pruebas.
Puede usar herramientas como TestLint para detectar pruebas como estas.

+0

Sí, estoy de acuerdo con usted: tales pruebas pueden existir mientras tanto, pero al final, comprobación explícita de la lógica probada se debe agregar.Por cierto, gracias, por señalarme TestLint, lo buscaré definitivamente – DixonD

-1

A veces es interesante saber que una parte del código se puede ejecutar en absoluto.

Lo hago para el código (Python) que produce una salida gráfica, por ejemplo. Estoy feliz de que el gráfico se haya creado. Cuando la prueba falla, sé que algo está roto.

+0

¿Cómo sabes que se crea el gráfico si no lo has probado? :) – DixonD

+0

No lo hago. Soy bastante feliz cuando el código realmente se ejecuta sin excepción. –

4

Aquí es un ejemplo (C#, NUnit):

[Test] 
public void StartUpShutDownDoesntThrow() { 
    var aService = new Service(); 
    aService.StartUp(); 
    aService.ShutDown(); 
} 

Si esta prueba pasa asegura lo siguiente:

  • El constructor no lanzar una excepción
  • de inicio() no lanza una excepción
  • ShutDown() no lanza una excepción

Los tres elementos son valiosos, tal vez incluso épicos. Se sorprenderá de cuántas aplicaciones comerciales ni siquiera tienen algo tan básico como esto como parte de su proceso de control de calidad.

Así que, sí, las pruebas sin afirmaciones también pueden tener su valor.

+1

En esto puedo pensar en un try/catch y pegar un Assert.Fail sería una buena cosa ya que sabrías lo que las pruebas estaban destinadas a probar. –

+0

@mlk: Estoy de acuerdo en que debería estar más claro qué está haciendo esta prueba. En lugar de agregar try/catch y 'Assert.Fail()', actualicé el nombre en mi respuesta de 'StartUpShutDown' a' StartUpShutDownDoesntThrow'. – Manfred

+0

Sí, es bueno saber que no se produjo ninguna excepción. ¿Pero por qué no agregar algunos controles para verificar que aService hizo su trabajo correctamente? Estoy de acuerdo en que tal prueba es mejor que nada, pero ¿por qué no hacerlo como debe ser? – DixonD

0

Sí, como @John y @Olivier señalan, en ocasiones es valioso saber simplemente que algún código se ejecuta sin lanzar excepciones (y, supongo, no hace falta decirlo, sin errores de compilación). Pero estas son ocasiones excepcionales, y bajo ninguna circunstancia consideraría estas pruebas de "precisión".

1

Podrían ser pruebas de humo diseñadas para demostrar que algo no arroja una excepción o algo más está arrojando haciendo el trabajo (como un objeto simulado).

Sea cual sea el motivo, creo que debe cambiar el nombre de las pruebas como si la gente no supiera por qué existen o qué están probando, cómo se pueden reparar si se rompen.

1

En mi humilde opinión, las pruebas deben probar el comportamiento, no la falta de comportamiento. Si desea probar excepciones, pruebe las excepciones. Read this blog publicación.Tal vez estas pruebas sean pruebas para que los jugos de prueba fluyan, pero no deberían durar mucho.

3

Umh, no!

Una prueba sin Assert es claramente un olor de diseño. Eso se debe a que una buena prueba debe comunicarse exactamente por código QUÉ está probando, y también debe ser confiable.

Una prueba de la forma

[Test] 
public void DoSomethingDoesNotThrow() 
{ 
    var aService = new Service(); 
    aService.DoSomething(); 
} 

no tiene sentido, incluso potencialmente dañino, porque va a pasar, independientemente de lo aService.DoSomething() `está haciendo. Pero el mayor problema es: no prueba nada. (Y btw: ¿Cómo podría esta prueba 'precisión'?)

¡Sería mejor probar alguna funcionalidad de aService.DoSomething() en su lugar! Si se aprueba una prueba de este tipo, usted sabe que no se produce ninguna excepción, entonces ¿por qué necesitaría una 'prueba' como la anterior?

En general: siempre pruebe los hechos, nunca la ausencia de estos hechos.

Sólo porque se hace a menudo en el mundo real no significa que sea una buena práctica ...

Thomas

0

Recientemente tuve un error relacionado con una clase llamada impropiamente-tan escribió una prueba para compruebe que existió la clase correctamente nombrada (podría crearse una instancia).

Naturalmente, la prueba falló y no vi la necesidad de un Assert aquí.

Al arreglar los resultados del nombre de clase en una prueba de aprobación, me pregunté si necesitaba un Assert aquí también.

Al final solo afirmé que la clase que se había creado era del tipo correcto, lo cual parecía bastante inútil pero lo hizo de todos modos.

En este escenario, todavía siento que no se requiere el Assert.

¿Alguna idea de esto?

Cuestiones relacionadas