ターゲットを使用してテストの一部を自動的に実行するために、CMakeでCTestを試していますmake test
。問題は、CMakeがプロジェクトの一部であるため、実行しようとしているテストをビルドする必要があることを「理解」していないことです。
したがって、この依存関係を明示的に指定する方法を探しています。
ターゲットを使用してテストの一部を自動的に実行するために、CMakeでCTestを試していますmake test
。問題は、CMakeがプロジェクトの一部であるため、実行しようとしているテストをビルドする必要があることを「理解」していないことです。
したがって、この依存関係を明示的に指定する方法を探しています。
これがそのままでは機能しないのは、おそらくCMake (以前はここで追跡されていた)のバグです。回避策は、次のことを行うことです。
add_test(TestName ExeName)
add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND}
DEPENDS ExeName)
次にmake check
、実行すると、テストがコンパイルおよび実行されます。複数のテストがある場合DEPENDS exe1 exe2 exe3 ...
は、上記の行で使用する必要があります。
実は使い方がありますmake test
。テスト実行可能ファイルのビルドをテストの 1 つとして定義し、テスト間の依存関係を追加する必要があります。あれは:
ADD_TEST(ctest_build_test_code
"${CMAKE_COMMAND}" --build ${CMAKE_BINARY_DIR} --target test_code)
ADD_TEST(ctest_run_test_code test_code)
SET_TESTS_PROPERTIES(ctest_run_test_code
PROPERTIES DEPENDS ctest_build_test_code)
richqの回答の変形を使用します。最上位の に、すべてのテストをビルドして実行するためCMakeLists.txt
のカスタム ターゲット を追加します。build_and_test
find_package(GTest)
if (GTEST_FOUND)
enable_testing()
add_custom_target(build_and_test ${CMAKE_CTEST_COMMAND} -V)
add_subdirectory(test)
endif()
の下のさまざまなサブプロジェクトCMakeLists.txt
ファイルでtest/
、各テスト実行可能ファイルを の依存関係として追加しますbuild_and_test
。
include_directories(${CMAKE_SOURCE_DIR}/src/proj1)
include_directories(${GTEST_INCLUDE_DIRS})
add_executable(proj1_test proj1_test.cpp)
target_link_libraries(proj1_test ${GTEST_BOTH_LIBRARIES} pthread)
add_test(proj1_test proj1_test)
add_dependencies(build_and_test proj1_test)
このアプローチでは、 (または)make build_and_test
の代わりに必要なだけであり、テスト コード (およびその依存関係) のみをビルドするという利点があります。対象名が使えないのが残念です。私の場合、ツリー外のデバッグとリリース (およびクロスコンパイル) ビルドを実行するトップレベルのスクリプトがあり、 andを呼び出してから に変換されるため、それほど悪くはありません。make test
make all test
test
cmake
make
test
build_and_test
明らかに、GTest は必要ありません。私はたまたま Google Test を使っている/好きで、CMake/CTest でそれを使用する完全な例を共有したかったのです。IMHO、このアプローチにはctest -V
、テストの実行中に Google Test の出力を表示するを使用できるという利点もあります。
1: Running main() from gtest_main.cc
1: [==========] Running 1 test from 1 test case.
1: [----------] Global test environment set-up.
1: [----------] 1 test from proj1
1: [ RUN ] proj1.dummy
1: [ OK ] proj1.dummy (0 ms)
1: [----------] 1 test from proj1 (1 ms total)
1:
1: [----------] Global test environment tear-down
1: [==========] 1 test from 1 test case ran. (1 ms total)
1: [ PASSED ] 1 test.
1/2 Test #1: proj1_test ....................... Passed 0.03 sec
エミュレートしようとしている場合はmake check
、次の wiki エントリが役立つことがあります。
http://www.cmake.org/Wiki/CMakeEmulateMakeCheck
私は、それが成功したことを確認しました(CMake 2.8.10)。
頭の痛い問題を解決してください:
make all test
私にとってはすぐに使用でき、テストを実行する前に依存関係を構築します。これがいかに単純であるかを考えるとmake test
、コードが壊れていても最後のコンパイル テストを実行するオプションが提供されるため、ネイティブ機能がほぼ便利になります。
上記のすべての答えは完璧です。しかし、実際にはCMakeはCTestをテストツールとして使用するため、ミッションを実行するための標準的な方法(そうだと思います)は次のとおりです。
enable_testing ()
add_test (TestName TestCommand)
add_test (TestName2 AnotherTestCommand)
次に、cmakeとmakeを実行してターゲットをビルドします。その後、make testを実行するか、単に実行することができます
ctest
結果が得られます。これは CMake 2.8 でテストされています。
詳細はhttp://cmake.org/Wiki/CMake/Testing_With_CTest#Simple_Testingで確認してください。
すべての答えは適切ですが、コマンドでテストを実行するという伝統に違反していることを暗示していmake test
ます。私はこのトリックをしました:
add_test(NAME <mytest>
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
COMMAND sh -c "make <mytarget>; $<TARGET_FILE:<mytarget>>")
これは、テストがビルド (オプション) と実行可能ターゲットの実行で構成されていることを意味します。