You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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输出不会自动启用,需要显式定义编译宏来触发:

  1. 修改CMakeLists.txt,在target_link_libraries前添加编译宏定义:
    target_compile_definitions(test PRIVATE CATCH_CONFIG_ANDROID_LOGWRITE)
    
  2. 链接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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 03:08:14