wiem, że CppUnit umożliwia przetestowanie wyjątek poprzez:Jak CppUnit realizuje test wyjątek
CPPUNIT_ASSERT_THROW(expression, ExceptionType);
Czy ktoś może wyjaśnić jak CPPUNIT_ASSERT_THROW()
jest realizowany?
wiem, że CppUnit umożliwia przetestowanie wyjątek poprzez:Jak CppUnit realizuje test wyjątek
CPPUNIT_ASSERT_THROW(expression, ExceptionType);
Czy ktoś może wyjaśnić jak CPPUNIT_ASSERT_THROW()
jest realizowany?
Edytuj: Przejmuję odpowiedź Michaela Andersona, ponieważ jest on bardziej szczegółowy na temat dokładnego kodu z CppUnit, podczas gdy mój jest bardziej ogólną odpowiedzią.
W Pseudokod, to będzie coś takiego:
try
{
// Test code that should throw
}
catch(ExceptionType e)
{
// Correct exception - handle test success
return;
}
catch(...)
{
// Wrong exception, handle test failure.
return;
}
// No exception, handle test failure.
return;
Zgłaszanie awarii testowych w CppUnit odbywa się poprzez rzucanie typu custom wyjątków. Nazywamy to tutaj CppUnitException
dla uproszczenia.
CPPUNIT_ASSERT_THROW
jest makro, które będą rozwijać się do czegoś, co jest w zasadzie tak:
try
{
expression;
throw CppUnitException("Expected expression to throw");
}
catch(const ExceptionType & e)
{
}
Jeśli expression
rzutów (jak my go oczekiwać), możemy wpaść w bloku catch
który nic nie robi.
Jeśli expression
robi nie rzucać, wykonywanie przechodzi do linii kodu, który rzuca CppUnitException
co spowoduje niepowodzenie testu.
Oczywiście implementacja makra CPPUNIT_ASSERT_THROW
jest w rzeczywistości nieco bardziej wyrafinowana, więc informacje o liniach i plikach są również zgłaszane, ale to ogólna istota tego działania.