make test
target을 사용하여 일부 테스트를 자동으로 실행하기 위해 CMake에서 CTest를 시도하고 있습니다. 문제는 CMake가 내가 실행하려는 테스트가 프로젝트의 일부이기 때문에 빌드되어야한다는 것을 "이해"하지 못한다는 것입니다.
그래서이 종속성을 명시 적으로 지정하는 방법을 찾고 있습니다.
답변:
check
대상 을 정의 하고 충돌 할 수 있습니다
실제로 사용하는 방법이 있습니다 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 Test를 사용하거나 좋아하고 CMake / CTest와 함께 사용하는 완전한 예제를 공유하고 싶었습니다. IMHO,이 접근 방식 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
위키 항목이 유용 할 수 있습니다.
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을 사용하는 경우 권장되는 접근 방식은 fixtures 를 사용하는 것입니다 .
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_build
필요한 실행 파일을 빌드하는 test를 실행합니다.
$<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
Derrick의 대답, 단순화 및 주석 :
# 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
누군가 그렇게 할 경우 실행의 동시성 문제를 해결하지 못하기 때문에 완벽하게 정확하지 않습니다 . 반대로 지금은 두 개의 닌자 프로세스가 있기 때문입니다.
(Ftr, 여기 에서도이 솔루션을 공유했습니다 .)
위의 모든 답변은 완벽합니다. 그러나 실제로 CMake는 CTest를 테스트 도구로 사용하므로 미션을 수행하는 표준 방법은 다음과 같습니다.
enable_testing ()
add_test (TestName TestCommand)
add_test (TestName2 AnotherTestCommand)
그런 다음 실행 cmake를 하고 할 대상을 구축 할 수 있습니다. 그 후에 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의 기능에 하드 코딩되어 손실됩니다.