Как структурировать проект при модульном тестировании Qt app с помощью QTestLib

Я получил свой проект Qt, и я использую Qt Creator. Я хочу проверить весь свой код.
Однако я довольно новичок в qtestlib framework, но все рекомендовали его для тестирования источника на основе Qt. Теперь я немного запутался, как структурировать тестовый проект с помощью app project.

  1. могу ли я поместить весь исходный и тестовый код в один проект? Если да, то как я смогу с ними справиться? Я не нашел ни одного варианта, который позволил бы мне запустить приложение или начать тест в одном проекте.
  2. если я ставлю приложение исходный код и код тестирования в отдельных проектах проект тестирования будет ссылаться на проект приложения, что не совсем удобно.
  3. для лотов для классов, необходимых для тестирования, как управлять кодом тестирования?

Как вы, ребята, управляете тестовым кодом в такой ситуации? Спасибо.

4 ответов


первый источник структуры, как показано ниже:

MyApp
MyAppUnitTest

под используйте 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 config в один что строит все. Иерархия файлов:

myproject.pro
src/
    Example1.cpp
    Example2.cpp
    Example1.h
    Example2.h
test/
    ExampleTest.cpp
    ExampleTest.h

:

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"

мне нравятся другие ответы, но я хотел бы также дать некоторые отзывы о том, как мы это делаем в компании, в которой я сейчас работаю:

  1. создать subdirs project (это будет проект верхнего уровня, который будет управлять всеми, включая проект библиотеки или все, что вы хотите проверить)

    +-----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. создать добавить его в тестирование 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 также обеспечивает создание реальные каталоги в файловой системе. Если вы хотите избежать слишком много subdirsing вы можете группировать тесты в папках, которые вы создали самостоятельно в своей файловой системе внутри 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 :)). И последнее, но не менее важное: вы можете наметить решения для разных вариантов использования.


Я использую 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"

вам просто нужно связать lib с тестовым исполняемым файлом.

пример:

в папке 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}
)

Он все еще находится в том же проекте, но вы можете добавить флаг, чтобы позволить пользователю скомпилировать тест или нет. Это чисто, потому что приложение остается нетронутым, и это позволяет протестировать каждый класс вашего приложения.