如何强制CMake在make test后输出测试结果?Fortran项目FRUIT测试问题
你遇到的情况是FRUIT默认不会把测试结果直接打印到控制台,而是可能写入文件,比如你给出的这段测试结果:
Test module initialized . : successful assert, F : failed assert
7.00000000000000 -3.60000000000000 7.00000000000000
FFF
Start of FRUIT summary:
Some tests failed!
-- Failed assertion messages:
[not_set]:Expected [7.00000000000000], Got [1.00000000000000]
[not_set]:Expected [-3.60000000000000], Got [2.00000000000000]
[not_set]:Expected [7.00000000000000]...
结合CMake构建Fortran项目的场景,我给你几个实用的解决方案:
方案1:修改测试代码,让FRUIT直接输出到控制台
FRUIT提供了fruit_set_output_unit子程序来指定输出目标,Fortran里标准输出(控制台)的单元号是6。你只需要在测试程序的初始化部分,也就是call fruit_init()之后、测试用例之前,添加这一行代码:
call fruit_set_output_unit(6)
修改后,FRUIT就会把所有测试结果(包括失败断言的详细信息)直接打印到控制台,不用再去翻结果文件。
方案2:通过CMake自动打印FRUIT结果文件
如果不想改动测试代码,你可以在CMake配置里加一个后续步骤,自动读取FRUIT生成的结果文件并输出到控制台。假设FRUIT默认生成的结果文件是fruit_results.txt,可以这么写CMake代码:
# 先定义你的测试可执行文件 add_executable(my_fruit_tests test_foo.f90 test_bar.f90) target_link_libraries(my_fruit_tests PRIVATE fruit_library) # 添加执行测试的指令 add_test(NAME RunFruitTests COMMAND $<TARGET_FILE:my_fruit_tests>) # 添加打印结果的步骤,依赖于测试执行完成 add_test(NAME PrintFruitResults COMMAND ${CMAKE_COMMAND} -E cat ${CMAKE_CURRENT_BINARY_DIR}/fruit_results.txt) set_tests_properties(PrintFruitResults PROPERTIES DEPENDS RunFruitTests)
当你运行ctest时,会先执行测试生成结果文件,然后自动把文件内容打印到控制台。${CMAKE_COMMAND} -E cat是跨平台的,Windows、Linux、macOS都能正常用。
方案3:利用FRUIT的命令行参数(如果支持)
有些版本的FRUIT支持通过命令行参数指定输出到标准输出,比如--stdout之类的(具体要看你用的FRUIT版本)。如果支持的话,直接在CMake的测试命令里加上参数就行:
add_test(NAME MyFruitTests COMMAND $<TARGET_FILE:my_fruit_tests> --stdout)
这样测试程序会直接把结果输出到控制台,不需要额外处理。
这几个方案都能帮你在控制台看到FRUIT的测试结果,选哪个看你的需求——修改代码最直接,CMake方案适合不想动测试代码的场景。
内容的提问来源于stack exchange,提问作者Konrad Rzońca

