CMake と CTest :make test はテストをビルドしません
-
06-09-2019 - |
質問
を使用してテストの一部を自動的に実行するために、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
を使用する方法は実際にあります。あなたは、テストの一つとして、テスト実行可能ファイルのビルドを定義し、テスト間の依存関係を追加する必要があります。それは次のとおりです。
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
(またはmake test
)のmake all test
する必要があり、それが唯一の建物のテストコード(およびその依存関係)の利益を有します。それは私がターゲット名のtest
を使用することはできません残念です。私は外の木のデバッグとリリースを行い、トップレベルのスクリプトを持っている(とクロスコンパイル)ので、私の場合、それはそれほど悪くはないcmake
、その後make
を呼び出すことによって構築し、それがtest
にbuild_and_test
を変換します。
もちろん、GTESTのものは必要ありません。私はGoogleのテストのように/を使用することが起こると、CMakeの/ CTESTでそれを使用しての完全な例を共有したいと思いました。 IMHO、このアプローチは、私がテストを実行しながら、Googleのテスト出力を示しctest -V
を、使用することを可能にする利点があります:
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
をエミュレートしようとしている場合、あなたはこのウィキのエントリに便利を見つけることができます:
http://www.cmake.org/Wiki/CMakeEmulateMakeCheckする
私はちょうどそれがあるチェックして、それが成功(CMakeの2.8.10)と言うことありません。
自分で頭痛を保存します:
make all test
私のために箱から出して動作し、テストを実行する前に、依存関係を構築します。それはあなたのコードが壊れている場合でも、最後のコンパイルのテストを実行するオプションを与えるので、これはどのように単純で考えると、それはほとんどネイティブmake test
機能が便利になります。
これは私が打ち出しおよび使用されているものです
set(${PROJECT_NAME}_TESTS a b c)
enable_testing()
add_custom_target(all_tests)
foreach(test ${${PROJECT_NAME}_TESTS})
add_executable(${test} EXCLUDE_FROM_ALL ${test}.cc)
add_test(NAME ${test} COMMAND $<TARGET_FILE:${test}>)
add_dependencies(all_tests ${test})
endforeach(test)
build_command(CTEST_CUSTOM_PRE_TEST TARGET all_tests)
string(CONFIGURE \"@CTEST_CUSTOM_PRE_TEST@\" CTEST_CUSTOM_PRE_TEST_QUOTED ESCAPE_QUOTES)
file(WRITE "${CMAKE_BINARY_DIR}/CTestCustom.cmake" "set(CTEST_CUSTOM_PRE_TEST ${CTEST_CUSTOM_PRE_TEST_QUOTED})" "\n")
メーリングリスト
あなたはCMakeの> = 3.7を使用している場合は、その後、推奨されるアプローチは、<のhref = "https://crascit.com/2016/10/18/test-fixtures-with-cmake-ctest/" のrelを使用することです= "nofollowをnoreferrer">器具はを
add_executable(test test.cpp)
add_test(test_build
"${CMAKE_COMMAND}"
--build "${CMAKE_BINARY_DIR}"
--config $<CONFIG>
--target test
)
add_test(test test)
set_tests_properties(test PROPERTIES FIXTURES_REQUIRED test_fixture)
set_tests_properties(test_build PROPERTIES FIXTURES_SETUP test_fixture)
上記の答えはすべて完璧です。しかし実際には、CMake はテスト ツールとして CTest を使用するため、この使命を達成するための標準的な方法 (私はそうだと思います) は次のとおりです。
enable_testing ()
add_test (TestName TestCommand)
add_test (TestName2 AnotherTestCommand)
それから実行します cmake そして 作る ターゲットを構築します。その後、次のいずれかを実行できます テストを行う, 、または単に実行します
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>>")
この試験は、(必要に応じて)を構築し、実行対象の走行から成ることを意味する。