Usando o CMake, como obtenho uma saída detalhada do CTest?


109

Estou usando o CMake para construir meu projeto. Eu adicionei um binário de teste de unidade que está usando a estrutura de teste de unidade Boost. Este binário contém todos os testes de unidade. Eu adicionei esse binário para ser executado pelo CTest:

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

Mas a saída da compilação no Visual Studio mostra apenas o resultado da execução de CTest:

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

  0% tests passed, 1 tests failed out of 1

Isso não é muito útil, porque não consigo ver qual teste falhou. Se eu executar o ctest manualmente na linha de comando com --verbose, obtenho a saída de um teste de unidade Boost que diz o que realmente falhou:

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

Então, o que eu preciso mudar no CMakeLists.txt para que o CTest seja executado o --verbosetempo todo? Existe uma maneira melhor de usar os testes de unidade Boost com CMake / CTest?


Respostas:


92

Você pode definir a variável de ambiente CTEST_OUTPUT_ON_FAILURE, que mostrará qualquer saída do programa de teste sempre que o teste falhar. Uma maneira de fazer isso ao usar Makefiles e a linha de comando seria a seguinte:

env CTEST_OUTPUT_ON_FAILURE=1 make check

Esta pergunta e resposta do Stack Overflow mostra como definir variáveis ​​de ambiente no Visual Studio.


3
Não funciona para mim (ctest versão 2.8.12.1). Tentei SET(CTEST_OUTPUT_ON_FAILURE TRUE)e SET(CTEST_OUTPUT_ON_FAILURE ON), mas não surtiu efeito. Outros relatos na web corroboram que isso está quebrado.
Joachim W

4
@JoachimWuttke set(CTEST_OUTPUT_ON_FAILURE TRUE)não define uma variável de ambiente . Tente isto na linha de comando: CTEST_OUTPUT_ON_FAILURE=TRUE make test.
thehouse

3
make CTEST_OUTPUT_ON_FAILURE=1 testé IMO mais curto e mais agradável.
Timmmm

No arquivo de lote do Windows, como usar CTEST_OUTPUT_ON_FAILURE = 1 ao chamar - msbuild /toolsversion:15.0 / p: Configuration = Release / p: Platform = x64 TESTS.vcxproj
Toral

34

Você pode ligar ctestdiretamente, depois de fazer e fazer seu projeto.

ctest --verbose

29
  1. Você pode verificar a Testing/Temporarysubpasta. Ele é criado automaticamente após a execução de make test. Esta pasta contém dois arquivos: LastTest.loge LastTestsFailed.log. LastTest.logcontém a saída desejada para testes de execução. LastTestFailed.logcontém nomes de testes que falharam. Assim, você pode verificá-los manualmente após a execução make test.

  2. A segunda maneira é fazer com que o ctest mostre o conteúdo dos arquivos de log após a execução dos testes:

    1. coloque no diretório de construção (a partir do qual você executa make test) o arquivo CTestCustom.ctest (você pode fazer isso com o comando configure file , por exemplo) com o seguinte conteúdo

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

Em vez de cat, você pode usar qualquer comando cmd do Windows que faça coisas semelhantes.

  1. corra make testnovamente e obtenha lucro!

informações adicionais sobre como personalizar ctest você pode encontrar aqui . Basta ir até a seção "Customizando cmake". Boa sorte!


1
Ok, obrigado. Eu esperava que houvesse uma maneira de modificar os sinalizadores que são inseridos nos arquivos de projeto / make para ctest, mas não encontrei nada e sua resposta parece confirmar isso. As informações do nome do arquivo são úteis!
Skrymsli

1
em algum lugar em torno do ctest 2.8.10 eles quebraram usando comandos externos com argumentos em CTEST_CUSTOM_POST_TEST, consulte github.com/openscad/openscad/issues/260
don bright

@don: talvez eles não estejam executando testes suficientes no ctest ;-)
Joachim W

Esse problema do CMake com CTEST_CUSTOM_POST_TEST foi corrigido em 2.8.12.
Ela782 de

23

Tive de adicionar o alvo "verificar" sozinho. "fazer testes" não faz nada por algum motivo. Então o que eu fiz (como foi sugerido em algum lugar no stackoverflow) - eu adicionei este destino manualmente. Para obter uma saída detalhada, escrevi assim:

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

21

Existe uma solução muito simples (que por algum motivo é difícil de encontrar na Pesquisa Google):

ctest --output-on-failure

Se você usar o CMake com a função de abrir pasta do Visual Studio, poderá adicionar o

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

definição para sua configuração de compilação.


1
Gosto muito da sua solução; não é prolixo, exceto em caso de falha.
AnthonyD973

19

make check CTEST_OUTPUT_ON_FAILURE=TRUE


6
Todos os votos negativos são bastante surpreendentes: isso é quase equivalente à resposta aceita, mas mais curta e mais agradável. Também funciona no projeto que testei.
zbyszek

2
faça CTEST_OUTPUT_ON_FAILURE = 1 teste
Alex Punnen

11

Isso torna a saída do teste mais detalhada:

make test ARGS="-V"

10

Minha abordagem é uma combinação das respostas de ony , de zbyszek e de tarc . Eu uso a ${CMAKE_COMMAND}variável (que é definida como o caminho absoluto para o executável cmake invocado) com o -E env CTEST_OUTPUT_ON_FAILURE=1argumento para invocar o comando ctest real usando ${CMAKE_CTEST_COMMAND} -C $<CONFIG>. Para ajudar a esclarecer o que está acontecendo, começo com três cmake -E echocomandos para mostrar o diretório de trabalho atual e o comando ctest a ser chamado. É assim que eu chamo 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
    )

Isso funciona bem com o IDE MSVC, onde quaisquer erros de teste são mostrados como erros de compilação clicáveis. Consulte cmake -E env para obter a documentação do cmake -Emodo de ferramenta de linha de comando portátil. Também adiciono uma dependência de ALL_BUILDpara que todos os projetos sejam construídos antes de invocar o checkdestino. (Em compilações do Linux, pode ser necessário substituir ALL_BUILDpor ALL; ainda não testei isso no Linux.)


6

Para quem usa o Visual Studio, aqui está outra variação (hack) do tema:

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

0

para mostrar o resultado com o arquivo XML você deve executar o teste com o seguinte comando

~$ ctest -T Test

e encontramos o resultado em Testing / 1234123432 / test.xml e outros arquivos são gerados também na pasta Testing


0

ctest -VV ou ctest --extra-verbose

Da documentação :

Habilite uma saída mais detalhada dos testes.

A saída do teste é normalmente suprimida e apenas informações resumidas são exibidas. Esta opção mostrará ainda mais resultados de teste.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.