Qt Creator基于qmake使用Qt Test框架执行单元测试遇阻求助
问题描述
我们正在开展一项大学项目,使用Qt Creator开发并采用qmake构建工具。此前尝试安装Google Test框架未成功,转而使用Qt Test框架实现单元测试,但遇到以下问题:
- 已在项目的.pro文件中配置test构建分支与常规构建分支,且设置了test和debug两个构建选项。
- 执行test构建时,控制台显示
test build,说明分支已触发,但编译器仍错误处理仅属于常规构建分支的.ui文件,且没有只编译测试相关文件。
当前.pro文件配置
QT += core gui sql testlib greaterThan(QT_MAJOR_VERSION, 4): QT += widgets QMAKE_CXXFLAGS += -Wno-unused-private-field CONFIG += c++17 INCLUDEPATH += $$PWD CONFIG(debug, debug|release) { CONFIG += console } test { message(test build) QT += testlib TARGET = demo-test INCLUDEPATH += $$PWD/test SOURCES += \ arztview.cpp \ behandlungsraum.cpp \ datenbearbeitenview.cpp \ letztetermineview.cpp \ main.cpp \ login.cpp \ patientenview.cpp \ registrierenview.cpp \ terminabsagenview.cpp \ terminhinzufugenview.cpp \ user.cpp HEADERS += \ arztview.h \ behandlungsraum.h \ datenbearbeitenview.h \ letztetermineview.h \ login.h \ patientenview.h \ registrierenview.h \ terminabsagenview.h \ terminhinzufugenview.h \ user.h } else { message(normal build) SOURCES += \ arztview.cpp \ behandlungsraum.cpp \ datenbearbeitenview.cpp \ letztetermineview.cpp \ main.cpp \ login.cpp \ patientenview.cpp \ registrierenview.cpp \ terminabsagenview.cpp \ terminhinzufugenview.cpp \ user.cpp HEADERS += \ arztview.h \ behandlungsraum.h \ datenbearbeitenview.h \ letztetermineview.h \ login.h \ patientenview.h \ registrierenview.h \ terminabsagenview.h \ terminhinzufugenview.h \ user.h FORMS += \ arztview.ui \ datenbearbeitenview.ui \ letztetermineview.ui \ login.ui \ patientenview.ui \ registrierenview.ui \ terminabsagenview.ui \ terminhinzufugenview.ui } # Default rules for deployment. qnx: target.path = /tmp/$${TARGET}/bin else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target
解决方案
1. 重构.pro文件,分离测试与主程序代码
当前.pro的核心问题:
- test分支用
SOURCES +=而非SOURCES =,会累积全局或之前添加的文件(包括UI相关代码)。 - test分支包含了所有主程序的UI源文件,这些文件依赖.ui生成的代码,完全不属于测试范畴。
修改后的.pro文件示例:
QT += core gui sql greaterThan(QT_MAJOR_VERSION, 4): QT += widgets QMAKE_CXXFLAGS += -Wno-unused-private-field CONFIG += c++17 INCLUDEPATH += $$PWD CONFIG(debug, debug|release) { CONFIG += console } # 抽离公共逻辑文件(测试和主程序都需要的纯逻辑代码) COMMON_SOURCES += \ behandlungsraum.cpp \ user.cpp COMMON_HEADERS += \ behandlungsraum.h \ user.h test { message(test build) QT += testlib TARGET = demo-test INCLUDEPATH += $$PWD/test # 用=而非+=,清空原有文件列表,只保留测试代码和公共逻辑 SOURCES = $$COMMON_SOURCES \ $$PWD/test/test_user.cpp \ $$PWD/test/test_behandlungsraum.cpp \ test_main.cpp # 测试专用入口,不要用主程序的main.cpp HEADERS = $$COMMON_HEADERS \ $$PWD/test/test_user.h \ $$PWD/test/test_behandlungsraum.h } else { message(normal build) # 主程序文件列表,包含UI相关代码 SOURCES = $$COMMON_SOURCES \ arztview.cpp \ datenbearbeitenview.cpp \ letztetermineview.cpp \ main.cpp \ login.cpp \ patientenview.cpp \ registrierenview.cpp \ terminabsagenview.cpp \ terminhinzufugenview.cpp HEADERS = $$COMMON_HEADERS \ arztview.h \ datenbearbeitenview.h \ letztetermineview.h \ login.h \ patientenview.h \ registrierenview.h \ terminabsagenview.h \ terminhinzufugenview.h FORMS += \ arztview.ui \ datenbearbeitenview.ui \ letztetermineview.ui \ login.ui \ patientenview.ui \ registrierenview.ui \ terminabsagenview.ui \ terminhinzufugenview.ui } # Default rules for deployment. qnx: target.path = /tmp/$${TARGET}/bin else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target
2. 编写测试专用入口文件
创建test_main.cpp作为测试入口,替代主程序的main.cpp:
#include <QTest> #include "test_user.h" #include "test_behandlungsraum.h" int main(int argc, char *argv[]) { int testStatus = 0; testStatus |= QTest::qExec(new TestUser, argc, argv); testStatus |= QTest::qExec(new TestBehandlungsraum, argc, argv); return testStatus; }
3. 确保构建配置正确触发test分支
- 打开Qt Creator的「项目」模式,切换到对应的构建套件。
- 找到「构建步骤」中的「qmake」,在「额外参数」中添加
CONFIG+=test。 - 执行「清理项目」,再重新执行qmake并构建,避免旧缓存影响。
4. 验证效果
构建test分支时:
- 控制台仅显示
test build。 - 编译器不会处理.ui文件(test分支无FORMS配置,也不包含UI相关源文件)。
- 仅编译测试代码和必要的公共逻辑文件。
内容的提问来源于stack exchange,提问作者Ioana-R
相关产品推荐
相关产品推荐

