El artículo de Dan North que _Kevin mencionó es genial.
Recuerde, sin embargo, que hay "historias de usuario", que en realidad deberían escribirse o al menos recopilarse del cliente/usuarios. Estas son más historias tipo "Como, quiero, así que".
Luego hay criterios de aceptación, que identifican cómo y cuándo se cumplirá la historia del usuario. Eso es como lo que has escrito en tu publicación: "Cuando x, debería y".
Hay mucha superposición aquí con lo que llamo "historias del sistema" en mi sistema de gestión de proyectos y "especificaciones" en mis pruebas que especifican el comportamiento que el usuario puede desconocer, pero describen la interacción entre sus clases. Historia del sistema: "Cuando LoginHandler recibe un nombre de usuario y contraseña, debe validar los datos con un LoginValidator". Especificación:
[TestFixture]
public class When_the_login_handler_is_given_a_login_and_password
{
constant string login = "jdoe";
constant string password = "password";
static LoginValidator loginValidator;
context c =() => loginValidator = an<ILoginValidator>;
because b =() => sut.Validate(login, password);
it should_validate_the_data_with_a_LoginValidator =
() => loginValidator.was_told_to(x => x.DoValidation(login, password));
}
importa la sintaxis de las pruebas, se puede ver que el propio texto de especificación está incorporada en el nombre de la clase de prueba y el nombre del método. Además, la prueba/especificación en realidad está probando el comportamiento de las clases. Cuando las pruebas como esta pasan por simples historias de usuarios, se cumplen los criterios de aceptación.