Подтвердить что ты не робот

Как структурировать проект во время модульного тестирования Qt-приложения QTestLib

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

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

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

4b9b3361

Ответ 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

Включите этот .pri в MyApp.pro, например:

include(MyAppSrc.pri)

Затем структурируйте проект тестирования точно так же, как и основной проект, с одним дополнительным включите в MyAppUnitTest.pro:

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

Ответ 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"

Ответ 3

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

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

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

Ответ 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}
)

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