2

我对我的项目进行了一些单元测试,这些测试是使用 QtTest 框架进行的。它是一个控制台应用程序,实际上除了 QtTest 之外,我不使用 Qt 中的任何东西。

在我的计算机上它工作正常,但是我在 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. 谢谢!

4

1 回答 1

2

您的问题是以下行:

QTEST_MAIN(WatermarkingTests)

从文档中:

QTEST_MAIN (TestClass)

实现一个 main() 函数,该函数实例化一个应用程序对象和 TestClass,并按照定义的顺序执行所有测试。使用此宏构建独立的可执行文件。

如果定义了 QT_GUI_LIB,则应用程序对象将是一个 QApplication,否则它将是一个 QCoreApplication。如果使用 qmake 并且配置包含 QT += gui,那么 QT_GUI_LIB 将被自动定义。

这意味着,您将获得一个 QApplication 而不是 QCoreApplication 因为该QT变量默认包含 core 和 gui。您需要使用以下语句来解决它:

QT = core testlib

请注意,使用 Qt 5,您可以只使用以下宏:

QTEST_GUILESS_MAIN(TestClass)

实现一个 main() 函数,该函数实例化一个 QCoreApplication 对象和 TestClass,并按照定义的顺序执行所有测试。使用此宏构建独立的可执行文件。

行为类似于 QTEST_MAIN(),但实例化一个 QCoreApplication 而不是 QApplication 对象。如果您的测试用例不需要 QApplication 提供的功能,但仍需要事件循环,请使用此宏。

此功能是在 Qt 5.0 中引入的。

于 2014-01-01T21:03:02.820 回答