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

如何让Julia测试套件在运行结束时汇总所有错误信息?

解决Julia测试套件结束后汇总错误信息的问题

我完全理解你的困扰——当测试套件规模较大时,终端快速滚动的错误信息很容易丢失,只看最后给出的摘要根本找不到具体问题的原因。下面给你几个实用的解决方案,帮你轻松收集和查看测试中的错误细节:

方法1:使用Test.report()打印详细测试报告

Julia的Test模块内置了report()函数,它可以在测试结束后输出所有失败、错误和broken测试的完整上下文,包括错误栈、测试代码位置等信息。你只需要在@testset块之后调用这个函数即可:

using Test

# 你的测试函数示例
function my_test_1()
    return true
end
function my_test_2()
    return true
end
function my_test_3()
    return true
end
function my_test_4()
    error("This is a test error!")
end

# 运行测试套件
@testset "MyTestSuite" begin
    @testset "Subtest1" begin
        @test my_test_1()
    end
    @testset "Subtest2" begin
        @test my_test_2()
    end
    @testset "Subtest3" begin
        @test my_test_3()
    end
    @testset "Subtest4" begin
        @test my_test_4()
    end
end

# 打印详细错误报告
Test.report()

运行后,除了原来的测试摘要,你会看到类似这样的完整错误信息:

Error During Test at ./test_script.jl:15
Got exception outside of a @test
Error: This is a test error!
Stacktrace:
[1] error(s::String)
@ Base ./error.jl:35
[2] my_test_4()
@ Main ./test_script.jl:15
...

这个方法最简单直接,不需要额外的自定义代码就能满足需求。

方法2:自定义日志收集器,按需汇总错误信息

如果你需要更灵活地控制错误信息的收集范围和输出格式,可以通过自定义AbstractLogger来捕获测试过程中的错误日志,最后统一打印:

using Test, Logging

# 创建一个用于收集测试错误的日志器
struct TestErrorCollector <: AbstractLogger
    errors::Vector{Any}
end

TestErrorCollector() = TestErrorCollector([])

# 处理日志消息,只收集测试相关的错误和警告
function Logging.handle_message(logger::TestErrorCollector, level, message, _module, group, id, file, line; kwargs...)
    if group == :test && (level == Error || level == Warn)
        push!(logger.errors, (
            level=level,
            message=message,
            file=file,
            line=line,
            error=get(kwargs, :error, nothing)
        ))
    end
end

# 配置日志器的基本行为
Logging.shouldlog(logger::TestErrorCollector, level, _module, group, id) = true
Logging.min_enabled_level(logger::TestErrorCollector) = Logging.Warn

# 使用自定义日志器运行测试
collector = TestErrorCollector()
with_logger(collector) do
    @testset "MyTestSuite" begin
        @testset "Subtest1" begin
            @test my_test_1()
        end
        @testset "Subtest2" begin
            @test my_test_2()
        end
        @testset "Subtest3" begin
            @test my_test_3()
        end
        @testset "Subtest4" begin
            @test my_test_4()
        end
    end
end

# 最后自定义格式打印汇总的错误信息
println("\n=== 测试错误汇总 ===")
for (idx, err) in enumerate(collector.errors)
    println("\n错误 $idx:")
    println("级别: ", err.level)
    println("位置: ", err.file, " 第", err.line, "行")
    println("信息: ", err.message)
    if err.error !== nothing
        println("详细栈信息:")
        println(sprint(showerror, err.error))
    end
end

这个方法的优势是你可以根据需求过滤日志(比如只保留错误、忽略警告),或者自定义输出格式,让错误信息更符合你的阅读习惯。

额外小技巧:重定向输出到文件

如果你的测试输出非常多,终端滚动太快,还可以将所有输出重定向到文件中,方便后续搜索查看:

julia your_test_script.jl > test_results.txt 2>&1

这样所有的测试输出(包括错误信息和摘要)都会保存到test_results.txt里,你可以用文本编辑器打开后搜索关键词(比如"Error")快速定位问题。

内容的提问来源于stack exchange,提问作者Mikael Fremling

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:21:02