如何获取并保存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.
相关产品推荐
相关产品推荐

