2011-06-08 20 views
8

Estoy un poco confundido acerca de las pruebas unitarias. Veo el valor en cosas como las pruebas automatizadas. Creo que tal vez un buen ejemplo sea la mejor manera de ayudarme a entender. Digamos que tengo una función de búsqueda binaria Quiero probar la unidad.Explique las pruebas unitarias por favor

Ahora en las pruebas, me gustaría saber cosas como: ¿La búsqueda encuentra el primer elemento, el último elemento y otros elementos? La búsqueda compara correctamente caracteres Unicode. La búsqueda maneja símbolos y otros caracteres "dolorosos". ¿Las pruebas unitarias lo cubrirían o me lo estoy perdiendo? ¿Cómo escribirías pruebas unitarias para mi búsqueda binaria?

function search(collection, value){ 
var start = 0, end = collection.length - 1, mid; 
while (start <= end) { 
    mid = start + ((end - start)/2); 
    if (value == collection[mid]) 
    return mid; 
    if (collection[mid] < value) 
    end = mid - 1; 
    else 
     start = mid + 1; 
} 
return mid; 
} 

El código de Psuedo para las pruebas unitarias sería encantador.

Así, podríamos tener:

function testFirst(){ 
var collection = ['a','b','c','x','y','z'],first = 'a', findex = 0; 
assert(seach(collection,first),findex); 
} 
function testLast(){ 
var collection = ['a','b','c','x','y','z'], last = 'z', lindex = 5; 
assert(seach(collection,last),lindex); 
} 

Respuesta

2

Tiene razón en sus expectativas de pruebas unitarias; se trata de validar y verificar el comportamiento esperado.

Un valor que creo que mucha gente pasa por alto en las pruebas unitarias es que su valor aumenta con el tiempo. Cuando escribo un fragmento de código y escribo una prueba unitaria, básicamente probé que el código hace lo que creo que debería hacer, que no está fallando de ninguna manera que he decidido verificar, etc. Estos son buenos cosas, pero tienen un valor limitado, porque expresan el conocimiento que usted tiene del sistema en ese momento; no pueden ayudarte con cosas que no conoces (¿hay algún error furtivo en mi algoritmo que desconozco y no pensé en probar?).

El valor real de las Pruebas unitarias, en mi opinión, es el valor que obtienen con el tiempo. Este valor toma dos formas; valor de la documentación y valor de validación

El valor de la documentación es el valor de la prueba de la unidad que dice "esto es lo que el autor del código esperaba que hiciera este código". Es difícil exagerar el valor de este tipo de cosas; cuando has estado en un proyecto que tiene una gran cantidad de código heredado no documentado, déjame decirte, este tipo de valor de documentación es como un milagro.

El otro valor es el de validación; a medida que el código permanece en los proyectos, las cosas se refactorizan, cambian y cambian.Las pruebas unitarias proporcionan la validación de que el componente que creía que funcionaba de una manera continúa funcionando de esa manera. Esto puede ser invaluable para ayudar a encontrar errores que se cuelan en los proyectos. Por ejemplo, cambiar una solución de base de datos a veces puede ser transparente, pero a veces esos cambios pueden causar cambios inesperados en el funcionamiento de algunas cosas; las pruebas unitarias de los componentes que dependen de su ORM pueden detectar cambios críticos sutiles en el comportamiento subyacente. Esto realmente se vuelve útil cuando tienes una porción de código que ha estado funcionando perfectamente durante años y nadie piensa en su posible rol en un fracaso; esos tipos de errores pueden tomar MUCHO tiempo para encontrarlos, porque el último lugar que vas a buscar está en el componente que ha sido sólido durante mucho tiempo. Unit Testing proporciona la validación de esa "solidez de roca".

3

No, no lo estás perdiendo, esto es lo que la unidad de pruebas está diseñado para decirle. Tiene la idea correcta al probar entradas buenas y malas, casos extremos, etc. Necesita una prueba para cada condición. Una prueba establecerá cualquier precondición y luego afirmará que su cálculo (o lo que sea) coincide con sus expectativas

2

Sí, eso es todo. Cada una de esas preguntas que haga se podría usar como una prueba. Piense en la prueba unitaria como tres pasos. Establezca algunas condiciones previas, ejecute un código que esté "bajo prueba" y escriba una afirmación que documente sus expectativas.

En su caso, configurar 'colección' con algunos valores particulares (o sin valores) es establecer las condiciones previas.

Llamar a su método de búsqueda con un parámetro particular es ejecutar el código bajo prueba.

Comprobando que el valor devuelto por su método coincide con lo que espera es el paso afirmativo.

Dale un nombre a esas tres cosas que describan lo que estás tratando de hacer (DoesTheSearchMethodFailIfCollectionIsEmpty) y listo para que pruebes la unidad.

Cuestiones relacionadas