make test
ターゲットを使用してテストの一部を自動的に実行するために、CMakeでCTestを試しています。問題は、CMakeがプロジェクトの一部であるため、実行するテストをビルドする必要があることをCMakeが「理解」しないことです。
だから私はこの依存関係を明示的に指定する方法を探しています。
回答:
check
ターゲットを定義し、それらが衝突する可能性がある
実際に使用する方法があります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
andを呼び出してからツリー外のデバッグおよびリリース(およびクロスコンパイル)ビルドを実行するトップレベルのスクリプトがありmake
、それがに変換test
されるため、それほど悪くはありませんbuild_and_test
。
明らかに、GTestのものは必要ありません。私はたまたまGoogle Testを使用していて、CMake / CTestでそれを使用する完全な例を共有したいと思っていました。私見、このアプローチには、使用を許可するという利点もありますctest -V
、テストの実行中にGoogleテストの出力を表示するます。
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 check
。コンパイル時間が支配的なテストの場合、これはctest -R
役に立たなくなります。
頭痛の種を省いてください:
make all test
そのまま使用でき、テストを実行する前に依存関係を構築します。これがいかに単純かを考えるとmake test
、コードが壊れていても最後のコンパイルテストを実行するオプションを提供するので、ネイティブ機能はほとんど便利になります。
make -j4 all && make test
。また、Make以外のビルドツールを使用すると不安定になります。
CMake> = 3.7を使用している場合、推奨されるアプローチはフィクスチャを使用することです:
add_executable(test test.cpp)
add_test(test_build
"${CMAKE_COMMAND}"
--build "${CMAKE_BINARY_DIR}"
--config "$<CONFIG>"
--target test
)
set_tests_properties(test_build PROPERTIES FIXTURES_SETUP test_fixture)
add_test(test test)
set_tests_properties(test PROPERTIES FIXTURES_REQUIRED test_fixture)
これは次のことを行います。
test
ビルドされた実行可能なターゲットを追加しますtest.cpp
test_build
Cmakeを実行してターゲットをビルドする「テスト」を追加しますtest
test_build
テストをフィクスチャのセットアップタスクとしてますtest_fixture
test
するだけのテストを追加しtest
ますtest
テストにフィクスチャが必要であることをマークしtest_fixture
ます。したがって、テストtest
が実行されるたびに、まずtest test_build
が実行され、必要な実行可能ファイルが作成されます。
$<CONFIG>
が設定されていない場合--target
、はの引数になり--config
ます。
$<CONFIG>
は常に空でないと信じています。これは構成名のジェネレーター式です:cmake.org/cmake/help/latest/manual/…違いがないので、とにかく引用符で囲むように回答を編集します。
cmake
?私はこのようにしていますmkdir build; cd build; cmake ..; make
。そして、CMAKE_BUILD_TYPE
手動で設定するまで、デフォルトはなく、関連するすべての変数は空のようです。(現在Debian 10では他のプラットフォームをチェックしていませんでした)
これは私が打ち出して使用してきたものです:
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
デリックの回答、簡略化してコメント:
# It is impossible to make target "test" depend on "all":
# https://gitlab.kitware.com/cmake/cmake/-/issues/8774
# Set a magic variable in a magic file that tells ctest
# to invoke the generator once before running the tests:
file(WRITE "${CMAKE_BINARY_DIR}/CTestCustom.cmake"
"set(CTEST_CUSTOM_PRE_TEST ${CMAKE_MAKE_PROGRAM})\n"
)
ninja all test
誰かがそうした場合に備えて、を実行することの同時実行性の問題を解決しないため、これは完全に正しくはありません。逆に、今、あなたは2つの忍者プロセスを持っているからです。
究極の解決策は、私に尋ねれば、CMakeの代わりにMesonを使用することです。Mesonは多くのことの中でとりわけこれを正しくしています。
上記の答えはすべて完璧です。しかし、実際には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で確認してください。
enable_testing()
、add_test()
問題は彼が手動テストを実行する前に、ビルドコマンドを発行しなければならないことである、など。彼は、make test
ターゲットが必要に応じてテスト実行可能ファイルを自動的にビルドすることを望んでいます。
すべての回答は良いですが、コマンドによるテストを実行するという伝統の違反を意味しますmake test
。私はこのトリックを行いました:
add_test(NAME <mytest>
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
COMMAND sh -c "make <mytarget>; $<TARGET_FILE:<mytarget>>")
これは、テストが実行可能なターゲットのビルド(オプション)と実行で構成されることを意味します。
make
おり、他のビルドツール用のスクリプトを生成するCMakeの機能を失っています。