2009-05-28 10 views
21

Estoy a punto de usar BDD (Diseño controlado por comportamiento) por primera vez y estoy tratando de acostumbrarme a esta forma diferente de abordar un problema.Cómo escribir historias/escenarios en BDD (Diseño impulsado por comportamiento)

¿Puede dar algunas historias/escenarios para los que escribiría, digamos una aplicación de inicio de sesión simple utilizando BDD?

Por ejemplo, a partir de lo que he leído, parece que es bueno:

Cuando un usuario introduce una ID de usuario/contraseña no válida, a continuación, mostrar un mensaje de error .

A diferencia:

Validar ID y contraseña mediante la búsqueda de un registro coincidente en la base de datos .

Respuesta

14

Dan North tiene excelentes consejos para escribir historias. "Dan North- What's in a Story?"

También me gustaría echar un vistazo a algunos de los trabajos que se realizan alrededor de Cucumber ya que han pasado mucho tiempo pensando en cómo escribir estas historias de una manera comprensible y ejecutable.

7

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.

Cuestiones relacionadas