こんにちは この記事は、Sailfishアプリケーションのテストに関する一連の記事(
前の記事 )の続きであり、今回はSailfish OSのプロジェクトの一部としてC ++ユニットテストを取り上げます。
テストアプリケーション
そのため、Sailfish OSのアプリケーションの基本的な例があります。これは
、このプロジェクトの
リポジトリで利用できます(Sailfish OSのアプリケーションの作成方法は、
以前の記事の 1つで見つけることができます)。 QMLコンポーネントには、単一のようこそ画面が含まれています。
import QtQuick 2.0 import Sailfish.Silica 1.0 ApplicationWindow { Label { x: Theme.horizontalPageMargin text: "Hello Sailors" color: Theme.secondaryHighlightColor font.pixelSize: Theme.fontSizeExtraLarge } }
さらに、C ++には1つの小さなクラスがあります。
class MyClass { public: MyClass(); MyClass(int first, int second); int add() const; int multiply() const; private: int firstValue, secondValue; };
その意味は簡単です-2つの値を保存し、それらの合計と積を見つけます。 このクラスをテストします。
プロジェクト作成
テストとアプリケーション自体は、1つのプロジェクトのサブディレクトリとして配置する必要があります。 これを行うには、新しいプロジェクトを作成するときに、「サブディレクトリを持つプロジェクト」を選択します。

または、すでに作成されている
* .proファイルで、
TEMPLATE = subdirsを指定します。 このテンプレートは、プロジェクトにサブディレクトリが含まれていることを示しています。 これで、メインプロジェクトのコンテキストメニューでサブプロジェクトを追加できます。

このようなサブプロジェクトには少なくとも2つ必要です。そのうちの1つはアプリケーション自体であり、2つ目はテストです。 QtCreatorを使用して作成すると、それらは
* .proファイルにサブディレクトリとして自動的に追加されます。 アプリケーションがすでに作成されている場合、その名前を
* .proの SUBDIRS変数に手動で追加するだけです。 その結果、
SUBDIRSは次のようになります。
SUBDIRS = \ app \ tests
テスト自体の作成に移りましょう。 ユニットテストの場合、QtはQtTestフレームワークを使用し
ます 。
これは、
前の記事で既に言及されて
います 。 これを使用するには、PkgConfigを使用したビルドに応じて、
* .yamlプロジェクトファイルに
Qt5Testを追加する必要があります。
テストを作成するには、テストスイートを含む
* .proサブプロジェクトファイルで、
testlibモジュールを接続する必要があります。
QT += testlib
また、テストするファイルを指定する必要があります。 これを行う最も簡単な方法は、プロジェクトのサブディレクトリに
* .priファイルを作成し、テストされたクラスへのパスを指定することです。
HEADERS += $$PWD/src/myclass.h SOURCES += $$PWD/src/myclass.cpp
次に、テストで
* .proアプリケーションおよびプロジェクトファイルに含める必要があります。
INCLUDEPATH += ../app/ include(../app/app.pri)
TARGETは、サブプロジェクトの名前を示します。 後で、同じ名前のファイルを実行してテストを実行する必要があります。
その後、テストサブプロジェクトの
* .proファイルは次のようになります。
TARGET = SailfishProjectTest CONFIG += sailfishapp qt c++11 QT += testlib HEADERS += testmyclass.h SOURCES += testmyclass.cpp \ nain.cpp INCLUDEPATH += ../app/ include(../app/app.pri)
テストを書く
テストを記述するために、テストスクリプトを含む別のクラスが実装されます。
QObjectクラスの子孫でなければなりません。 テスト自体は、このクラスのプライベートスロットとして追加されます。 各スロットはテスト機能として機能します。
QtTestライブラリには、テストを実行する前にテスト用のデータを構成したり、テストを実行した後に整頓したりできるメソッドがあります。
- initTestCase() -最初のテスト関数の前に呼び出されます。エラーが発生した場合、単一のテスト関数は実行されません。
- cleanupTestCase() -すべてのテスト関数が実行された後に呼び出されます。
- init() -各テスト関数の前に呼び出されます。エラーが発生すると、後続のテストは実行されません。
- cleanup() -各テスト関数の後に呼び出されます。
上記の情報を適用すると、プロジェクトをテストするこのクラスのようなものを取得できます。
#include <QObject> #include "src/myclass.h" class TestMyClass : public QObject { Q_OBJECT private: MyClass myClass; private slots: void init(); void testAdd(); void testMultiply(); };
関数の結果を期待される結果と比較するために、マクロ置換が使用されます:
- QVERIFY(条件)は引数として式を取り、それが間違っている場合、テストログに標準エラーメッセージを表示します。
- QVERIFY2(条件、メッセージ)は QVERIFY( )と似ていますが、条件が偽の場合、引数で指定されたメッセージを表示します。
- QTRY_VERIFY_WITH_TIMEOUT(条件、タイムアウト)は QVERIFY( )と似ていますが、条件が真になるまで、または2番目の引数で指定された時間が経過するまで比較を繰り返します。
- QTRY_VERIFY2_WITH_TIMEOUT(条件、メッセージ、タイムアウト)は QVERIFY2()に似ており、 QTRY_VERIFY_WITH_TIMEOUT()と同じ方法で比較を繰り返します。
- QTRY_VERIFY(条件) 、 QTRY_VERIFY2(条件、メッセージ)は上記のものと似ていますが、タイマーは5秒です。
- QCOMPARE(実際、予想)は、失敗したテストに関する詳細情報を提供します。 引数は関数の結果と期待される結果であり、一致しない場合、これらの値の両方がテストログに表示されます。
- QTRY_COMPARE_WITH_TIMEOUT(実際、予想、タイムアウト)は QCOMPARE()に似ていますが、値が正しいか、指定されたミリ秒単位の時間に達するまで比較を繰り返します。
- QTRY_COMPARE(実際、予想)は QTRY_COMPARE_WITH_TIMEOUT()と同じですが、タイマーは5秒です。
マクロの詳細については、
QTestのドキュメントを参照してください 。
上記の情報を使用して、テスト関数を記述します。
#include <QtTest/QtTest> #include "src/myclass.h" #include "testmyclass.h" void TestMyClass::init() { myClass = MyClass(4, 2); } void TestMyClass::testAdd() { QCOMPARE(myClass.add(), 6); } void TestMyClass::testMultiply() { QCOMPARE(myClass.multiply(), 8); }
プロジェクトではテストクラスが
.hファイルと
.cppファイルに分割されているため、このステップで単体テストの記述プロセスは終了します。 ただし、
.hファイルがなく、クラス全体が
.cppファイルに完全に記述されている場合は、自動生成された
.mocファイルを含める必要があります。 たとえば、
#include "testmyclass.moc"
。
最後に行うことは、テストを実行するためのエントリポイントを整理することです。 これを行うには、テスト付きの
* .cppクラスファイル、または別の
main.cppで、
QTEST_MAIN()/ QTEST_APPLESS_MAIN()/ QTEST_GUILESS_MAIN()の3つのマクロのいずれかを使用します。 テストクラスの名前が引数として渡されます。 各マクロは
main()関数を宣言するため、サブプロジェクトで1回しか使用できません。 単体テストを持つ異なるクラスは、別々のサブプロジェクトに配置する必要があります。
テストを実行する
これで、プロジェクトの準備が整いました。環境から開始します。 デバイスで正常に起動すると、
TARGETで指定された名前のファイルが
/ usr / binディレクトリに表示されます。 このファイルを実行するだけです。
*********Start testing of TestMyClass ********* Config: Using QtTest library 5.2.2 Qt 5.2.2 PASS : TestMyClass::initTestCase() PASS : TestMyClass::testAdd() PASS : TestMyClass::testMultiply() PASS : TestMyClass::cleanupTestCase() Totals: 4 passed, 0 failed, 0 skipped ********Finish testing of TestMyClass *********
おわりに
この記事では、Sailfish OSプラットフォームのアプリケーションをテストするための単体テストを作成する方法を検討しました。 例として、ソースが(テストとともに)
GitHubで利用できる単純なアプリケーションを考えました。
技術的な問題
は、ロシア語を話すコミュニティのSailfish OSのTelegramまたは
VKontakteグループの
チャネルでも議論できます。
著者:マキシムコステリン