Jest to problem, który pojawił się podczas wykonywania pojedynczego testu z wieloma niezależnymi trybami awaryjnymi ze względu na posiadanie wielu strumieni wyjściowych. Chciałem również pokazać wyniki potwierdzania danych we wszystkich tych trybach, niezależnie od tego, które wcześniej zawiodły. Python's unittest nie ma takiej funkcji poza używaniem Suite do reprezentowania pojedynczego testu, co było niedopuszczalne, ponieważ mój pojedynczy test zawsze wymagał uruchomienia jako pojedyncza jednostka; to po prostu nie uchwyca natury rzeczy.W jaki sposób obsłużyć wiele asserts w jednym unittest Python?
Praktycznym przykładem jest testowanie obiektu, który generuje również dziennik. Chcesz potwierdzić wyjście z jego metod, ale chcesz także potwierdzić wynik logu. Te dwa wyjścia wymagają różnych testów, które mogą być starannie wyrażone jako dwa z wyrażenia asserts, ale także nie chcesz, aby jedna z nich ukryła możliwą awarię drugiej w teście. Więc naprawdę musisz przetestować oba jednocześnie.
I cobbled razem ten przydatny mały widget, aby rozwiązać mój problem.
def logFailures(fnList):
failurelog = []
for fn in fnList:
try:
fn()
except AssertionError as e:
failurelog.append("\nFailure %d: %s" % (len(failurelog)+1,str(e)))
if len(failurelog) != 0:
raise AssertionError(
"%d failures within test.\n %s" % (len(failurelog),"\n".join(failurelog))
)
Który jest używany tak:
def test__myTest():
# do some work here
logFailures([
lambda: assert_(False,"This test failed."),
lambda: assert_(False,"This test also failed."),
])
Powoduje to, że logFailures() rzuci wyjątek, który zawiera rejestr wszystkich twierdzeń, które zostały podniesione w metodach obrębie listy.
Pytanie: Podczas wykonywania tego zadania zastanawiam się, czy istnieje lepszy sposób na poradzenie sobie z tym, poza tym, że trzeba przejść do długości tworzenia zagnieżdżonych zestawów testów i tak dalej?
"Ty też nie chcesz, aby jedna osoba ukryła możliwą awarię drugiej w teście". Jeśli chcesz przetestować dwie różne rzeczy, wykonaj dwa różne testy! –
"Ty też nie chcesz, aby jedna z nich ukryła możliwą porażkę drugiej w teście". Tak - chcę: to są testy jednostkowe. Jeśli jeden z testów się nie powiedzie, popraw błąd i ponownie uruchom testy. –