使用CMake构建Qt测试

33

有人能给我提供一些 QT 测试代码的示例以及一个能够使用 Cmake 构建并使用 CTest 运行的 CMakeLists.txt 文件吗?我似乎找不到任何相关资源!

-Kurtis

2个回答

42
这是一个使用cmake 2.8.11和Qt5.2的示例。请注意,cmake现在支持在底部带有.moc-include的测试文件。

CMakeLists.txt:

cmake_minimum_required(VERSION 2.8.11)
project(foo)

enable_testing()

# Tell CMake to run moc when necessary:
set(CMAKE_AUTOMOC ON)

# As moc files are generated in the binary dir, tell CMake
# to always look for includes there:
set(CMAKE_INCLUDE_CURRENT_DIR ON)

find_package(Qt5Test REQUIRED)

add_executable(foo foo.cpp)
add_test(foo foo)

target_link_libraries(foo Qt5::Test)

foo.cpp:

#include <QTest>

class Foo : public QObject {
    Q_OBJECT
private slots:
    void t1() { QVERIFY(true); }
};

QTEST_MAIN(Foo)
#include "foo.moc"

我不得不编辑CMakeList的最后一行来编译代码:target_link_libraries(foo Qt5::Widgets Qt5::Test)。对于qt5,我给出+1。我不确定是我的问题还是实际上是一个错误,所以我不会编辑答案。 - cauchi
2
@cauchy:当然,如果你的测试需要QtWidgets,它就需要被链接... :P - Smar
1
@Daniel,我仍然在获取“foo.moc”文件的错误(~没有这样的文件)。我正在使用CMake 3版本和Qt 5.9。 - user746184

12

下面这个例子来自于Charm (Tests/CMakeLists.txt):

SET( TestApplication_SRCS TestApplication.cpp )
SET( TEST_LIBRARIES CharmCore ${QT_QTTEST_LIBRARY} ${QT_LIBRARIES} )

SET( SqLiteStorageTests_SRCS SqLiteStorageTests.cpp )
QT4_AUTOMOC( ${SqLiteStorageTests_SRCS} )
ADD_EXECUTABLE( SqLiteStorageTests ${SqLiteStorageTests_SRCS} )
TARGET_LINK_LIBRARIES( SqLiteStorageTests ${TEST_LIBRARIES} )
ADD_TEST( NAME SqLiteStorageTests COMMAND SqLiteStorageTests )

与普通可执行文件的唯一区别是您需要调用ADD_TEST宏。例如,可以查看Charm以查看其运作方式。


2
希望这能为将来的某个人节省一些时间 - 根据此页面所述:“请注意,CMake无法处理底部包含moc的qtest文件。” - Nathan Osman
如果是这种情况,你也必须记得自动化测试文件。 - jackyalcine
对于 moc 和 CMake,请使用 set(CMAKE_AUTOMOC ON) - Cyrille MASCART

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接