Il try/tranne approccio si mostra in realtà è del tutto corretto perché dimostra il modo in cui si sarebbe effettivamente utilizzare il codice nella vita reale. Tuttavia, c'è una ragione per cui non ti piace completamente. Si porta a brutti problemi con cose come la seguente:
Scenario: correct password accepted
Given that I have a correct password
When I attempt to log in
Then I should get a prompt
Scenario: correct password accepted
Given that I have a correct password
When I attempt to log in
Then I should get an exception
Se scrivo la definizione passo senza provare/salvo poi il secondo scenario avrà esito negativo. Se scrivo con try/tranne il primo scenario rischia di nascondere un'eccezione, specialmente se l'eccezione si verifica dopo che il prompt è già stato stampato.
Invece questi scenari dovrebbero, secondo me, essere scritte come qualcosa di simile
Scenario: correct password accepted
Given that I have a correct password
When I log in
Then I should get a prompt
Scenario: correct password accepted
Given that I have a correct password
When I try to log in
Then I should get an exception
Il "accedo a" passo non dovrebbe usare provare; Il "Tento di accedere" si abbina perfettamente per provare e dà via il fatto che potrebbe non esserci successo.
Poi arriva la domanda sul riutilizzo del codice tra i due passaggi quasi, ma non del tutto identici. Probabilmente non vogliamo avere due funzioni che entrambi accedono. Oltre ad avere semplicemente un'altra funzione comune che chiami, potresti anche fare qualcosa di simile alla fine del tuo file passo.
@when(u'{who} try to {what}')
def step_impl(context):
try:
context.exception=None
except Exception as e:
context.exception=e
Questo convertirà automaticamente tutti i passaggi che contengono la parola "cercare di" in passi con lo stesso nome ma con provare a cancellare e poi proteggerli con una try/except.
Ci sono alcune domande su quando effettivamente dovresti occuparti delle eccezioni in BDD dato che non sono visibili all'utente. Non fa parte della risposta a questa domanda, quindi li ho inseriti in uno separate posting.
Mi sembra che garantire che il codice generi certe eccezioni in determinati scenari è una cosa abbastanza standard da testare. Ottimo anche per mostrare al codice client i comportamenti che può aspettarsi. Quando provo per quello, non faccio i test per fallire! In ogni caso è una caratteristica piuttosto standard della maggior parte dei framework di test. –