Qtクイックテスト

はじめに

Qt Quick Test は QML アプリケーションのためのユニットテストフレームワークです。テストケースは、 タイプの JavaScript 関数として記述します:TestCase

import QtQuick 2.3
import QtTest 1.0

TestCase {
    name: "MathTests"

    function test_math() {
        compare(2 + 2, 4, "2 + 2 = 4")
    }

    function test_fail() {
        compare(2 + 2, 5, "2 + 2 = 5")
    }
}

名前がtest_ で始まる関数は、実行されるテストケースとして扱われます。テストケースの書き方については、TestCaseSignalSpy のドキュメントを参照してください。

注意: Qt Quick Test モジュールには、バイナリ互換性の保証はありません。つまり、Qt Quick Test を使用するアプリケーションは、開発された Qt のバージョンでのみ動作が保証されます。しかし、ソースの互換性は保証されています。

モジュールの使用

QML API

Qt Quick Test の QML タイプは、QtTest のインポートから利用できます。型を使用するには、.qml ファイルに以下の import 文を追加してください:

import QtTest

C++ API

C++ API を使用するには、モジュール・ライブラリに対して直接、または他の依存関係を介してリンクする必要があります。CMakeや qmakeなど、いくつかのビルド・ツールはこのための専用サポートを持っている。

CMakeでのビルド

find_package() コマンドを使って、Qt6 パッケージの中から必要なモジュールコンポーネントを探します:

find_package(Qt6 REQUIRED COMPONENTS QuickTest)
target_link_libraries(mytarget PRIVATE Qt6::QuickTest)

CMake によるビルドの概要も参照してください。

qmakeによるビルド

対応する C++ ライブラリにリンクするには、2つの方法があります。テストプロジェクトがQMLTestCase を使用している場合、プロジェクトファイル中に以下の行が既にあるはずです:

CONFIG += qmltestcase

これにより、テストは C++ QtQuickTest ライブラリにリンクされます。

C++ のみのテストプロジェクトの場合は、プロジェクトファイルに次の行を追加してください:

QT += qmltest

テストの実行

テストケースは、以下のコードで構成される C++ ハーネスによって起動される:

#include <QtQuickTest>
QUICK_TEST_MAIN(example)

ここで "example "は、この一連のテストを一意に識別するための識別子である。

qmake#tab-qmake.txt ファイルを設定し、ビルドする。

CMakeLists.txtファイルを設定し、お気に入りのジェネレーターを使ってプロジェクトをビルドします。

cmake_minimum_required(VERSION 3.2)

project(tst_example LANGUAGES CXX)

enable_testing()

find_package(Qt6 REQUIRED COMPONENTS QuickTest Qml)

#[[The test harness scans the specified source directory recursively
for "tst_*.qml" files. By default, it looks in the current directory,
which is usually where the executable is. This command makes it look
in the project's source directory instead.]]
add_definitions(-DQUICK_TEST_SOURCE_DIR="${CMAKE_CURRENT_SOURCE_DIR}")

qt_standard_project_setup(REQUIRES 6.6)

add_executable(tst_example tst_example.cpp)

add_test(NAME tst_example COMMAND tst_example)

target_link_libraries(tst_example
    PRIVATE
    Qt6::QuickTest
    Qt6::Qml
)

プロジェクトファイルにCONFIG += qmltestcase を追加します:

TEMPLATE = app
TARGET = tst_example
CONFIG += warn_on qmltestcase
SOURCES += tst_example.cpp

IMPORTPATH が .pro ファイルに指定されている場合、IMPORTPATH に追加された各 import パスは、"make check" を使ってテストを実行するときにコマンドライン引数として渡されます:

IMPORTPATH += $$PWD/../imports/my_module1 $$PWD/../imports/my_module2

テストハーネスは指定されたソースディレクトリを再帰的にスキャンし、"tst_*.qml "ファイルを探します。QUICK_TEST_SOURCE_DIR が定義されていない場合、ハーネス実行時にカレントディレクトリがスキャンされます。テストが使用する補助的な QML コンポーネントのために、他の *.qml ファイルが現れるかもしれません。

-input コマンドラインオプションを実行時に設定することで、別のディレクトリからテストケースを実行することができます。これは、コンパイルされたディレクトリー名がホストを参照するターゲットデバイス上でテストを実行するために必要です。例えば

tst_example -input /mnt/SDCard/qmltests

-input オプションを使用して単一のファイルを実行することも可能です。例えば

tst_example -input data/test.qml
tst_example -input <full_path>/test.qml

注: qmlテストファイルへのフルパスの指定は、例えばシャドウビルドに必要です。

テストケースに QML のインポートが必要な場合は、テストプログラムのコマンドラインに-import オプションとして追加してください。

-functions コマンドラインオプションは、現在のテスト関数のリストを返します。引数にテスト関数の名前を指定することで、単一のテスト関数を実行することができます。例えば

tst_example Test_Name::function1

-help コマンドラインオプションは、利用可能なすべてのオプションを返します。

tst_example -help

注意: Qt Quick のテストケースを実行すると、テストコードに Quick UI が含まれていなくても、常に画面にウィンドウが表示されます。これを避けるには、-platform offscreen を指定してテスト実行ファイルを実行してください。

QML テストの前に C++ を実行する

QML テストを実行する前に C++ コードを実行するには、QUICK_TEST_MAIN_WITH_SETUP マクロを使用します。これは QML エンジンのコンテキストプロパティを設定する際などに便利です。

このマクロはQUICK_TEST_MAIN と同じですが、追加の型引数を取ります。テストフレームワークは以下の名前のスロットや呼び出し可能な関数を呼び出します:

名前目的目的
void applicationAvailable()QApplication オブジェクトがインスタンス化された直後に呼び出されます。この関数は、QQmlEngine インスタンスを必要としないセットアップを実行するために使用します。Qt 5.12
void qmlEngineAvailable(QQmlEngine *)QML エンジンが利用可能になったときに呼び出されます。この時点までにimport paths,plugin paths,extra file selectors のいずれかがエンジンに設定されているはずです。

この関数は各QMLテストファイルに対して一度だけ呼び出されるので、引数はそのテストに固有です。例えば、各QMLテストファイルはそれぞれ独自のQMLエンジンを持つことになります。

この関数はQMLの型や add import paths などを登録するために使用します。

Qt 5.11
void cleanupTestCase()テスト実行終了直後に呼び出されます。この関数を使用して、すべてが破棄される前に片付けます。Qt 5.12

次の例は、QMLエンジンのコンテキストプロパティを設定するためにマクロを使用する方法を示しています:

// src_qmltest_qquicktest.cpp
#include <QtQuickTest>
#include <QQmlEngine>
#include <QQmlContext>
#include <QGuiApplication>

class Setup : public QObject
{
    Q_OBJECT

public:
    Setup() {}

public slots:
    void applicationAvailable()
    {
        // Initialization that only requires the QGuiApplication object to be available
    }

    void qmlEngineAvailable(QQmlEngine *engine)
    {
        // Initialization requiring the QQmlEngine to be constructed
        engine->rootContext()->setContextProperty("myContextProperty", QVariant(true));
    }

    void cleanupTestCase()
    {
        // Implement custom resource cleanup
    }
};

QUICK_TEST_MAIN_WITH_SETUP(mytest, Setup)

#include "src_qmltest_qquicktest.moc"

.moc インクルードは、.cpp ファイルのファイル名に基づいています。たとえば、上記の例では、.cpp ファイルの名前はsrc_qmltest_qquicktest.cpp です。例えば、上記の例では、MyTest.cpp ファイルの名前は です:

#include "MyTest.moc"

参照

ライセンス

Qt Quick Tests はThe Qt Company の商用ライセンスでご利用いただけます。また、フリーソフトウェアライセンスでも提供されています。Qt 5.4 以降、これらのフリーソフトウェアライセンスはGNU Lesser General Public License, version 3 またはGNU General Public License, version 2 です。詳細はQt ライセンスを参照してください。

本ドキュメントに含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。