【问题标题】:QtTest console application without x server没有 x 服务器的 QtTest 控制台应用程序
【发布时间】:2014-01-01 20:35:23
【问题描述】:

我对我的项目进行了一些单元测试,这些测试是使用 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。 谢谢!

【问题讨论】:

  • 与 CI 相比,它是否在您的机器上本地工作?
  • 是的,它工作正常。但是,当然,我有一个 X 服务器正在运行,我认为 Travis 上不是这样。
  • 嗯,你当然可以在 VT 中尝试,而不是在你的 X 服务器中。是全输出吗?你能提供一个最小的测试代码吗?这也是哪个qt版本?此外,您应该拥有QT = core testlib,这样您就不会默认添加 gui。否则,它可能会链接到 gui 库。
  • 是的,如果我从计算机中的 VT 运行它,它仍然可以工作。 (但仅限于 -platform offscreen)
  • testlib 确实使用了 qcoreapplication。请展示测试代码,尤其是主宏。

标签: c++ qt x11 qtcore qttest


【解决方案1】:

您的问题是以下行:

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 中引入的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 2017-02-03
    • 2019-07-10
    • 1970-01-01
    相关资源
    最近更新 更多