You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 06:34:59