Как структурировать проект при модульном тестировании Qt app с помощью QTestLib
Я получил свой проект Qt, и я использую Qt Creator. Я хочу проверить весь свой код.
Однако я довольно новичок в qtestlib framework, но все рекомендовали его для тестирования источника на основе Qt. Теперь я немного запутался, как структурировать тестовый проект с помощью app project.
- могу ли я поместить весь исходный и тестовый код в один проект? Если да, то как я смогу с ними справиться? Я не нашел ни одного варианта, который позволил бы мне запустить приложение или начать тест в одном проекте.
- если я ставлю приложение исходный код и код тестирования в отдельных проектах проект тестирования будет ссылаться на проект приложения, что не совсем удобно.
- для лотов для классов, необходимых для тестирования, как управлять кодом тестирования?
Как вы, ребята, управляете тестовым кодом в такой ситуации? Спасибо.
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"
мне нравятся другие ответы, но я хотел бы также дать некоторые отзывы о том, как мы это делаем в компании, в которой я сейчас работаю:
-
создать
subdirs
project (это будет проект верхнего уровня, который будет управлять всеми, включая проект библиотеки или все, что вы хотите проверить)+-----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)
-
создать добавить его в тестирование
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 :)). И последнее, но не менее важное: вы можете наметить решения для разных вариантов использования.
Я использую 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}
)
Он все еще находится в том же проекте, но вы можете добавить флаг, чтобы позволить пользователю скомпилировать тест или нет. Это чисто, потому что приложение остается нетронутым, и это позволяет протестировать каждый класс вашего приложения.