Entonces, tengo un módulo de autenticación que escribí hace algún tiempo. Ahora estoy viendo los errores de mi camino y escribiendo pruebas unitarias para ello. Mientras escribo pruebas unitarias, me resulta difícil encontrar buenos nombres y buenas áreas para probar. Por ejemplo, tengo cosas como
- RequiereLogin_should_redirect_when_not_logged_in
- RequiereLogin_should_pass_through_when_logged_in
- Login_should_work_when_given_proper_credentials
Personalmente, creo que es un poco feo, aunque parezca "correcto". También tengo problemas para diferenciar las pruebas con solo escanearlas (tengo que leer el nombre del método al menos dos veces para saber qué acaba de fallar)
Entonces, pensé que tal vez en lugar de escribir pruebas que puramente probaran la funcionalidad, tal vez escribiera un conjunto de pruebas que cubran escenarios.
Por ejemplo, este es un talón de prueba que se me ocurrió:
public class Authentication_Bill
{
public void Bill_has_no_account()
{ //assert username "bill" not in UserStore
}
public void Bill_attempts_to_post_comment_but_is_redirected_to_login()
{ //Calls RequiredLogin and should redirect to login page
}
public void Bill_creates_account()
{ //pretend the login page doubled as registration and he made an account. Add the account here
}
public void Bill_logs_in_with_new_account()
{ //Login("bill", "password"). Assert not redirected to login page
}
public void Bill_can_now_post_comment()
{ //Calls RequiredLogin, but should not kill request or redirect to login page
}
}
¿Es esto un patrón de oído? He visto historias de aceptación y cosas por el estilo, pero esto es fundamentalmente diferente. La gran diferencia es que se me ocurren escenarios para "forzar" las pruebas. En lugar de intentar manualmente generar posibles interacciones que tendré que probar. Además, sé que esto fomenta las pruebas de unidad que no evalúan exactamente un método y una clase. Aunque creo que esto está bien. Además, soy consciente de que esto causará problemas al menos en algunos marcos de prueba, ya que generalmente asumen que las pruebas son independientes entre sí y que el orden no importa (donde lo haría en este caso).
De todos modos, ¿es este un patrón aconsejable? O, ¿sería esto un ajuste perfecto para las pruebas de integración de mi API en lugar de como pruebas de "unidad"? Esto es solo en un proyecto personal, así que estoy abierto a experimentos que pueden o no ir bien.