2009-10-27 31 views
9

¿Qué es exactamente una prueba de unidad y cómo escribo una? He oído muchas veces que las personas las escriben antes de que se escriba su aplicación, ¿cómo puede ser esto? Tengo la impresión de que una prueba unitaria es un código que hace una llamada a un método de su aplicación con un valor establecido y espera que vuelva un valor específico. Si el valor específico no vuelve, la prueba ha fallado. ¿Me equivoco o engaño aquí? He leído mucho sobre pruebas unitarias pero sé muy poco acerca de cómo se ve realmente en el código, por lo que una muestra sería genial.¿Un ejemplo de prueba unitaria en C#?

¿Es esta una prueba de unidad?

inicio pseudo código ...

CheckForDuplicateSubdomains(){ 
    get all users in DB with matching subdomains 
    if greater than zero, fail test 
} 

PS: Estoy utilizando ASP.NET MVC en C#

+1

También recomiendo leer las respuestas a la pregunta "¿Cómo empiezo las pruebas unitarias?" http://stackoverflow.com/questions/1300157/how-do-i-start-unit-testing. –

Respuesta

1

Tengo la impresión de que una prueba de unidad es un código que hace una llamada a un método de su aplicación con un valor establecido y espera que un valor específico regrese, si el valor específico no vuelve, la prueba ha fallado. ¿Me equivoco o engaño aquí?

No, tienes razón.

Lo importante con las pruebas unitarias es probar una pequeña porción de código como sea posible.

En su ejemplo, obtiene algo de la base de datos y luego cuenta el número de elementos ... Si su método falla, nunca sabrá exactamente dónde salieron las cosas mal, porque hay tantas cosas que podrían salir mal. ..

su base de datos de la conexión podría perderse, SQL no válida, ...

Si está utilizando asp.net MVC, usted debe tener un tiempo más fácil escribir las pruebas unitarias que si estuviera utilizando asp normal. neto

1

Una prueba de unidad es una prueba que ejerce una porción muy pequeña de su código, generalmente un único método (una unidad para ser exactos).

En TDD, los desarrolladores pueden escribir la Prueba unitaria antes de codificar el método porque ya saben lo que la Unidad de código debería hacer. No importa cómo hace el trabajo ... la prueba simplemente se asegura de que los resultados sean correctos.

Y ese pseudocódigo podría usarse como una prueba de unidad (no estoy seguro de lo que probaría, pero tendría que asumir que está probando un método que no debe devolver dominios duplicados).

La teoría es que las pruebas unitarias (y el desarrollo controlado por pruebas) deberían aliviar los dolores de cabeza en el futuro asegurándose de que cada Unidad de código haga exactamente lo que se espera de ella.

8

Tiene razón acerca de las pruebas unitarias. La idea es probar todas sus funciones, una por una, con diferentes entradas para asegurarse de que funcionen como espera (en lugar de descubrirlas una vez que se han insertado en una aplicación ... y luego hacer las pruebas más complicadas).

Escribir las pruebas de unidad antes de escribir la función es parte de una metodología llamada "Desarrollo controlado por prueba". En el que escribe el esqueleto de la función solamente, y todas las pruebas de la unidad primero. Por lo tanto, al principio todas sus pruebas fallarán (b/c la función aún no está programada). Después de eso, programa la función hasta que pasen todas las pruebas.

+1

TDD implica escribir una prueba de unidad individual, luego el código para hacerlo pasar, luego refactorizar ese código para limpiarlo y finalmente repetirlo con una nueva prueba de unidad. No escribirías un montón de pruebas, luego un montón de código, como pareces implicar. – ColinD

+0

No creo que TDD se oponga a escribir más de una prueba a la vez, aunque tal vez soy ignorante en ese asunto. Por ejemplo, ¿qué sucede si la función debe hacer dos cosas, por ejemplo, insertar una fila en una base de datos y devolver el número de fila. Eso puede requerir dos pruebas, una para probar que se ingrese la fila, y una segunda prueba para mostrar que el número de fila es correcto.Por supuesto, podría hacer ambas validaciones en una sola prueba, pero en este momento estamos dividiendo pelos en la definición de lo que constituye una sola prueba. –

+1

Ref: http://agileinaflash.blogspot.com/2009/07/essential-unit-test-cards.html Solo escribe lo suficiente de una prueba para obtener un error, solo el código suficiente para que pase, entonces lo suficiente como para obtener otra falla. Piense en ello como escribir una especificación, luego código suficiente para cumplir con la especificación. Cuando ve el código, se da cuenta de que necesita una mejor especificación, y cada especificación conduce a un mejor código. Al final, las pruebas muestran todos los casos que consideraste y son de buena lectura para el siguiente tipo. –

1

Sí, su ejemplo sería una prueba de unidad. Hay algunas razones para crear la prueba primero.Primero, actúa como documentación viviente para su proyecto. Establece los comportamientos y los resultados esperados, lo que debería ayudarlo a implementar su código (es más fácil escribir algo, saber qué debe hacer y básicamente cómo se inicia). En segundo lugar, si luego escribes la prueba, es más probable que escribas una prueba que funcione con el código que ya escribiste, lo que no te ayuda. Defina qué necesita hacer una unidad de código, escriba las pruebas y escriba/corrija el código para que refleje los comportamientos en las pruebas. Esta estrategia se traduce en una mejor comprensión y calidad a medida que su aplicación evoluciona.

1

Las pruebas unitarias son pruebas automatizadas a nivel de Unidad. Por nivel de unidad se refieren a la unidad de código atómico de modo que no se puede desglosar más. una función o una parte particular de un objeto. una prueba de unidad para una función cuadrada sería algo como

assertEqual(4, square(2)); 
assertEqual(4, square(-2)); 
assertEqual(0, square(0)); 

Ahora se puede escribir esto tan pronto como se haya decidido en la interfaz de la plaza, para una función más complicada que podría medir qué tan cerca de completar la función es por cuántas pruebas pasan

0

Existen convenciones muy bien establecidas para pruebas unitarias en la familia de marcos xUnit, originalmente derivadas de jUnit. En ese marco, la afirmación es el principal vehículo para realizar una prueba. En un conjunto de pruebas, el objetivo es garantizar que el 100% de sus afirmaciones sean verdaderas.

Considere su ejemplo.

CheckForDuplicateSubdomains(){ 
    get all users in DB with matching subdomains 
    if greater than zero, fail test 
} 

Esta prueba convencional tendría un nombre que empieza por "test", que permite corredor de prueba del marco saber que esta función es una prueba y no un método de configuración, por ejemplo. Es importante aclarar que estamos probando el comportamiento del código, y no el estado de los datos.

testNoDuplicateSubdomains(){ 
} 

Dentro de cada prueba, hay four phases:

  • configuración accesorio,
  • ejercicio SUT, verificación resultado
  • y
  • desmontaje del accesorio.

El SUT es el "sistema bajo prueba", que normalmente es un método de una clase en su código de producción.

testNoDuplicateSubdomains(){ 
    // fixture setup 
    prepareDatabaseTestData() 
    // exercise SUT, 
    SUT = new ProductionObject() 
    result = SUT.getAllUsersWithMatchingSubDomains() 
    // result verification and 
    assertEmpty(result) // or whatever makes sense 
    // fixture teardown. 
    removeDatabaseTestData() 
} 

Al igual que con muchas técnicas de desarrollo de software, lleva tiempo obtener experiencia en pruebas de unidad de escritura. Un buen recurso para aprender las mejores prácticas es xUnit Test Patterns por Gerard Meszaros.

+0

Parece que hay una idea falsa en el ejemplo del OP CheckForDuplicateSubdomains() de que parece estar inclinada hacia la verificación del estado de algunos datos en lugar del comportamiento de un bloque de código. Aunque lo he llevado a mi ejemplo modificado, creo que la discusión todavía es informativa. Como comentario adicional, recomendaría que un principiante prefiera obtener experiencia construyendo pruebas unitarias en una parte del código que no está cerca de la base de datos. La interfaz de la base de datos de códigos es una prueba de unidad a unidad notoriamente problemática. –