Qtプロジェクトを取得し、QtCreatorを使用しています。すべてのコードを単体テストしたい。
しかし、私はQTestLibフレームワークにまったく慣れていませんが、Qtベースのソースをテストするために誰もがそれを推奨しました。今、私はテストプロジェクトをアプリプロジェクトで構成する方法に少し混乱しています。
このような状況で、テストコードをどのように管理しますか?ありがとう。
以下のような最初の構造ソース:
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
この.pri
をMyApp.pro
に次のように含めます。
include(MyAppSrc.pri)
次に、テストプロジェクトをメインプロジェクトとまったく同じように構成しますが、MyAppUnitTest.pro
に1つ追加します。
include(MyAppUnitTestSrc.pri)
include(../MyApp/MyAppSrc.pri)
私はこのアプローチを使用します: 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"
_
私は他の答えが好きですが、私が現在働いている会社でこれをどのように行っているかについてもフィードバックを提供したいと思います。
subdirs
プロジェクトを作成します(これは、ライブラリプロジェクトやテストしたいものを含むすべてを管理するトップレベルのプロジェクトになります)
+-----MyProject (top-level subdirs)
ライブラリプロジェクトをサブプロジェクトとして追加します
+-----MyProject (top-level subdirs)
|
+-----Library (library project, UI project etc.)
別のsubdirs
プロジェクトを追加します(テスト用)
+-----MyProject (top-level subdirs)
|
+-----Library (library project, UI project etc.)
|
+-----Tests (subdirs for tests)
QUnitTest
プロジェクトを作成し、テスト用subdirs
プロジェクトに追加します
+-----MyProject (subdirs)
|
+-----Library (library project, UI project etc.)
|
+-----Tests (subdirs for tests)
|
+----- TestA (QUnitTest project for testing feature A)
適切と思われる数のテストを追加します
...
|
+-----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ディレクトリを作成することも保証します。 subdirs
ingが多すぎないようにする場合は、ファイルシステム内の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のセットのようなものと言えますプロジェクト:))。最後になりましたが、さまざまなユースケースのソリューションの概要を説明できます。
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}
)
それはまだ同じプロジェクトにありますが、ユーザーがテストをコンパイルできるようにするかどうかを示すフラグを追加できます。アプリはそのままで、アプリの各クラスをテストできるため、クリーンです。