我得到了我的Qt项目,我正在使用Qt Creator。我想对所有代码进行单元测试。
然而,我对QTestLib框架很陌生,但每个人都推荐它来测试基于Qt的源代码。现在我有点困惑如何使用应用程序项目构建测试项目。
- 我可以将所有源代码和测试代码放在同一个项目中吗?如果是这样,我该如何管理它们?我没有找到任何让我在一个项目中启动应用程序或开始测试的选项。
- 如果我将应用程序源代码和测试代码放在单独的项目中,测试项目将引用应用程序项目,这不太方便。
- 对于需要测试的类的批次,如何管理测试代码?
在这种情况下,你们如何管理测试代码?谢谢。
第一个结构源如下所示:
MyApp
MyAppUnitTest
在"MyApp
项目"下,使用MyAppSrc.pri
查找源文件:
SOURCES +=
../../../framework/src/myapp.cpp
../../../framework/src/mycontrol.cpp
HEADERS +=
../../../framework/inc/myapp.h
../../../framework/inc/mycontrol.h
INCLUDEPATH += ../../../framework/extlibs
将此.pri
包含在MyApp.pro
中,例如:
include(MyAppSrc.pri)
然后构建与主项目完全相同的测试项目,并在MyAppUnitTest.pro
中额外包含一个包含:
include(MyAppUnitTestSrc.pri)
include(../MyApp/MyAppSrc.pri)
我使用这种方法:http://xilexio.org/?p=125
也就是说,将test
配置放在构建所有内容的单个.pro
文件中。文件层次结构:
myproject.pro
src/
Example1.cpp
Example2.cpp
Example1.h
Example2.h
test/
ExampleTest.cpp
ExampleTest.h
myproject.pro
文件:
QT += #needed modules
CONFIG += qt c++11
HEADERS +=
src/Example1.h
src/Example2.h
SOURCES +=
src/Example1.h
src/Example2.h
test{
message(Configuring test build...)
TEMPLATE = app
TARGET = myapptests
QT += testlib
HEADERS +=
test/ExampleTest.h
SOURCES +=
test/ExampleTest.cpp
}
else{
TEMPLATE = lib
TARGET = myapp
CONFIG += plugin
TARGET = $$qtLibraryTarget($$TARGET)
}
在我的示例中,我正在构建一个插件库,但该方法也应该适用于应用程序。对于应用程序,根据 else
子句可能需要SOURCES -= src/main.cpp
,插件库没有它。如果不这样做,应用的main()
将与单元测试的main()
冲突。
ExampleTest.cpp
如下所示:
#include "ExampleTest.h"
void ExampleTest::exampleTest(){
//Do the tests
}
QTEST_MAIN(ExampleTest)
ExampleTest.h
如下所示:
#include <QtTest/QtTest>
class ExampleTest : public QObject {
Q_OBJECT
private slots:
void exampleTest();
};
若要在与常规生成不同的目录中生成项目测试,请运行:
qmake path/to/myproject.pro "CONFIG += test"
我喜欢其他答案,但我也想在我目前工作的公司提供一些反馈:
-
创建一个
subdirs
项目(这将是管理所有项目的顶级项目,包括您的库项目或您想要测试的任何内容(+-----MyProject (top-level subdirs)
-
将库项目添加为子项目
+-----MyProject (top-level subdirs) | +-----Library (library project, UI project etc.)
-
添加另一个
subdirs
项目(用于测试(+-----MyProject (top-level subdirs) | +-----Library (library project, UI project etc.) | +-----Tests (subdirs for tests)
-
创建
QUnitTest
项目并将其添加到测试subdirs
项目+-----MyProject (subdirs) | +-----Library (library project, UI project etc.) | +-----Tests (subdirs for tests) | +----- TestA (QUnitTest project for testing feature A)
-
添加您认为合适的任意数量的测试
... | +-----Tests (subdirs for test) | +----- TestA (QUnitTest project for testing feature A) | +----- TestB (QUnitTest project for testing feature B) | +----- TestC (QUnitTest project for testing feature C) | ... | +----- TestZ (QUnitTest project for testing feature Z)
如果您需要分组测试,您也可以使用subdirs
来执行此操作。 subdirs
还可以确保在文件系统中创建真实目录。如果要避免过多subdirs
,可以将测试分组到Tests
项目文件夹内文件系统中自己创建的文件夹中。
除此之外,我还建议为模板项目添加subdirs
。
+-----MyProject (subdirs)
|
+-----Library (library project, UI project etc.)
|
+-----Tests (subdirs for tests)
| |
| ...
|
+-----Templates (subdirs for template projects
|
+----- TemplateA (template project for feature A)
|
+----- TemplateB (template project for feature B)
|
+----- TemplateAB (template project for feature A and B together)
|
...
|
+----- TemplateZ (template project for feature Z)
这当然是基于库的功能。对于模板项目,我的意思是自定义小部件等,它们链接到您的库,并以用户应该显示的方式有选择地(或全部(公开其功能。例如,如果您有一个管理各种相机设备的库,则可以为每个相机设备创建一个模板项目,从而允许库的用户仅复制粘贴特定的模板项目并展开它,或者至少查看库的集成应该如何进行一般。这允许减少文档,同时提供很好的独立示例,这些示例应该减少开发时间,否则这些时间将花费在弄清楚库的集成和使用方式上(您可以说它是一组 Hello World 项目:)(。最后但并非最不重要的一点是,您可以概述不同用例的解决方案。
我使用CMake的Qt Creator而不是qmake来构建我的Qt项目。
基本上我有两个文件夹:
src
tests
每个测试本身就是一个测试类的程序。 要测试的应用程序被编译为库。您将文件夹 src 中的所有源代码编译为库。
// ClassTest.cpp
#include "ClassTest.h"
#include "Class2Test.h" // Class of the app
#include <QtTest/QtTest>
ClassTest::ClassTest( QObject* parent )
: QObject(parent)
{
}
QTEST_MAIN( ClassTest )
#include "ClassTest.moc"
您只需要将库链接到测试可执行文件即可。
例:
在 src 文件夹 CMakeList 中.txt示例
add_library( MyAPP
SHARED
Class2Test.cpp
)
target_link_libraries( MyAPP
${QT_LIBRARIES}
)
在测试文件夹 CMakeLists.txt 示例中,对于每个测试。
qt4_automoc( ${test_src} )
add_executable( ${test_name} ${test_src} )
target_link_libraries( ${test_name}
MyAPP
${QT_LIBRARIES}
${QT_QTTEST_LIBRARY}
)
它仍然在同一个项目中,但您可以添加一个标志来让用户编译或不编译测试。它很干净,因为该应用程序保持不变,并且允许您测试应用程序的每个类。