39

我得到了我的 Qt 项目,并且正在使用 Qt Creator。我想对我所有的代码进行单元测试。
但是我对 QTestLib 框架还是很陌生,但每个人都推荐它来测试基于 Qt 的源代码。现在我有点困惑如何用应用程序构建测试项目。

  1. 我可以将所有源代码和测试代码放在同一个项目中吗?如果是这样,我该如何管理它们?我没有找到任何让我在一个项目中启动应用程序或开始测试的选项。
  2. 如果我把app源码和测试代码放在不同的项目中,测试项目会引用app项目,不太方便。
  3. 对于需要测试的类的批次,我如何管理测试代码?

在这种情况下,你们如何管理测试代码?谢谢。

4

4 回答 4

18

第一个结构源如下:

MyApp
MyAppUnitTest

MyApp项目下,使用 aMyAppSrc.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)
于 2012-12-25T02:46:21.763 回答
15

我使用这种方法: 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)
}

在我的示例中,我正在构建一个插件库,但该方法也应该适用于应用程序。在应用程序的情况下,SOURCES -= src/main.cpp该子句可能需要它else,插件库没有它。如果不这样做,应用程序的 将与单元测试的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"
于 2016-04-29T09:25:43.213 回答
9

我喜欢其他答案,但我也想就我目前工作的公司如何做到这一点提供一些反馈:

  1. 创建一个subdirs项目(这将是管理所有项目的顶级项目,包括您的库项目或您想要测试的任何项目)

    +-----MyProject (top-level subdirs)
    
  2. 将您的库项目添加为子项目

    +-----MyProject (top-level subdirs)
              |
              +-----Library (library project, UI project etc.)
    
  3. 添加另一个subdirs项目(用于测试)

    +-----MyProject (top-level subdirs)
              |
              +-----Library (library project, UI project etc.)
              |
              +-----Tests (subdirs for tests)
    
  4. 创建一个QUnitTest项目并将其添加到测试subdirs项目中

    +-----MyProject (subdirs)
              |
              +-----Library (library project, UI project etc.)
              |
              +-----Tests (subdirs for tests)
                      |
                      +----- TestA (QUnitTest project for testing feature A)
    
  5. 添加您认为合适的尽可能多的测试

             ...
              |
              +-----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项目文件夹内的文件系统中创建的文件夹中。

除此之外,我还建议添加一个subdirsfor template projects

+-----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项目:))。

于 2016-11-02T12:40:31.477 回答
1

我使用 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 文件夹中的 CMakeLists.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}
)

它仍然在同一个项目中,但是您可以添加一个标志来让用户编译或不编译测试。它很干净,因为应用程序保持不变,它允许您测试应用程序的每个类。

于 2012-12-21T23:56:22.640 回答