如何构建项目,同时通过QTestLib单元测试的Qt应用程序(How to structure pr

2019-07-31 05:44发布

我得到了我的Qt项目,我使用Qt的创造者。 我想单元测试我的代码。
不过我在QTestLib框架相当新的,但每个人都推荐它用于测试基于Qt的来源。 现在我有点困惑如何构建测试项目与应用项目。

  1. 我可以把所有的源和测试代码在同一个项目? 如果是这样,我怎么能管理它们? 我没有发现,让我开始应用或在一个项目开始测试的任何选项。
  2. 如果我把应用程序源和测试代码在不同的项目中,测试项目将引用应用项目,这是不是很方便。
  3. 对于很多需要为被测试类,如何管理测试的代码?

你们如何管理这样的情况下测试的代码? 谢谢。

Answer 1:

第一结构源象下面这样:

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

包括这.priMyApp.pro ,如:

include(MyAppSrc.pri)

然后,结构测试项目完全一样的主体工程,一个额外的包括MyAppUnitTest.pro

include(MyAppUnitTestSrc.pri)
include(../MyApp/MyAppSrc.pri)


Answer 2:

我用这个方法: 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"


Answer 3:

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

  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项目文件夹。

除此之外,我还建议增加一个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的另有所花费的开发时间项目:))。 针对不同的使用情况最后但并非最不重要,你可以勾勒出解决方案。



Answer 4:

我使用Qt Creator的由CMake的,而不是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}
)

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



文章来源: How to structure project while unit-testing Qt app by QTestLib