модульное тестирование — выразительные сообщения об ошибках подтверждения в переполнении стека

Фреймворки модульных тестов обычно предоставляют очень хорошие сообщения об ошибках подтверждения (я использую gtest), описывающие ожидаемые и фактические значения для конкретного теста. Кроме того, вы знаете происхождение вызова функции, потому что вы тестируете интерфейс класса.

По сравнению, assertПри использовании в качестве проверки работоспособности в реализации предоставляется некоторая, но более загадочная информация. Например, тот, над которым я сейчас работаю. ,

Assertion failed: (latency > std::chrono::milliseconds(0)), function setLatency, file /path/to/my.cpp line 71

Итак, я знаю, какое утверждение не удалось, но я понятия не имею, какие значения послужили причиной его отказа, и что более важно, я не знаю проблемную функцию, из которой setLatency назывался.

Простое решение обычно сводится к отладчику, но я не могу сделать это в этом случае. Возможно ли получить более описательное сообщение утверждения изнутри реализации класса? Как я могу это сделать? Я не против использования сторонней библиотеки, если это необходимо.

1

Решение

Распространенным решением этой проблемы является создание макроса assert. Для примера см. этот вопрос. Окончательная форма их макроса в этом ответе была следующей:

#define dbgassert(EX,...) \
(void)((EX) || (realdbgassert (#EX, __FILE__, __LINE__, ## __VA_ARGS__),0))

В вашем случае realdbgassert будет функция, которая печатает любую соответствующую информацию stderr или другую консоль вывода, а затем вызывает саму функцию assert. В зависимости от того, сколько информации вы хотите, вы также можете сделать дамп стека, или зарегистрируйте любую другую соответствующую информацию, которая поможет вам определить проблему. Однако это может быть так же просто, как передача строки формата printf-esque и соответствующих значений параметров.

Обратите внимание, что если ваш компилятор не поддерживает вариационные макросы, вы можете создавать макросы, которые вместо этого принимают определенное количество параметров. Это немного более громоздко, но вариант, если вашему компилятору не хватает поддержки, например:

#define dbgassert0(EX) \ ...
#define dbgassert1(EX,p0) \ ...
#define dbgassert2(EX,p0,p1) \ ...
2

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

Я не уверен, что это то, что вы ищете, но вы можете добавить любое сообщение, которое вам нравится, к сообщению «Ошибка подтверждения: ..», выполнив что-то вроде этого:

assert(1==1 && "This is always true");
assert(1==0 && "This always fails");

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

0

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