У меня не было много времени, чтобы сделать идеальное модульное тестирование в Qt. Однако я выяснил, как получить основную работу сантехники. Я надеюсь, что это может вам помочь, хотя вы, вероятно, могли бы сделать лучше, чем я, изучив Writing Unit Tests guide.
Как создать набор тестов? Кажется, что все документы и учебники охватывают только одно тестовое задание, но как я могу эффективно объединить мои модульные тесты?
Вы можете организовать «сюиты», собирая единичные тесты (которые представляют собой слоты на объектах) в объекты и составляют эти объекты.
test_example.pro
TARGET = test_example
TEMPLATE = app
CONFIG += testcase
QT += testlib core
... INCLUDEPATH, SOURCES, HEADERS, etc...
main.cpp
#include <QtTest/QtTest>
#include "MainTest.h"
// This macro introduces an event loop
QTEST_MAIN(MainTest)
MainTest.h
class MainTest : public QObject
{
Q_OBJECT
private slots:
// Each slot is a unit test
void init()
{
}
// Create a "test suite" by bundling tests into objects
void runFirstSuite()
{
FirstSuiteUiTest first;
first.test(); // runs 10 tests
FirstSuiteIoTest second;
second.test(); // runs 999 tests
...
}
void SecondSuite()
{
QFAIL("This suite is not really a suite, and it always fails");
}
};
Вы можете также орган ize в физических файловых структурах. Я использовал проект subdirs в качестве моего корневого файла .pro, чтобы я мог создавать артефакты (динамические и статические архивы, двоичные файлы) и запускать множество коллекций модульных тестов.
TEMPLATE = subdirs
CONFIG += ordered
SUBDIRS += src/core
SUBDIRS += src/some_dll
SUBDIRS += src/test/awesome_core_test_1 #Holds many suites
SUBDIRS += src/test/awesome_core_test_2 #Holds many other suites!
core.depends = core
awesome_core_test_1.depends = core
awesome_core_test_2.depends = core
Таким образом, организуя единичные тесты в композициях объектов и физических файлах, вы можете определить степень детализации организации. Там могут быть лучшие или разные способы, но я не уверен.
Как я могу интегрировать выполнение теста в Qt Creator? Может быть, запуск тестов поэтапно будет интересным?
Добавить CONFIG += testcase
в ваш .pro файл. Это создает цель сборки. Вызвать сборку и испытания с помощью запуска make check
Следует ли добавить все нормальные исходные файлы в тестовый проект или есть способ создать статическую библиотеку?
Вы можете сделать это, как и в любом другом проекте.
Это правильный ответ. Я бы добавил только возможность включить файлы библиотеки в тестовый проект (например, выполняя 'SOURCES + = ../ lib/* cpp') в качестве альтернативы тестированию библиотечного API. –
'В модульном тестовом классе Qt каждый отдельный слот - это единичный тест' - скажите, что? – dtech
@ddriver добавил котировки. Спасибо. – Milovidov