programing tip

CMake를 사용하여 CTest에서 자세한 출력을 얻으려면 어떻게해야합니까?

itbloger 2020. 9. 5. 09:26
반응형

CMake를 사용하여 CTest에서 자세한 출력을 얻으려면 어떻게해야합니까?


내 프로젝트를 빌드하기 위해 CMake를 사용하고 있습니다. Boost 단위 테스트 프레임 워크를 사용하는 단위 테스트 바이너리를 추가했습니다. 이 바이너리 하나에는 모든 단위 테스트가 포함됩니다. CTest에서 실행할 바이너리를 추가했습니다.

ADD_EXECUTABLE( tftest test-main.cpp )
ENABLE_TESTING()
ADD_TEST( UnitTests tftest)

그러나 Visual Studio의 빌드 출력에는 CTest 실행 결과 만 표시됩니다.

      Start 1: UnitTests
  1/1 Test #1: UnitTests ................***Failed    0.05 sec

  0% tests passed, 1 tests failed out of 1

어떤 테스트가 실패했는지 알 수 없기 때문에 이것은별로 도움이되지 않습니다. 명령 줄에서 ctest를 수동으로 실행하면 --verbose실제로 실패한 것을 알려주는 Boost 단위 테스트에서 출력을 얻습니다.

1: Test command: tftest.exe
1: Test timeout computed to be: 9.99988e+006
1: Running 4 test cases...
1: test-main.cpp(20): error in "sanity_check3": check 1 == 2 failed
1:
1: *** 1 failure detected in test suite "Master Test Suite"
1/1 Test #1: UnitTests ................***Failed    0.00 sec

그렇다면 CTest를 --verbose항상 실행하려면 CMakeLists.txt에서 무엇을 변경해야 합니까? CMake / CTest와 함께 Boost 단위 테스트를 사용하는 더 좋은 방법이 있습니까?


CTEST_OUTPUT_ON_FAILURE테스트가 실패 할 때마다 테스트 프로그램의 출력을 표시 하는 환경 변수를 설정할 수 있습니다 . Makefile과 명령 줄을 사용할 때이를 수행하는 한 가지 방법은 다음과 같습니다.

env CTEST_OUTPUT_ON_FAILURE=1 make check

이 스택 오버플로 질문 및 답변 은 Visual Studio에서 환경 변수를 설정하는 방법을 보여줍니다.


ctest프로젝트를 만들고 만든 후에 직접 전화 할 수 있습니다.

ctest --verbose

  1. Testing/Temporary하위 폴더 를 확인할 수 있습니다 . make test 실행 후 자동으로 생성됩니다. 이 폴더에는 LastTest.logLastTestsFailed.log. LastTest.log테스트 실행을 위해 원하는 출력을 포함합니다. LastTestFailed.log실패한 테스트의 이름을 포함합니다. 따라서 실행 후 수동으로 확인할 수 있습니다 make test.

  2. 두 번째 방법은 테스트를 실행 한 후 ctest가 로그 파일의 내용을 표시하도록하는 것입니다.

    1. 다음 내용과 함께 CTestCustom.ctest ( 예를 들어 configure file 명령으로 수행 할 수 있음) 파일 빌드 디렉토리 (실행 make test)에 배치합니다.

      CTEST_CUSTOM_POST_TEST ( "cat Testing / Temporary / LastTest.log")

cat 대신 유사한 작업을 수행하는 Windows cmd 명령을 사용할 수 있습니다.

  1. make test다시 실행 하고 이익을 얻으십시오!

ctest 사용자 정의에 대한 추가 정보는 여기에서 찾을 수 있습니다 . "cmake 사용자 정의"섹션으로 이동하십시오. 행운을 빕니다!


"체크"대상을 직접 추가해야했습니다. "make tests"는 어떤 이유로 아무것도하지 않습니다. 그래서 내가 한 일은 (스택 오버플로 어딘가에서 제안한대로)-이 대상을 수동으로 추가했습니다. 자세한 출력을 얻으려면 다음과 같이 작성했습니다.

add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND} --verbose)

make check CTEST_OUTPUT_ON_FAILURE=TRUE


매우 간단한 솔루션이 있습니다 (어떤 이유로 Google 검색을 통해 찾기가 어렵습니다).

ctest --output-on-failure

Visual Studio의 폴더 열기 기능과 함께 CMake를 사용하는 경우

"ctestCommandArgs": "--output-on-failure"

빌드 구성으로 설정합니다.


내 방법은 답변의 조합 ONY에서 , zbyszek에서 , 그리고 TARC에서 . 를 사용하여 실제 ctest 명령을 호출하는 인수 ${CMAKE_COMMAND}와 함께 변수 (호출 된 cmake 실행 파일의 절대 경로로 설정 됨)를 -E env CTEST_OUTPUT_ON_FAILURE=1사용 ${CMAKE_CTEST_COMMAND} -C $<CONFIG>합니다. 진행중인 작업을 명확히하기 위해 cmake -E echo현재 작업 디렉터리와 호출 할 ctest 명령을 표시하는 세 가지 명령으로 시작 합니다. 내가 부르는 방법은 다음과 같습니다 add_custom_target.

add_custom_target(check 
        ${CMAKE_COMMAND} -E echo CWD=${CMAKE_BINARY_DIR}
        COMMAND ${CMAKE_COMMAND} -E echo CMD=${CMAKE_CTEST_COMMAND} -C $<CONFIG>
        COMMAND ${CMAKE_COMMAND} -E echo ----------------------------------
        COMMAND ${CMAKE_COMMAND} -E env CTEST_OUTPUT_ON_FAILURE=1
            ${CMAKE_CTEST_COMMAND} -C $<CONFIG>
    WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
    DEPENDS ALL_BUILD
    )

This plays nice with the MSVC IDE where any test errors are shown as clickable compilation errors. See cmake -E env for documentation of the cmake -E portable command line tool mode. I also add a dependency on ALL_BUILD so that all projects will be built before invoking the check target. (On Linux builds, one may need to replace ALL_BUILD with ALL; I have not tested this on Linux yet.)


This makes test output more verbose:

make test ARGS="-V"

For people using Visual Studio, here another variation (hack) on the theme:

cmake -E env CTEST_OUTPUT_ON_FAILURE=1 cmake --build . --target RUN_TESTS

to show the result with XML file you have to execute the test with the following command

~$ ctest -T Test

and we found the result in the Testing/1234123432/test.xml and other files are generated too in Testing Folder

참고URL : https://stackoverflow.com/questions/5709914/using-cmake-how-do-i-get-verbose-output-from-ctest

반응형