Как правильно настроить проект subdirs с отдельным App и Qt Quick Test? - PullRequest
0 голосов
/ 13 февраля 2020

Я борюсь с правильной настройкой для моего нового проекта. Я пытаюсь включить модульные тесты для элементов C ++ и QML, но я действительно застрял в настройке части QML.

Я уже прочитал Документы быстрого тестирования Qt , но это не помогло мне понять самые основы проекта subdirs с тестовыми проектами внутри него. Прежде всего, я прочитал, что должны быть отдельные проекты для исходного кода моего основного приложения и моего тестового приложения .

Как я должен это делать импортировать компоненты Qt Quick из моего основного приложения в тестовое приложение tst_unittest.qml файл, чтобы я мог проверить его поведение?

Что я имею в виду примерно так:

// tst_unittest.qml

import QtQuick 2.0
import QtTest 1.0

//some kind of import here?

TestCase {
    name: "UnitTests"

    ComponentToTest{
        id: entityToTest
    }

    function test_case() {
        compare(entityToTest.funcToTest(), false, "funcToTest unit test")
    }
}

Дерево моего проекта выглядит так:

-subdirs_project
|---subdirs_project.pro
|
|---main_app
|   |---main_app.pro
|   |---ComponentToTest.qml
|
|---test_app
|   |---test_app.pro
|   |---tst_unittests.qml

И мой test_app.pro :

CONFIG += warn_on qmltestcase

TEMPLATE = app

DISTFILES += \
    tst_unittests.qml

SOURCES += \
    main.cpp

IMPORTPATH += \
    $$PWD/../main_app/ComponentToTest.qml

Это, по крайней мере, где-то рядом, как это должно выглядеть, или я должен просто перехватить sh и сделать это по-другому?

1 Ответ

0 голосов
/ 13 марта 2020

Мне удалось настроить мой проект и запустить все тесты, поэтому я думаю, что лучше написать об этом здесь для всех будущих людей, которым это может понадобиться. Я не собираюсь вставлять сюда содержимое каждого файла, но я публикую наиболее важные из них, которые доставили мне неприятности. Например, testentity.cpp и testentity.h - это просто обычные исходные и заголовочные файлы для простого класса C ++, и я не думаю, что здесь нужно объяснять компоненты qml. Если какой-либо файл не описан ниже, вы можете предположить, что он был в порядке с самого начала, и Qt Creator сделал все сам или изменения просто тривиальны.

ОРГАНИЗАЦИЯ ФАЙЛА:

.
├── ExampleProject
│   ├── ExampleProject.pro
│   ├── controls
│   │   ├── another_module
│   │   │   ├── testentity.cpp
│   │   │   └── testentity.h
│   │   ├── example_module
│   │   │   ├── testclass.cpp
│   │   │   ├── testclass.h
│   │   │   ├── testsubject.cpp
│   │   │   └── testsubject.h
│   │   ├── components
│   │   │   ├── applayout
│   │   │   │   ├── LayoutComponent.qml
│   │   │   │   └── SideMenu.qml
│   │   │   └── controls
│   │   │       └── PositioningDummy.qml
│   │   ├── controls.pro
│   │   ├── main.cpp
│   │   ├── main.qml
│   │   └── qml.qrc
│   ├── tests_cpp
│   │   ├── main.cpp
│   │   ├── tests_cpp.pro
│   │   ├── tst_controls.cpp
│   │   ├── tst_controls.h
│   │   ├── tst_layout.cpp
│   │   └── tst_layout.h
│   └── tests_qt_quick
│       ├── main.cpp
│       ├── tests_qt_quick.pro
│       ├── tst_controls.qml
│       └── tst_layout.qml
└── README.md

mainprojectfile.pro

TEMPLATE = subdirs

SUBDIRS += \
    controls \
    tests_cpp \
    tests_qt_quick

tests_ cpp .pro

QT += testlib
QT -= gui

CONFIG += qt console warn_on depend_includepath testcase
CONFIG -= app_bundle

TEMPLATE = app

SOURCES +=  tst_controls.cpp \
    main.cpp \
    tst_layout.cpp

HEADERS += \
    tst_controls.h \
    tst_layout.h

# 1) Define each module as INCDIR_MODULE_NAME
# 2) Add INCDIR_MODULE_NAME to INCLUDEPATH
# 3) Add each of the classes you want to test into HEADERS and SOURCES

INCDIR_EXAMPLE_MODULE = ../controls/example_module
INCDIR_ANOTHER_MODULE = ../controls/another_module

INCLUDEPATH += \
    $$INCDIR_EXAMPLE_MODULE \
    $$INCDIR_ANOTHER_MODULE

SOURCES += \
    $$INCDIR_EXAMPLE_MODULE/testclass.cpp \
    $$INCDIR_EXAMPLE_MODULE/testsubject.cpp \
    $$INCDIR_ANOTHER_MODULE/testentity.cpp \

HEADERS += \
    $$INCDIR_EXAMPLE_MODULE/testclass.h \
    $$INCDIR_EXAMPLE_MODULE/testsubject.h \
    $$INCDIR_ANOTHER_MODULE/testentity.h

tests_cpp / main. cpp

#include <QTest>

#include "tst_layout.h"
#include "tst_controls.h"

int main(int argc, char *argv[])
{
    int status = 0;

    Tst_Layout tst_layout;
    status |= QTest::qExec(&tst_layout, argc, argv);

    Tst_Controls tst_controls;
    status |= QTest::qExec(&tst_controls, argc, argv);

    return status;
}

tests_cpp / tst_layout.h

#ifndef TST_LAYOUT_H
#define TST_LAYOUT_H

#include <QtTest>

// include class from our controls project
#include "testentity.h"

class Tst_Layout : public QObject
{
    Q_OBJECT
public:
    explicit Tst_Layout(QObject *parent = nullptr);

private slots:

    void initTestCase();
    void cleanupTestCase();

    void test_case1();
};

#endif 

tests_qt_quick.pro

CONFIG += warn_on qmltestcase

TEMPLATE = app

DISTFILES += \
    tst_controls.qml \
    tst_layout.qml

SOURCES += \
    main.cpp

tests_qt_quick / tst_layout.qml

/**
 * tst_layout.qml
 * Created: 04.03.2020
 *
 * Author: Jakub Dabros
 * Copyright (c) 2020 Prodromus Ltd.
 *
 * Description: Plik testow jednostkowych dla komponentow odpowiadajacych za layout.
 */
import QtQuick 2.12
import QtTest 1.12

import "../controls/components/applayout" as AppLayout
import "../controls/components/controls" as Controls

TestCase {
    name: "Layout"

    function initTestCase() {}

    function cleanupTestCase() {}

    // please bear in mind that test functions below are not my actual tests
    // they are here only to show the very basics of how to set up Qt Quick tests

    function test_layoutEntityReturnTrue() {
        verify(layoutEntity.returnTrue(),("Put some test fail message here."))
    }

    function test_sideMenuReturnTrue() {
        verify(layoutEntity.returnTrue(),("Put some test fail message here."))

    }

    AppLayout.LayoutComponent {
        id: layoutEntity
    }

    AppLayout.SideMenu {
        id: sideMenuEntity
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...