Autenticación de prueba unitaria

Soy bastante nuevo en las pruebas unitarias. Estoy construyendo una aplicación ASP.NET MVC3 (aunque mi pregunta parece independiente del idioma) y estoy confundido acerca de una prueba básica.

Quiero hacer una prueba unitaria que se asegure de que mi función "ValidatePassword" funcione: tomará un nombre de usuario y una contraseña, luego aplicará un hash a la contraseña y verá si coincide con el hash de un usuario en la base de datos. Si es así, devuelve verdadero. El problema es que estoy usando un repositorio simulado, por lo que tendré que agregar el usuario a la base de datos antes de ejecutar mi prueba. Realmente no puedo crear este usuario en mi configuración de prueba porque no sé cuál será la contraseña encriptada hasta que realmente la ejecute a través de la función que estoy probando. ¿La respuesta es ejecutarlo a través de la función Hash una vez, escribirlo en mi prueba y luego probar con eso?

Espero que esto quede claro. ¡Gracias!

preguntado el 10 de mayo de 11 a las 13:05

2 Respuestas

Prefiero configurar mis datos de prueba siempre que sea posible a través del interfaz pública de mi código, en lugar de dar al código de prueba el conocimiento de cómo se implementa el código. Así que personalmente no usaría una contraseña encriptada codificada en el código de prueba. Dejame explicar...

Presumiblemente, tiene un método para agregar un nuevo usuario, que internamente creará una nueva entrada en la base de datos con una contraseña hash. Entonces la prueba se vería así:

AddNewUser("username", "passsword");
bool isValid = ValidateUser("username", "password");
Assert.IsTrue(isValid);

Esto, por supuesto, debería complementarse con pruebas de usuario / contraseña no válidas:

test: ValidUser_InvalidPassword:
    AddNewUser("username2", "pwd");
    bool isValid = ValidateUser("username2", "wrongPassword");
    Assert.IsFalse(isValid);


test: NonExistingUser:
    bool isValid = ValidateUser("non_existing_user", "anyPassword");
    Assert.IsFalse(isValid);

El argumento en contra sería que está probando más de una unidad en una sola prueba. Pero personalmente creo que esto es mejor. ¿Por qué?

Porque las pruebas no son tan frágiles - es decir, si realiza un cambio interno en el algoritmo hash, la prueba está ahí para comprobar que todo sigue funcionando. No es necesario que cambie la contraseña cifrada codificada en el código de prueba.

Ese es uno de los principales beneficios de las pruebas unitarias: para comprobar que no rompemos nada cuando refactorizamos. Entonces, cuando queremos cambiar la implementación interna por cualquier motivo (limpieza / rendimiento del código o mejoras de seguridad), las pruebas nos dan la confianza de que no hemos roto la funcionalidad.

En este artículo se puede encontrar un artículo interesante que analiza los beneficios de las pruebas de nivel superior. Artículo del Dr. Dobbs:

contestado el 18 de mayo de 11 a las 20:05

Sí, puede hacer que su función de configuración agregue al usuario con un contraseña cifrada codificada al repositorio simulado. Al realizar pruebas unitarias, debe utilizar valores conocidos para poder predecir el comportamiento de las funciones probadas.

contestado el 10 de mayo de 11 a las 17:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.