Как CppUnit реализует тест для исключения

Я знаю, что CppUnit позволяет протестировать на исключение через:

CPPUNIT_ASSERT_THROW(expression, ExceptionType);

Может кто-либо объяснять как CPPUNIT_ASSERT_THROW() реализован?

6
задан DavidRR 22 April 2015 в 18:38
поделиться

2 ответа

Отчеты об ошибках тестирования в CppUnit выполняются путем выдачи пользовательского типа исключения. Мы назовем это CppUnitException здесь для простоты.

CPPUNIT_ASSERT_THROW - это макрос, который будет расширяться до чего-то, что по сути является следующим:

try
{
   expression;
   throw CppUnitException("Expected expression to throw");
}
catch( const ExceptionType & e )
{
}

Если выражение выбрасывает (как мы и ожидали), мы попадаем в ловушку блок, который ничего не делает.

Если выражение вызывает , а не , выполнение переходит к строке кода, которая вызывает CppUnitException , что вызывает сбой теста.

Конечно, реализация макроса CPPUNIT_ASSERT_THROW на самом деле немного сложнее, так что информация о строках и файлах также сообщается, но это общая суть того, как это работает.

6
ответ дан 10 December 2019 в 02:44
поделиться

Изменить: я поддержал ответ Майкла Андерсона, поскольку он более конкретен в отношении точного кода из CppUnit, а мой - более общий ответ.

В псевдокоде это будет примерно так:

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;
3
ответ дан 10 December 2019 в 02:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: