如何让Android设备上的Catch2 v3测试输出到logcat?
问题:Android下Catch2测试框架输出无法在Qt Creator的Logcat中显示
我有一个基于CMake+Qt的项目,可正常编译并在Android设备上运行。使用qDebug()时,能在Qt Creator的Logcat中看到输出,但Catch2没有任何输出,我怀疑它仍输出到stdout或stderr,因此无法被查看。
CMakeLists.txt
cmake_minimum_required(VERSION 3.14) project(test LANGUAGES CXX) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) set(CMAKE_CXX_STANDARD_REQUIRED ON) find_package(QT NAMES Qt6 REQUIRED COMPONENTS Core) find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core Gui) set(CMAKE_CXX_STANDARD 20) set(UNITTESTS_SOURCES main.cpp ) include(FetchContent) FetchContent_Declare(catch2 GIT_REPOSITORY https://github.com/catchorg/Catch2.git GIT_TAG v3.3.2) FetchContent_MakeAvailable(catch2) qt_add_executable(test ${UNITTESTS_SOURCES}) target_link_libraries(test PUBLIC Catch2::Catch2 Qt::Core Qt::Gui) install(TARGETS test LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} )
main.cpp
#include <catch2/catch_test_macros.hpp> #include <catch2/catch_session.hpp> int main( int argc, char* argv[] ) { int result = Catch::Session().run( argc, argv ); std::fflush(stdout); return result; } TEST_CASE("hello from catch") { CHECK(false); }
我注意到<catch2/internal/catch_config_android_logwrite.hpp>中有一些Logcat相关类,但断点未触发。我已链接Qt,但在这个最小示例中并未调用任何Qt接口。
如何配置才能让Catch2将输出打印到Logcat?
解决方案
方法1:启用Catch2内置的Android Logcat支持
Catch2的Android Logcat输出不会自动启用,需要显式定义编译宏来触发:
- 修改CMakeLists.txt,在
target_link_libraries前添加编译宏定义:target_compile_definitions(test PRIVATE CATCH_CONFIG_ANDROID_LOGWRITE) - 链接Android日志库
log,更新target_link_libraries:target_link_libraries(test PUBLIC Catch2::Catch2 Qt::Core Qt::Gui log)
配置完成后,Catch2会自动将测试输出通过Android原生日志接口写入Logcat,默认标签为Catch2。
方法2:重定向stdout/stderr到Logcat(通用方案)
如果不想依赖Catch2的内置逻辑,可手动将标准输出重定向到Logcat,覆盖所有输出到stdout/stderr的内容:
修改main.cpp,在Catch会话运行前添加重定向代码:
#include <catch2/catch_test_macros.hpp> #include <catch2/catch_session.hpp> #include <android/log.h> #include <cstdio> // 处理stdout输出到Logcat static int logcat_stdout_write(void* cookie, const char* data, int size) { __android_log_write(ANDROID_LOG_INFO, "Catch2Test", data); return size; } // 处理stderr输出到Logcat static int logcat_stderr_write(void* cookie, const char* data, int size) { __android_log_write(ANDROID_LOG_ERROR, "Catch2Test", data); return size; } int main( int argc, char* argv[] ) { // 关闭缓冲并重定向标准流 setvbuf(stdout, nullptr, _IONBF, 0); setvbuf(stderr, nullptr, _IONBF, 0); fclose(stdout); fclose(stderr); stdout = fdopen(fileno(fopen("/dev/null", "w")), "w"); stderr = fdopen(fileno(fopen("/dev/null", "w")), "w"); // 绑定自定义写入函数 funopen(nullptr, nullptr, logcat_stdout_write, nullptr, nullptr); funopen(nullptr, nullptr, logcat_stderr_write, nullptr, nullptr); int result = Catch::Session().run( argc, argv ); return result; }
验证
重新编译部署到Android设备后,在Qt Creator的Logcat中:
- 方法1过滤
Catch2标签 - 方法2过滤
Catch2Test标签
即可看到Catch2的测试输出内容。
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

