У меня есть несколько модульных тестов для моего проекта, которые я сделал с фреймворком QtTest. Это консольное приложение, и на самом деле я не использую ничего из Qt, кроме QtTest.
На моем компьютере все работает нормально, но я настраиваю непрерывную интеграцию на Travis и получаю:
lib_testapp: cannot connect to X server
Я пытался запустить свое приложение с -platform offscreen
как я видел в другой ветке, но это ничего не меняет.
В .pro есть следующие строки:
TEMPLATE = app
CONFIG += console c++11
QT += testlib
мой main.cpp
выглядит так:
class WatermarkingTests: public QObject
{
Q_OBJECT
private slots:
void initTestCase() { }
void test1() { someTest(); }
void cleanupTestCase() { }
};
QTEST_MAIN(WatermarkingTests)
#include "main.moc"
someTest()
это чисто математическая функция, которая делает некоторые вызовы QVERIFY
,
Спасибо!
Ваша проблема заключается в следующей строке:
QTEST_MAIN(WatermarkingTests)
Из документации:
QTEST_MAIN (TestClass)
Реализует функцию main (), которая создает экземпляр объекта приложения и TestClass, и выполняет все тесты в порядке, в котором они были определены. Используйте этот макрос для создания автономных исполняемых файлов.
Если определен QT_GUI_LIB, объект приложения будет QApplication, в противном случае это будет QCoreApplication. Если используется qmake и конфигурация включает QT + = gui, то QT_GUI_LIB будет определен автоматически.
Это означает, что вы получите QApplication, а не QCoreApplication, так как QT
переменная по умолчанию содержит ядро и графический интерфейс. Вам нужно будет использовать следующее утверждение, чтобы обойти это:
QT = core testlib
Обратите внимание, что с Qt 5 вы можете просто использовать следующий макрос:
QTEST_GUILESS_MAIN (TestClass)
Реализует функцию main (), которая создает экземпляр объекта QCoreApplication и TestClass и выполняет все тесты в порядке, в котором они были определены. Используйте этот макрос для создания автономных исполняемых файлов.
Ведет себя как QTEST_MAIN (), но создает экземпляр объекта QCoreApplication вместо объекта QApplication. Используйте этот макрос, если ваш тестовый пример не нуждается в функциональности, предоставляемой QApplication, но цикл обработки событий все еще необходим.
Эта функция была введена в Qt 5.0.
Других решений пока нет …