make test
ターゲットを使用していくつかのテストを自動的に実行するために、CMakeでCTestを試しています。問題は、CMakeはプロジェクトの一部であるため、実行したいテストをビルドする必要があることを「理解」していないことです。
そこで、この依存関係を明示的に指定する方法を探しています。
実際には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
(またはmake test
)の代わりにmake all test
だけで、テストコード(およびその依存関係)を作成するだけの利点があります。ターゲット名test
を使用できないのは残念です。私の場合、cmake
を呼び出してからmake
を呼び出して、ツリー外デバッグおよびリリース(およびクロスコンパイル)ビルドを行う最上位スクリプトがあるため、それほど悪くはありません。 test
をbuild_and_test
に変換します。
明らかに、GTestのものは必要ありません。私はたまたまGoogle Testを使用/好んでおり、それをCMake/CTestと使用する完全な例を共有したかったのです。私見、このアプローチには、テストの実行中に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
をエミュレートしようとしている場合、次のwikiエントリが便利です。
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")
YMMV
CMake> = 3.7を使用している場合、推奨されるアプローチは fixtures を使用することです。
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)