web-dev-qa-db-ja.com

CMake&CTest:make testはテストをビルドしません

make testターゲットを使用していくつかのテストを自動的に実行するために、CMakeでCTestを試しています。問題は、CMakeはプロジェクトの一部であるため、実行したいテストをビルドする必要があることを「理解」していないことです。

そこで、この依存関係を明示的に指定する方法を探しています。

83
claf

これが機能しないのは、ほぼ間違いなくa CMakeのバグ (以前に追跡された here )箱から出して。回避策は次のとおりです。

add_test(TestName ExeName)
add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND}
                  DEPENDS ExeName)

その後、make checkを実行すると、テストがコンパイルおよび実行されます。複数のテストがある場合は、上記の行でDEPENDS exe1 exe2 exe3 ...を使用する必要があります。

71
richq

実際には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)
48
Iakov

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を呼び出して、ツリー外デバッグおよびリリース(およびクロスコンパイル)ビルドを行う最上位スクリプトがあるため、それほど悪くはありません。 testbuild_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
13
Trevor Robinson

make checkをエミュレートしようとしている場合、次のwikiエントリが便利です。

http://www.cmake.org/Wiki/CMakeEmulateMakeCheck

私はちょうどそれが成功したと言うことをすることを確認しました(CMake 2.8.10)。

6
Samuel

頭痛を省いてください:

make all test

すぐに使用でき、テストを実行する前に依存関係を構築します。これがどれほど簡単かを考えると、ネイティブmake test機能は、コードが壊れていても最後のコンパイルテストを実行するオプションを提供するため便利です。

4
quant

これは私が打ち出して使用してきたものです:

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

0
Derrick

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)
0
John Freeman