Функция подтверждения C ++ для проверки того, что выброшено исключение

Я знаком с тем, как работает стандартное утверждение C ++. Это хорошо сработало в моем проекте для различных целей тестирования.

Например, предположим, что я хочу проверить, что мой код выдает определенное исключение.

Можно ли обойтись без использования инфраструктуры тестирования, такой как CPPUnit?

7

Решение

Вы можете сделать то же самое CPPUnit делает вручную:

bool exceptionThrown = false;

try
{
// your code
}
catch(ExceptionType&) // special exception type
{
exceptionThrown = true;
}
catch(...) // or any exception at all
{
exceptionThrown = true;
}

assert(exceptionThrown); // or whatever else you want to do

Конечно, если вы часто используете этот шаблон, то для этого имеет смысл использовать макрос.

6

Другие решения

скелет (НЕ ПРОВЕРЕНО)

#define MY_ASSERT(f, e) {\
try {\
f();\
} catch (std::exception &e) {\
...\
}\
}
2

Вот тестер исключений, который я написал на основе ответов @JPlatte и @ gongzhitaao. Для моей тестовой среды у меня есть две глобальные переменные num_test а также num_test_success они отслеживают, сколько тестов выполнено и сколько успешных в серии тестов, но это можно изменить в соответствии с вашими потребностями.

int num_test;
int num_test_success;

#define UT_ASSERT_THROW(expression, ExceptionType) {            \
\
try {                                                       \
expression;                                             \
printf("test %d:    *** FAILURE ***     %s:%d:%s,%s\n", \
num_test, __FILE__, __LINE__,                    \
#expression, #ExceptionType);                    \
} catch (const ExceptionType &) {                           \
printf("test %d:    success\n", num_test);              \
++num_test_success;                                     \
} catch (...) {                                             \
printf("test %d:    *** FAILURE ***     %s:%d:%s,%s\n", \
num_test, __FILE__, __LINE__,                    \
#expression, #ExceptionType);                    \
}                                                           \
\
++num_test;                                                 \
\
}

Макросы __FILE__ а также __LINE__ развернуть до текущего файла и номера строки (см. https://gcc.gnu.org/onlinedocs/cpp/Standard-Predefined-Macros.html). Знаки фунта внутри макроса указывают препроцессору место аргумента в виде строки в раскрытии макроса (см. http://bruceblinn.com/linuxinfo/Stringification.html).

1

внутри-кодовые утверждения обычно используются в начале метода, чтобы подтвердить, что определенные предварительные условия были выполнены, перед вводом этой конкретной функции
например:

Window::paint()
{
assert(m_device != NULL);
m_device->repaintRegion();
}

они здесь в первую очередь, чтобы поймать ошибки неудовлетворенных зависимостей между методами или классами.

утверждения в средах тестирования отличаются и обычно используются для модульного тестирования, чтобы убедиться, что модуль вернул все, что ему нужно было вернуть.

исключения должны создаваться обычно там, где реальность (то есть внешние системы) предоставила нам случай, когда код не может / не должен обрабатываться. Это простой выход для редких, но все еще ожидаемых проблем. например — время ожидания ожидания обычно доступного сервера. или недостаточно памяти. Я не стал бы использовать это как вспомогательное средство для программирования логики.

на ваш вопрос, может быть способ отловить исключения в средах тестирования, окружив тестируемый модуль с помощью try-catch. но я не уверен, действительно ли это желательно.

НТН

-3
По вопросам рекламы [email protected]