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

如何获取并保存Test.jl中@testset生成的DefaultTestSet结果?

如何捕获并保存Test.jl中@testset的测试结果

问题场景

需要解析Test.jl里@testset宏的运行结果,但无法访问它隐式创建的DefaultTestSet,希望把测试结果保存到变量中做后续分析。尝试直接赋值的方法失败,示例如下:

julia> mytestresults = @testset "My test set" begin
           @test true == true
           @test true == false
       end
My test set: Test Failed at REPL[26]:3
  Expression: true == false
   Evaluated: true == false

Stacktrace:
 [1] macro expansion
...

 [4] top-level scope
   @ REPL[26]:2
Test Summary: | Pass  Fail  Total  Time
My test set   |    1     1      2  0.0s
ERROR: Some tests did not pass: 1 passed, 1 failed, 0 errored, 0 broken.

julia> mytestresults
ERROR: UndefVarError: `mytestresults` not defined in `Main`
Suggestion: check for spelling errors or missing imports.

还尝试过嵌套函数返回测试集、修改@testset副本等方案,均未成功。使用版本为Julia 1.11。

解决方案

方法1:显式管理DefaultTestSet实例

手动创建DefaultTestSet对象,通过Test模块的接口控制测试流程,直接获取结果对象:

using Test

# 创建测试集实例
ts = Test.DefaultTestSet("My test set")
# 将该实例设为当前活跃测试集
Test.push_testset(ts)
try
    # 执行测试用例
    @test true == true
    @test true == false
finally
    # 结束测试集并弹出
    Test.pop_testset()
    Test.finish(ts)
end

# 测试结果已保存到ts变量中
mytestresults = ts

此时mytestresults会完整保留测试数据,即使测试失败也不会导致变量未定义。可通过ts.results、ts.pass、ts.fail等字段解析测试详情。

方法2:使用@testset的return参数(Julia 1.7+支持)

从Julia 1.7开始,@testset支持return=true关键字参数,开启后会直接返回测试集对象,不受测试失败的影响:

using Test

mytestresults = @testset "My test set" return=true begin
    @test true == true
    @test true == false
end

# 查看测试结果统计
println(mytestresults.pass)  # 输出1
println(mytestresults.fail)  # 输出1

该方法简洁直接,完全适配Julia 1.11版本,无需额外复杂操作。

关键说明

  • 默认情况下,测试失败时@testset会抛出错误并终止变量赋值,导致变量未定义。
  • return=true参数会让@testset跳过失败后的错误抛出,直接返回测试集实例,方便后续分析。
  • 测试集对象包含results(单条测试结果列表)、broken、error等属性,可用于详细解析每个测试的执行状态。

内容的提问来源于stack exchange,提问作者Jonathan F.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 12:42:39