[解決済み] CMake:ユニットテストによるプロジェクト構造
質問
私はプロジェクトを構成して、プロダクション・ソース (
src
サブフォルダ)とテスト(
test
サブフォルダ)。CMakeを使ってビルドしています。最小限の例として、私は以下のファイルを持っています。
CMakeLists.txt。
cmake_minimum_required (VERSION 2.8)
project (TEST)
add_subdirectory (src)
add_subdirectory (test)
src/CMakeLists.txt。
add_executable (demo main.cpp sqr.cpp)
src/sqr.h
#ifndef SQR_H
#define SQR_H
double sqr(double);
#endif // SQR_H
src/sqr.cpp
#include "sqr.h"
double sqr(double x) { return x*x; }
src/main.cpp - sqr を使用していますが、特に問題ではありません。
test/CMakeLists.txt。
find_package(Boost COMPONENTS system filesystem unit_test_framework REQUIRED)
include_directories (${TEST_SOURCE_DIR}/src)
ADD_DEFINITIONS(-DBOOST_TEST_DYN_LINK)
add_executable (test test.cpp ${TEST_SOURCE_DIR}/src/sqr.cpp)
target_link_libraries(test
${Boost_FILESYSTEM_LIBRARY}
${Boost_SYSTEM_LIBRARY}
${Boost_UNIT_TEST_FRAMEWORK_LIBRARY}
)
enable_testing()
add_test(MyTest test)
test/test.cpp。
#define BOOST_TEST_MODULE SqrTests
#include <boost/test/unit_test.hpp>
#include "sqr.h"
BOOST_AUTO_TEST_CASE(FailTest)
{
BOOST_CHECK_EQUAL(5, sqr(2));
}
BOOST_AUTO_TEST_CASE(PassTest)
{
BOOST_CHECK_EQUAL(4, sqr(2));
}
少し質問です。
- この構成は意味があるのでしょうか?このコードを構造化する際のベストプラクティスは何でしょうか?(私はC#とJavaから来たのですが、そちらの方がある意味簡単です)
-
のファイルをすべてリストアップしなければならないのが気に入らない。
src
フォルダーをtest/CMakeLists.txt
ファイルを作成します。これがライブラリプロジェクトであれば、ライブラリをリンクすればいいのですが。他のプロジェクトのすべてのcppファイルをリストアップしないようにする方法はないでしょうか? -
という行は何ですか?
enable_testing()
とadd_test(MyTest test)
しているのか?私は何の効果も見ていません。CMake(またはCTest)からテストを実行するにはどうすればよいですか? -
今のところ、私はただ
cmake .
をルートフォルダに置くと、一時ファイルがあちこちにできてしまい、混乱します。どうすればコンパイル結果を合理的な構造にできるのでしょうか?
どのように解決するのですか?
質問 1 と質問 2 については、main.cpp を除くテスト以外のファイル (この場合は src/sqr.cpp と src/sqr.h) からライブラリを作成することをお勧めします。
質問3について、これらのコマンドは "MyTest" というテストを追加し、実行ファイル "test" を引数なしで呼び出すものです。 しかし、これらのコマンドはトップレベルの CMakeLists.txt ではなく test/CMakeLists.txt に追加されているので、ビルドツリーの "test" サブディレクトリからしかテストを呼び出すことができません (試しに
cd test && ctest -N
). もし、トップレベルのビルドディレクトリからテストを実行できるようにしたいのであれば、そのために
add_test
をトップレベルの CMakeLists.txt から取得します。 これはまた、より冗長な形式である
add_test
テスト用の実行ファイルが同じ CMakeLists.txt で定義されていないためです。
あなたの場合、ルートフォルダでcmakeを実行しているため、ビルドツリーとソースツリーが同一になっています。 これはインソースビルドと呼ばれるもので、理想的ではありません。
ビルドツリーを生成するための好ましい方法は、アウトオブソースビルド、つまり、ソースツリーの外のどこかにディレクトリを作成し、そこからcmakeを実行することです。 プロジェクトのルートに "build" ディレクトリを作成して
cmake ..
を使えば、ソースツリーに干渉しないきれいな構造を提供することができます。
最後のポイントは、実行ファイルを "test" と呼ばないことです (大文字と小文字を区別します)。 その理由については この回答 .
このような変更を実現するために、私なら次のようにします。
CMakeLists.txtに記載されています。
cmake_minimum_required (VERSION 2.8)
project (TEST)
add_subdirectory (src)
add_subdirectory (test)
enable_testing ()
add_test (NAME MyTest COMMAND Test)
src/CMakeLists.txt:
add_library (Sqr sqr.cpp sqr.h)
add_executable (demo main.cpp)
target_link_libraries (demo Sqr)
test/CMakeLists.txt を参照してください。
find_package (Boost COMPONENTS system filesystem unit_test_framework REQUIRED)
include_directories (${TEST_SOURCE_DIR}/src
${Boost_INCLUDE_DIRS}
)
add_definitions (-DBOOST_TEST_DYN_LINK)
add_executable (Test test.cpp)
target_link_libraries (Test
Sqr
${Boost_FILESYSTEM_LIBRARY}
${Boost_SYSTEM_LIBRARY}
${Boost_UNIT_TEST_FRAMEWORK_LIBRARY}
)
関連
-
[解決済み】C++エラー。アーキテクチャ x86_64 に対して未定義のシンボル
-
[解決済み】構造体のベクター初期化について
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み】クラステンプレートの引数リストがない
-
[解決済み] エラーが発生する。ISO C++は型を持たない宣言を禁じています。
-
[解決済み】C++でユーザー入力を待つ【重複あり
-
[解決済み] string does not name a type Errorが発生するのはなぜですか?
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み】CMakeエラー at CMakeLists.txt:30 (project)。CMAKE_C_COMPILER が見つかりませんでした。
-
[解決済み] CMakeを使用して、CTestから冗長出力を得るにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C-stringを使用すると警告が表示される。"ローカル変数に関連するスタックメモリのアドレスが返される"
-
[解決済み】C++コンパイルタイムエラー:数値定数の前に期待される識別子
-
[解決済み】致命的なエラー LNK1169: ゲームプログラミングで1つ以上の多重定義されたシンボルが発見された
-
[解決済み】C++ 式はポインタからオブジェクトへの型を持っている必要があります。
-
[解決済み】抽象クラス型の無効なnew-expression
-
[解決済み】デバッグアサーションに失敗しました。C++のベクトル添え字が範囲外
-
[解決済み】エラー:strcpyがこのスコープで宣言されていない
-
[解決済み】#include<iostream>は存在するのですが、「識別子 "cout "は未定義です」というエラーが出ます。なぜですか?
-
[解決済み] 解決済み] `pthread_create' への未定義の参照 [重複] [重複
-
[解決済み】なぜ、サイズ8の初期化されていない値を使用するのでしょうか?