В моем приложении Qt используется Q_ASSERT_X, который вызывает qFatal(), который (по умолчанию) прерывает приложение. Это отлично подходит для приложения, но я хотел бы подавить это поведение при модульном тестировании приложения. (Я использую Google Test Framework.) У меня есть единичные тесты в отдельном проекте, статически связанный с классом, который я тестирую. documentation для qFatal() гласит:Как предотвратить qFatal() от прерывания приложения?
Вызывает обработчик сообщений с фатальной сообщ сообщение. Если обработчик сообщения не установлен, сообщение печатается в stderr. Под Windows, сообщение отправляется в отладчик .
Если вы используете сообщение по умолчанию , эта функция будет отменена на Unix-системах для создания дампа ядра. On Windows, для отладочной сборки, эта функция сообщит _CRT_ERROR , что позволит вам подключить отладчик к приложению.
...
Чтобы подавить вывод во время выполнения, установить свой собственный обработчик сообщений с qInstallMsgHandler().
Так вот мой main.cpp файл:
#include <gtest/gtest.h>
#include <QApplication>
void testMessageOutput(QtMsgType type, const char *msg) {
switch (type) {
case QtDebugMsg:
fprintf(stderr, "Debug: %s\n", msg);
break;
case QtWarningMsg:
fprintf(stderr, "Warning: %s\n", msg);
break;
case QtCriticalMsg:
fprintf(stderr, "Critical: %s\n", msg);
break;
case QtFatalMsg:
fprintf(stderr, "My Fatal: %s\n", msg);
break;
}
}
int main(int argc, char **argv)
{
qInstallMsgHandler(testMessageOutput);
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
Но мое приложение все равно останавливается на утверждают. Я могу сказать, что мой пользовательский обработчик вызывается, потому что выход при выполнении моих тестов:
My Fatal: УТВЕРЖДАЕТ неудачу в MyClass :: DoSomething: "DoSomething()", файл myclass.cpp, line 21 Программа неожиданно закончила.
Что я могу сделать, чтобы мои тесты продолжали работать, даже если утверждение не удалось?
Qt с открытым исходным кодом, здесь все в порядке: http://qt.gitorious.org/qt –
Спасибо, Калеб. Разит. Вид драконов, но я думаю, что я просто использую препроцессор, чтобы исключить тесты «ожидаемого отказа» из отладочных сборников и тестировать их только на сборках релизов. –
Спасибо @Adam - я проверил github, но не смог найти его там, и Google не перечислил его в любом месте в результатах поиска. –