Try/z wyjątkiem podejścia ty show jest rzeczywiście całkowicie poprawna, ponieważ pokazuje drogę, która faktycznie korzysta kod w prawdziwym życiu. Jest jednak powód, dla którego nie podoba ci się to całkowicie. Prowadzi to do problemów z brzydkich rzeczy, jak następuje:
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
Jeśli piszę definicję etapie bez spróbuj/z wyjątkiem potem drugi scenariusz zawiedzie. Jeśli napiszę to przy użyciu funkcji try/except, wówczas pierwszy scenariusz może ukryć wyjątek, szczególnie jeśli wyjątek ma miejsce po tym, jak prompt został już wydrukowany.
Zamiast te scenariusze powinny IMHO być napisane jako coś jak
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
„Ja zalogować” krok nie powinien używać spróbować; "Staram się zalogować" pasuje starannie, aby spróbować i zdradza, że może nie być sukcesu.
Następnie pojawia się pytanie o ponowne użycie kodu między dwoma prawie, ale nie do końca identycznymi krokami. Prawdopodobnie nie chcemy mieć dwóch funkcji, które jednocześnie się logują. Oprócz zwykłej wspólnej funkcji, którą wywołujesz, możesz również zrobić coś podobnego pod koniec pliku kroków.
@when(u'{who} try to {what}')
def step_impl(context):
try:
context.exception=None
except Exception as e:
context.exception=e
To automatycznie konwertować wszystkie etapy zawierające słowo „próbują” w krokach o tej samej nazwie, ale z próbować usunięte, a następnie zabezpieczyć je próbie/z wyjątkiem.
Jest kilka pytań dotyczących tego, kiedy należy zajmować się wyjątkami w BDD, ponieważ nie są one widoczne dla użytkownika. To nie jest część odpowiedzi na to pytanie, więc umieściłem je w separate posting.
Wydaje mi się, że zapewnienie, że kod zgłasza pewne wyjątki w pewnych scenariuszach, jest dość standardową sprawą do przetestowania. Dobrze nadaje się również do pokazywania kodu klienta zachowań, jakich można się spodziewać. Kiedy testuję to, nie testuję na porażkę! W każdym razie jest to dość standardowa cecha większości frameworków testowych. –