【发布时间】:2012-03-20 06:15:13
【问题描述】:
我正在 Qt Creator 中创建一个单元测试 Qt 项目,该项目引用了我想要测试的项目中的文件。现在,无论我是通过 .pri 文件引用我想测试的类,还是通过将相关文件直接添加到单元测试项目的 SOURCES 和 HEADERS 变量中(而且 .pri 文件似乎真的做同样的事情,它只包含 SOURCES 和HEADERS 条目),从主项目添加文件似乎会覆盖单元测试项目中的 main.cpp。
我的意思是,当我构建并运行 uni tests 可执行文件时,原始项目的 main() 函数会运行!如果我重命名原始项目中的 main.cpp 或单元测试项目中的 main.cpp(更改其 .pro 文件),那么事情就会顺利进行。好吧,我可以接受这样的解决方案,但这有点不舒服,因为在未来的某一天,我可能会不小心为这两个项目中的某些文件使用相同的名称,谁知道呢,可能会遇到错误,这将是一场噩梦.除此之外,我只是好奇这种行为的原因是什么。
当然 .pri 文件只包含类头文件和 cpp 文件,而不是原始应用程序的 main.cpp,例如就我而言:
HEADERS += \
../Project/fooclass.h
SOURCES += \
../Project/fooclass.cpp
另外两个项目都在彼此相邻的目录中,而不是嵌套的。
编辑:Frank Osterfeld 要求查看我的测试的 pro 文件,所以这里是:
测试的专业文件:
QT += core
QT -= gui
QT += testlib
TARGET = Tests
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
SOURCES += \
test_class.cpp \
main_unit_tests.cpp
HEADERS += \
AutoTest.h \
test_class.h \
include(trial.pri)
Trial.pri 包含我要测试的主项目中的文件。 main_unit_tests.cpp(从原始 main.cpp 重命名为临时解决方案)包含:
#include <QtCore/QCoreApplication>
#include "AutoTest.h"
TEST_MAIN
TEST_MAIN 在 AutoTest.h 中定义为
#define TEST_MAIN \
int main(int argc, char *argv[]) \
{ \
return AutoTest::run(argc, argv); \
}
访问page 了解 AutoTest.h 的作用。简而言之,它使使用 Qt 框架运行多个单元测试变得少了一些麻烦。
编辑: 亲。主项目的文件(即包含我要测试的类)是:
QT += core
QT -= gui
TARGET = Project
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
SOURCES += main.cpp \
fooclass.cpp
HEADERS += \
fooclass.h
它位于路径上:...\Unit_Test\Project
而单元测试项目位于路径上: ...\Unit_Test\Tests
现在一切正常,因为定义 main() 的文件在两个项目中都不同。一旦我将它们重命名为相同,单元测试项目就会执行原始项目的主要功能。
【问题讨论】:
-
能否请您同时显示 .pro 和 .pri。如果两个项目都在不相关的目录中,并且您没有包含基本应用程序的
main(),我几乎看不出这是怎么可能的。 -
我无法看到这是如何发生的...如果您希望我进一步了解,请提供包含完整来源的 .tar/.zip。
-
@Koying - mediafire.com/?32q82e3h77hw1m0 只要我将“测试”项目中的 main.cpp 更改为任何其他名称,事情就会按预期工作。我能够通过其他一些小项目重现它,这似乎不是一次性的故障。
-
makefile中有MSVC2010的痕迹。您实际上是如何编译项目的?
-
@Koying - 我在 QT Creator 下使用 MS Visual Studio C++ 工具链进行构建。我在这里发布的内容不需要它,但通常我需要使用为 Visual Studio 编译的 dll,因此不能使用默认的 MinGW 工具。
标签: c++ qt qt-creator