web-dev-qa-db-ja.com

QTestLibによるQtアプリの単体テスト中にプロジェクトを構造化する方法

Qtプロジェクトを取得し、QtCreatorを使用しています。すべてのコードを単体テストしたい。
しかし、私はQTestLibフレームワークにまったく慣れていませんが、Qtベースのソースをテストするために誰もがそれを推奨しました。今、私はテストプロジェクトをアプリプロジェクトで構成する方法に少し混乱しています。

  1. すべてのソースコードとテストコードを同じプロジェクトに入れることはできますか?もしそうなら、どうすればそれらを管理できますか? 1つのプロジェクトでアプリを起動したりテストを開始したりできるオプションが見つかりませんでした。
  2. アプリのソースとテストコードを別々のプロジェクトに配置すると、テストプロジェクトはアプリプロジェクトを参照するため、あまり便利ではありません。
  3. テストが必要なクラスのロットの場合、テストコードを管理するにはどうすればよいですか?

このような状況で、テストコードをどのように管理しますか?ありがとう。

36
fifth

以下のような最初の構造ソース:

MyApp
MyAppUnitTest

MyAppプロジェクトで、MyAppSrc.priを使用してソースファイルを見つけます。

SOURCES += \
    ../../../framework/src/myapp.cpp \
    ../../../framework/src/mycontrol.cpp

HEADERS += \
    ../../../framework/inc/myapp.h \
    ../../../framework/inc/mycontrol.h

INCLUDEPATH += ../../../framework/extlibs

この.priMyApp.proに次のように含めます。

include(MyAppSrc.pri)

次に、テストプロジェクトをメインプロジェクトとまったく同じように構成しますが、MyAppUnitTest.proに1つ追加します。

include(MyAppUnitTestSrc.pri)
include(../MyApp/MyAppSrc.pri)
16
fifth

私はこのアプローチを使用します: http://xilexio.org/?p=125

つまり、すべてをビルドする単一の_.pro_ファイルにtest構成を配置します。ファイル階層:

_myproject.pro
src/
    Example1.cpp
    Example2.cpp
    Example1.h
    Example2.h
test/
    ExampleTest.cpp
    ExampleTest.h
_

_myproject.pro_ファイル:

_QT += #needed modules

CONFIG += qt c++11

HEADERS += \
    src/Example1.h \
    src/Example2.h

SOURCES += \
    src/Example1.h \
    src/Example2.h

test{
    message(Configuring test build...)

    TEMPLATE = app
    TARGET = myapptests

    QT += testlib

    HEADERS += \
        test/ExampleTest.h

    SOURCES += \
        test/ExampleTest.cpp
}
else{
    TEMPLATE = lib
    TARGET = myapp

    CONFIG += plugin

    TARGET = $$qtLibraryTarget($$TARGET)
}
_

私の例では、プラグインライブラリを構築していますが、このメソッドはアプリでも機能するはずです。アプリの場合、else句の下に_SOURCES -= src/main.cpp_が必要になる可能性がありますが、プラグインライブラリにはありません。これが行われない場合、アプリのmain()は単体テストのmain()と衝突します。

_ExampleTest.cpp_は次のようになります。

_#include "ExampleTest.h"

void ExampleTest::exampleTest(){
    //Do the tests
}

QTEST_MAIN(ExampleTest)
_

_ExampleTest.h_は次のようになります。

_#include <QtTest/QtTest>

class ExampleTest : public QObject {
Q_OBJECT

private slots:
    void exampleTest();
};
_

プロジェクトテストをビルドするには、通常のビルドとは別のディレクトリで、次のコマンドを実行します。

_qmake path/to/myproject.pro "CONFIG += test"
_
10
Ayberk Özgür

私は他の答えが好きですが、私が現在働いている会社でこれをどのように行っているかについてもフィードバックを提供したいと思います。

  1. subdirsプロジェクトを作成します(これは、ライブラリプロジェクトやテストしたいものを含むすべてを管理するトップレベルのプロジェクトになります)

    +-----MyProject (top-level subdirs)
    
  2. ライブラリプロジェクトをサブプロジェクトとして追加します

    +-----MyProject (top-level subdirs)
              |
              +-----Library (library project, UI project etc.)
    
  3. 別のsubdirsプロジェクトを追加します(テスト用)

    +-----MyProject (top-level subdirs)
              |
              +-----Library (library project, UI project etc.)
              |
              +-----Tests (subdirs for tests)
    
  4. QUnitTestプロジェクトを作成し、テスト用subdirsプロジェクトに追加します

    +-----MyProject (subdirs)
              |
              +-----Library (library project, UI project etc.)
              |
              +-----Tests (subdirs for tests)
                      |
                      +----- TestA (QUnitTest project for testing feature A)
    
  5. 適切と思われる数のテストを追加します

             ...
              |
              +-----Tests (subdirs for test)
                      |
                      +----- TestA (QUnitTest project for testing feature A)
                      |
                      +----- TestB (QUnitTest project for testing feature B)
                      |
                      +----- TestC (QUnitTest project for testing feature C)
                      |
                     ...
                      |
                      +----- TestZ (QUnitTest project for testing feature Z)
    

テストをグループにグループ化する必要がある場合は、subdirsを使用してそれを行うこともできます。 subdirsは、ファイルシステムにrealディレクトリを作成することも保証します。 subdirsingが多すぎないようにする場合は、ファイルシステム内のTestsプロジェクトフォルダー内に独自に作成したフォルダーにテストをグループ化できます。

それに加えて、テンプレートプロジェクトsubdirsを追加することもお勧めします。

+-----MyProject (subdirs)
          |
          +-----Library (library project, UI project etc.)
          |
          +-----Tests (subdirs for tests)
          |           |
          |          ...
          |
          +-----Templates (subdirs for template projects
                      |
                      +----- TemplateA (template project for feature A)
                      |
                      +----- TemplateB (template project for feature B)
                      |
                      +----- TemplateAB (template project for feature A and B together)
                      |
                     ...
                      |
                      +----- TemplateZ (template project for feature Z)

もちろん、これはライブラリの機能に基づいています。テンプレートプロジェクトとは、ライブラリにリンクし、ユーザーに表示されるはずの方法でその機能の一部(またはすべて)を公開するカスタムウィジェットなどを意味します。たとえば、さまざまなカメラデバイスを管理するライブラリがある場合は、カメラデバイスごとにテンプレートプロジェクトを作成できるため、ライブラリのユーザーは特定のテンプレートプロジェクトをコピーして貼り付けて展開するか、少なくともあなたの図書館は一般的に起こることになっています。これにより、ドキュメントを削減すると同時に、ライブラリの統合と使用法を理解するために費やされる開発時間を短縮する、Niceの自己完結型の例を提供できます(これは、HelloWorldのセットのようなものと言えますプロジェクト:))。最後になりましたが、さまざまなユースケースのソリューションの概要を説明できます。

8
rbaleksandar

Qtプロジェクトのビルドには、qmakeの代わりにCMakeのQtCreatorを使用しています。

基本的に私はフォルダにする必要があります:

src
tests

各テストは、それ自体がクラスをテストするプログラムです。 テストするアプリはライブラリとしてコンパイルされます。。 srcフォルダー内のすべてのソースをライブラリーとしてコンパイルします。

// ClassTest.cpp
#include "ClassTest.h"
#include "Class2Test.h" // Class of the app

#include <QtTest/QtTest>

ClassTest::ClassTest( QObject* parent )
    : QObject(parent)
{ 
}

QTEST_MAIN( ClassTest )
#include "ClassTest.moc"

Libをテスト実行可能ファイルにリンクするだけです。

例:

srcフォルダーのCMakeLists.txtの例

add_library( MyAPP
    SHARED
    Class2Test.cpp
)
target_link_libraries( MyAPP
    ${QT_LIBRARIES}
)

テストフォルダCMakeLists.txtの例で、テストごとに。

qt4_automoc( ${test_src} )
add_executable( ${test_name} ${test_src} )
target_link_libraries( ${test_name}
    MyAPP
    ${QT_LIBRARIES}
    ${QT_QTTEST_LIBRARY}
)

それはまだ同じプロジェクトにありますが、ユーザーがテストをコンパイルできるようにするかどうかを示すフラグを追加できます。アプリはそのままで、アプリの各クラスをテストできるため、クリーンです。

1
Kirell