标签: ctest

使用CMake,如何从CTest获得详细输出?

我正在使用CMake来构建我的项目.我添加了一个使用Boost单元测试框架的单元测试二进制文件.这个二进制文件包含所有单元测试.我已经添加了由CTest运行的二进制文件:

ADD_EXECUTABLE( tftest test-main.cpp )
ENABLE_TESTING()
ADD_TEST( UnitTests tftest)
Run Code Online (Sandbox Code Playgroud)

但Visual Studio中的构建输出仅显示运行CTest的结果:

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

  0% tests passed, 1 tests failed out of 1
Run Code Online (Sandbox Code Playgroud)

这不是很有用,因为我看不出哪个测试失败了.如果我从命令行手动运行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
Run Code Online (Sandbox Code Playgroud)

那么,我需要在CMakeLists.txt中进行哪些更改才能让CTest --verbose …

cmake ctest

94
推荐指数
11
解决办法
4万
查看次数

CMake&CTest:make test不构建测试

我在CMake中尝试CTest,以便使用make testtarget 自动运行我的一些测试.问题是CMake没有"理解"我愿意运行的测试必须构建,因为它是项目的一部分.

所以我正在寻找一种明确指定这种依赖关系的方法.

dependencies cmake ctest

83
推荐指数
6
解决办法
4万
查看次数

CMake:为ctest设置环境变量(或者自动从ctest/make测试输出失败的测试输出)

我希望ctest默认显示失败的测试输出.也就是说,我想运行:

$ make all test
Run Code Online (Sandbox Code Playgroud)

并且无需查看任何失败测试的输出cat Testing/Temporary/LastTest.log.

似乎有两种方法可以做到这一点:

(1)设置CTEST_OUTPUT_ON_FAILURE环境变量:

 $ CTEST_OUTPUT_ON_FAILURE=1 make all test
 $ # or CTEST_OUTPUT_ON_FAILURE=1 ctest
Run Code Online (Sandbox Code Playgroud)

(2)指定调用的--output-on-failure标志ctest:

 $ ctest --output-on-failure
Run Code Online (Sandbox Code Playgroud)

是否有办法编写CMakeLists.txt文件,以便ctests在默认情况下在正常的"make all test"调用中转储失败的测试输出,而无需在会话中全局导出环境变量或诉诸自定义目标make check(如所描述的)在这里)?

我知道SET_TESTS_PROPERTIES()命令,但尝试这样:

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
PROJECT(testenv CXX)
ENABLE_TESTING()
ADD_EXECUTABLE(hello hello.cpp)
ADD_TEST(testhello hello)

# Following sets the environment variable for the shell in which the test
# progoram 'hello' is run, but not the shell in which ctest is run
SET_TESTS_PROPERTIES(testhello
    PROPERTIES …
Run Code Online (Sandbox Code Playgroud)

testing cmake environment-variables ctest output

36
推荐指数
1
解决办法
7617
查看次数

在CMake中预期的构建失败测试

有时检查某些事情是否无法构建是很好的,例如:

// Next line should fail to compile: can't convert const iterator to iterator.
my_new_container_type::iterator it = my_new_container_type::const_iterator();
Run Code Online (Sandbox Code Playgroud)

是否可以将这些类型的东西合并到CMake/CTest中?我正在寻找这样的东西CMakeLists.txt:

add_build_failure_executable(
    test_iterator_conversion_build_failure
    iterator_conversion_build_failure.cpp)
add_build_failure_test(
    test_iterator_conversion_build_failure
    test_iterator_conversion_build_failure)
Run Code Online (Sandbox Code Playgroud)

(当然,据我所知,这些特定的CMake指令不存在.)

c++ automated-tests cmake ctest

32
推荐指数
2
解决办法
3360
查看次数

在Jenkins中生成CTest结果(xUnit> = 1.58)

看起来这应该很容易在jenkins中集成CMake + CTest.该cmakebuilder插件是非常容易配置(刚才设置的源树和构建树,完成了!).但是我无法理解如何调用CTest步骤.

根据主要的xUnit页面,从版本1.58开始,支持CTest的XML输出,请参阅错误报告.

这就是我能找到的所有文件.当我在google或stackoverflow上搜索时,我只能找到需要手动步骤的非常旧的文档.

我想知道如何使用xUnit(1.81)设置最近的jenkins(1.532.1).我应该创建一个"添加构建步骤"吗?我应该创建一个"构建后动作"吗?我需要填写什么才能让CTest运行并生成正确的XML文件,以便jenkins可以集成它们?

cmake ctest jenkins

27
推荐指数
2
解决办法
1万
查看次数

使用CMake构建Qt测试

任何人都可以给我一些QT测试代码的例子和一个用Cmake构建并与CTest一起运行的CMakeLists.txt.我好像找不到任何东西!

-Kurtis

qt cmake ctest qttest

23
推荐指数
2
解决办法
9824
查看次数

如何在Hudson/Jenkins中获得CTest结果

我正在使用CTest(CMake的一部分)进行自动化测试.

如何在Jenkins仪表板中获得CTest结果?或者,换句话说,如何让CTest在类似JUnit的XML中输出?

junit hudson cmake ctest jenkins

22
推荐指数
1
解决办法
1万
查看次数

如何在使用cmake构建项目后运行ctest

我希望每次成功构建项目时都会启动测试.如果某些测试被破坏,我希望我的构建也被打破.默认情况下,我需要通过运行ctest命令手动运行测试.CTest实际上可以构建项目,但我使用调用make来构建源代码的IDE .而且make不会运行测试.

我将此命令添加到我的根CMakeLists.txt文件,但它不起作用.

add_custom_command(OUTPUT tests.txt 
                   POST_BUILD
                   COMMAND ctest --output-on-failure)
Run Code Online (Sandbox Code Playgroud)

CMake不会返回任何错误,一切都很好,但我的自定义命令不会调用.如何在CMake中每次成功构建后运行一些东西?

更新:

我的最终解决方案是这个功能:

macro(add_unit_test target target_test)
    set(UNIT_TEST_TARGETS ${UNIT_TEST_TARGETS} ${target_test} PARENT_SCOPE)
    add_test(target ${CMAKE_CURRENT_BINARY_DIR}/${target_test})
endmacro(add_unit_test)
Run Code Online (Sandbox Code Playgroud)

它调用add_test并记住列表中的测试目标.此功能添加的项目中的每个测试.在根CMakeLists.txt我有这个代码:

add_custom_target( all_tests ALL
                   DEPENDS ${UNIT_TEST_TARGETS}
)
add_custom_command(TARGET all_tests
                   COMMENT "Run tests"
                   POST_BUILD COMMAND ctest ARGS --output-on-failure
                   WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
)
Run Code Online (Sandbox Code Playgroud)

它创建依赖于项目中所有单元测试的自定义目标.自定义命令all_tests在构建目标后运行.

cmake ctest

21
推荐指数
1
解决办法
1万
查看次数

std :: cerr不等待std :: cout(运行CTest时)

上下文

我为用户写了一个记录器打印消息.打印带有"debug","info"或"warning" std::cout级别的消息,并打印带有"error"或"system_error"级别的消息std::cerr.我的程序不是多线程的.我使用gcc 4.7.2和CMake 3.1.0在Linux openSUSE 12.3下工作.

我的问题

我发现有时,当一条错误消息(打印在std::cerr)后面跟着一条长信息消息(打印出来std::cout),当输出被LastTest.logCTest 重定向到文件时,信息消息中会出现错误信息(请看下面的例子).我不太了解这种行为,但我想是一个写入线程被启动std::cout,然后代码继续,另一个写入线程被推出,std::cerr而不等待第一个终止.

是否可以避免不使用std::cout?

我在终端没有问题.它只在CTest将输出重定向到LastTest.log文件时发生.

请注意我的缓冲区已刷新.这不是std::endl呼叫后来的问题std::cerr!

例

预期行为:

[ 12:06:51.497   TRACE ] Start test
[ 12:06:52.837 WARNING ] This
                         is
                         a
                         very
                         long
                         warning
                         message...
[ 12:06:52.837   ERROR ] AT LINE 49 : 7
[ 12:06:52.841   ERROR ] AT LINE 71 : 506
[ 12:06:52.841   TRACE ] End of test
Run Code Online (Sandbox Code Playgroud)

怎么了 : …

c++ io-redirection ctest output

20
推荐指数
2
解决办法
2515
查看次数

捕获lib(单元测试)和CTest(CMake)集成

我正在寻找Catch CatchLib与CMake测试(Ctest)集成的成功示例.据我所知这是另外的cmake脚本,它必须解析应用程序输出?有人写过这个吗?可能分享了这个?

==================================================

更新(已找到解决方案):

我已经向CatchLib 提交了cmake脚本,用于集成Catch与CTest.这是Fraser99的CMake的脚本的简化版本,在这里

c++ unit-testing cmake ctest catch-unit-test

20
推荐指数
2
解决办法
1万
查看次数