L'articolo di Dan North che _Kevin ha menzionato è ottimo.
Ricorda, tuttavia, che esistono "storie utente", che in realtà dovrebbero essere scritte o almeno raccolte dal cliente/dagli utenti. Queste sono più delle storie di tipo "Come a, voglio, così".
Poi ci sono i criteri di accettazione, che identificano come e quando la user story sarà soddisfatta. È come quello che hai scritto nel tuo post: "Quando x, dovrebbe y".
C'è un sacco di sovrapposizioni qui con quelle che io chiamo "storie di sistema" nel mio sistema di gestione progetti e "specifiche" nei miei test che specificano comportamenti di cui l'utente potrebbe non essere a conoscenza, ma descrivono l'interazione tra le classi. Racconto di sistema: "Quando LoginHandler riceve un login e una password, deve convalidare i dati con un LoginValidator." Specification:
[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));
}
Nevermind la sintassi di prova, si può vedere che il testo specifica stessa è incarnata nel nome classe di test e il nome del metodo. Inoltre, il test/specifiche sta effettivamente testando il comportamento delle classi. Quando test come questo passano per semplici storie di utenti, i criteri di accettazione sono stati soddisfatti.