如何在 JUnit 5 中使用 LoggingListener 捕获日志输出

冬明同学_4836

冬明同学_4836

2026-06-17

620人浏览

原创

JUnit 5 提供了 LoggingListener 用于捕获测试执行过程中的日志(如 JUL 输出),但需通过 Launcher API 显式注册并配合平台配置启用标准流捕获,不能直接用于 @Test 注解的常规测试运行。

junit 5 提供了 `logginglistener` 用于捕获日志输出(如 java.util.logging 在 info 级别产生的日志),但需通过 launcher api 显式注册并配合平台配置启用标准流捕获,不能直接用于 @test 注解的常规测试运行。

LoggingListener 是 JUnit 5 平台(junit-platform-launcher)中一个预置的 TestExecutionListener 实现,专为捕获 java.util.logging(JUL)日志设计。它不会自动生效——你不能仅靠创建实例(如 LoggingListener.forJavaUtilLogging(Level.INFO))就让日志被拦截;必须将其注册到 Launcher 实例,并确保测试执行环境启用了标准输出/错误捕获。

✅ 正确使用步骤

  1. 启用平台级输出捕获
    在 src/test/resources/junit-platform.properties 中添加:

    junit.platform.output.capture.stdout=true
    junit.platform.output.capture.stderr=true

    这是前提:LoggingListener 依赖平台底层对 System.out/System.err 的重定向机制来捕获 JUL 日志(因为 JUL 默认将 INFO+ 日志输出到 System.err)。

    Day of AI
    Day of AI

    Day of AI是一款AI学习资源工具,麻省理工学院(MIT)推出的免费AI学习平台。

    下载
  2. 通过 Launcher API 执行测试并注册 Listener
    LoggingListener 必须作为 TestExecutionListener 注册到 Launcher,且测试需通过 Launcher.execute() 启动(而非 IDE 或 Maven Surefire 的默认运行方式)。示例如下:

import org.junit.platform.launcher.*;
import org.junit.platform.launcher.core.LauncherDiscoveryRequestBuilder;
import org.junit.platform.launcher.core.LauncherFactory;
import org.junit.platform.launcher.listeners.LoggingListener;
import org.junit.platform.engine.discovery.DiscoverySelectors;

public class LoggingTestRunner {
    public static void main(String[] args) {
        // 构建发现请求:扫描 test 包
        LauncherDiscoveryRequest request = LauncherDiscoveryRequestBuilder.request()
                .selectors(DiscoverySelectors.selectPackage("test"))
                .configurationParameter("junit.platform.output.capture.stdout", "true")
                .configurationParameter("junit.platform.output.capture.stderr", "true")
                .build();

        try (LauncherSession session = LauncherFactory.openSession()) {
            Launcher launcher = session.getLauncher();

            // ✅ 关键:注册 LoggingListener(捕获 JUL INFO 日志)
            launcher.registerTestExecutionListeners(
                LoggingListener.forJavaUtilLogging(java.util.logging.Level.INFO)
            );

            TestPlan plan = launcher.discover(request);
            launcher.execute(plan); // 执行测试,日志将被监听器捕获并输出到 JUL Handler(如 ConsoleHandler)
        }
    }
}

? 注意:LoggingListener 本身不“存储”日志,而是将捕获的日志条目转发给当前 JUL 的 Logger(通常为 org.junit.platform.launcher),因此请确保你的 JUL 配置(如 logging.properties)允许该 logger 输出到控制台或文件。

⚠️ 常见误区与注意事项

  • ❌ 不适用于 @Test 直接运行:在 IDE 中右键运行单个测试类时,JUnit 5 通常使用 junit-jupiter-engine 的默认执行路径,不会加载你手动注册的 LoggingListener。必须显式使用 Launcher 启动。
  • ❌ 不捕获 SLF4J / Logback 日志:LoggingListener 仅适配 java.util.logging。若项目使用 SLF4J,需改用 slf4j-simple 绑定或自定义 TestExecutionListener 拦截 org.slf4j.Logger。
  • ✅ 可与其他 Listener 组合使用:例如同时注册 LoggingListener 和自定义 TestExecutionListener,实现日志捕获 + 自定义报告逻辑。
  • ? 日志格式说明:LoggingListener 将每条 JUL 日志封装为 ReportEntry,其 keyValuePairs() 包含 "logger"、"level"、"message" 等键,可通过 reportingEntryPublished() 方法进一步解析(但通常无需手动处理)。

✅ 总结

LoggingListener 是 JUnit 5 平台层提供的轻量级日志捕获工具,核心价值在于标准化 JUL 日志的测试集成。要真正启用它,请牢记三点:
① 配置 junit-platform.properties 开启 stdout/stderr 捕获;
② 使用 Launcher API(而非注解驱动方式)执行测试;
③ 显式调用 launcher.registerTestExecutionListeners(...) 注册监听器实例。
完成这三步后,所有测试中通过 java.util.logging.Logger 输出的 INFO 及更高级别日志,将被自动捕获并按 JUL 配置输出,便于断言、调试或生成测试报告。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
软件测试常用工具
软件测试常用工具

软件测试常用工具有Selenium、JUnit、Appium、JMeter、LoadRunner、Postman、TestNG、LoadUI、SoapUI、Cucumber和Robot Framework等等。测试人员可以根据具体的测试需求和技术栈选择适合的工具,提高测试效率和准确性 。

2023.10.13

4310

8

java测试工具有哪些
java测试工具有哪些

java测试工具有JUnit、TestNG、Mockito、Selenium、Apache JMeter和Cucumber。php还给大家带来了java有关的教程,欢迎大家前来学习阅读,希望对大家能有所帮助。

2023.10.23

2701

10

Java 单元测试
Java 单元测试

本专题聚焦 Java 在软件测试与持续集成流程中的实战应用,系统讲解 JUnit 单元测试框架、Mock 数据、集成测试、代码覆盖率分析、Maven 测试配置、CI/CD 流水线搭建(Jenkins、GitHub Actions)等关键内容。通过实战案例(如企业级项目自动化测试、持续交付流程搭建),帮助学习者掌握 Java 项目质量保障与自动化交付的完整体系。

2025.10.24

1026

26

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

2026.09.30

80

10

LLVM RISC-V参数配置教程
LLVM RISC-V参数配置教程

本专题介绍LLVM对RISC-V基础ISA和扩展的支持方式,涵盖RV32、RV64、标准扩展、实验性扩展、厂商扩展、-menable-experimental-extensions和版本差异。

2026.09.30

80

14

LLVM IR中间表示入门指南
LLVM IR中间表示入门指南

本专题整理LLVM IR的核心概念,包括中间表示作用、模块结构、函数、基本块、SSA形式、类型系统和常见语法,帮助新手理解LLVM编译流程中的关键层。

2026.09.30

80

12

PDF转图片方法
PDF转图片方法

需要把 PDF 页面用于上传、预览、分享或图片归档时,PDF 转图片方法专题整理 JPG/PNG 格式选择、逐页导出、清晰度设置、批量下载和结果检查等流程,帮助用户稳定完成 PDF 图片化处理。

2026.09.30

60

26

PixTV AI视频生成与无限画布创作
PixTV AI视频生成与无限画布创作

PixTV专题整理AI视频与视觉内容创作相关功能使用教程,涵盖AI生图、视频生成、无限画布、多模型创作、素材管理、声音音乐及视频剪辑等功能,帮助用户快速掌握PixTV从创意到成片的完整制作方法。

2026.09.29

60

15

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

2026.09.23

280

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.4万人学习