
Gradle 默认的 test 任务输出仅显示测试类简名(如 ExampleSpec),不包含包路径;本文介绍通过配置 afterTest 钩子和自定义 testLogging,强制在控制台输出中显示带完整包名的测试用例结果(如 com.company.ExampleSpec > get all examples PASSED),并支持彩色状态标识。
gradle 默认的 `test` 任务输出仅显示测试类简名(如 `examplespec`),不包含包路径;本文介绍通过配置 `aftertest` 钩子和自定义 `testlogging`,强制在控制台输出中显示带完整包名的测试用例结果(如 `com.company.examplespec > get all examples passed`),并支持彩色状态标识。
Gradle 原生测试日志默认省略包名,虽提升可读性,但在多模块或同名类较多的项目中易引发歧义。要恢复带包路径的完整类名输出,需绕过默认的 testLogging.events 简化机制,改用 afterTest 生命周期钩子手动格式化每条测试结果。
以下是在 build.gradle(Groovy DSL)中的标准配置方案:
String ANSI_RESET = "\u001B[0m"
String ANSI_RED = "\u001B[31m" // 红色:失败
String ANSI_GREEN = "\u001B[32m" // 绿色:通过
String ANSI_YELLOW = "\u001B[33m" // 黄色:跳过
test {
useJUnitPlatform() // 若使用 JUnit 5;Junit 4 请替换为 useJUnit()
// 关闭默认事件输出,避免重复(关键!)
testLogging {
events = [] // 清空默认事件(如 "passed", "failed"),防止与 afterTest 冲突
showExceptions = true
exceptionFormat = "full"
showCauses = true
showStackTraces = true
}
afterTest { TestDescriptor descriptor, TestResult result ->
String className = descriptor.className ?: "unknown"
String testName = descriptor.name ?: "unknown"
String status
if (result.resultType == org.gradle.api.tasks.testing.TestResult.ResultType.FAILURE) {
status = "${ANSI_RED}FAILED${ANSI_RESET}"
} else if (result.resultType == org.gradle.api.tasks.testing.TestResult.ResultType.SKIPPED) {
status = "${ANSI_YELLOW}SKIPPED${ANSI_RESET}"
} else {
status = "${ANSI_GREEN}PASSED${ANSI_RESET}"
}
println "${className} > ${testName} ${status}"
}
}
✅ 关键说明:
- 必须将
testLogging.events显式设为空列表[],否则 Gradle 会先输出默认格式(无包名),再执行afterTest,导致重复且混乱; -
descriptor.className在 JUnit 5 / Spock 等主流框架下始终返回完整限定名(如com.example.ExampleSpec),无需额外解析; - 彩色 ANSI 码在 IntelliJ、VS Code 终端、Linux/macOS 控制台中默认生效;Windows PowerShell(≥ v5.1)及 Windows Terminal 也原生支持;若需兼容旧版 CMD,可移除 ANSI 字符串,仅保留纯文本;
-
afterTest中的result.resultType比failedTestCount等计数器更精准——它反映当前单个测试的结果类型,而非整个测试套件汇总,避免逻辑误判。
⚠️ 注意事项:
- 此配置不会影响 XML/HTML 测试报告生成(如
build/reports/tests/test/),这些报告仍按 Gradle 标准格式保留完整类名; - 若项目启用
--no-daemon或 CI 环境禁用彩色输出,可添加运行时检测:if (System.getenv("CI") == null && System.console() != null)控制 ANSI 使用; - Kotlin DSL 用户请参考
Test.testLogging {}和afterTest { descriptor, result -> ... }的等效写法,语法结构一致,仅括号与委托略有差异。
通过该配置,你将获得清晰、可追溯、符合工程规范的测试日志——每个 PASSED/FAILED 条目均携带完整包路径,显著提升大型项目中的调试效率与团队协作体验。











