Sailfish OSの開発:Sailfish OSのQt / C ++の単体テスト

こんにちは この記事は、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ライブラリには、テストを実行する前にテスト用のデータを構成したり、テストを実行した後に整頓したりできるメソッドがあります。



上記の情報を適用すると、プロジェクトをテストするこのクラスのようなものを取得できます。

 #include <QObject> #include "src/myclass.h" class TestMyClass : public QObject { Q_OBJECT private: MyClass myClass; private slots: void init(); void testAdd(); void testMultiply(); };
      
      





関数の結果を期待される結果と比較するために、マクロ置換が使用されます:



マクロの詳細については、 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グループチャネルでも議論できます。



著者:マキシムコステリン



All Articles