Консольное приложение QtTest без x-сервера

У меня есть несколько модульных тестов для моего проекта, которые я сделал с фреймворком 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,
Спасибо!

1

Решение

Ваша проблема заключается в следующей строке:

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.

2

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

Других решений пока нет …

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