102

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

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

4

11 に答える 11

90

これがそのままでは機能しないのは、おそらくCMake (以前はここで追跡されていた)のバグです。回避策は、次のことを行うことです。

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

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

于 2009-04-10T05:57:33.937 に答える
57

実は使い方があります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)
于 2012-05-30T21:32:46.040 に答える
15

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 testmake all testtestcmakemaketestbuild_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
于 2013-02-25T05:53:52.080 に答える
7

エミュレートしようとしている場合はmake check、次の wiki エントリが役立つことがあります。

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

私は、それが成功したことを確認しました(CMake 2.8.10)。

于 2013-03-12T16:08:28.110 に答える
6

頭の痛い問題を解決してください:

make all test

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

于 2015-04-04T08:48:26.030 に答える
-4

上記のすべての答えは完璧です。しかし、実際にはCMakeはCTestをテストツールとして使用するため、ミッションを実行するための標準的な方法(そうだと思います)は次のとおりです。

enable_testing ()
add_test (TestName TestCommand)
add_test (TestName2 AnotherTestCommand)

次に、cmakemakeを実行してターゲットをビルドします。その後、make testを実行するか、単に実行することができます

ctest

結果が得られます。これは CMake 2.8 でテストされています。

詳細はhttp://cmake.org/Wiki/CMake/Testing_With_CTest#Simple_Testingで確認してください。

于 2012-08-24T14:20:11.553 に答える
-5

すべての答えは適切ですが、コマンドでテストを実行するという伝統に違反していることを暗示していmake testます。私はこのトリックをしました:

add_test(NAME <mytest>
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
COMMAND sh -c "make <mytarget>; $<TARGET_FILE:<mytarget>>")

これは、テストがビルド (オプション) と実行可能ターゲットの実行で構成されていることを意味します。

于 2013-05-20T13:25:12.803 に答える