让 Julia 测试套件在 运行 结束时报告所有错误消息
Make Julia testsuite report all error messages at end of run
我正在使用 Julia 测试套件功能,我非常喜欢它。
然而我没弄清楚的是如何让测试套件在完成时报告潜在的消息。
假设我有一个如下所示的测试套件,其中每个函数在返回之前依次执行一系列测试
@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
如果现在说 my_test_4
失败或抛出错误,那么输出将如下所示
Test Summary: | Pass Error Total
MyTestSuite | 65 1 66
Subtest1 | 5 1 6
Subtest2 | 10 0 10
Subtest3 | 20 0 20
Subtest4 | 30 0 30
ERROR: LoadError: Some tests did not pass: 65 passed, 0 failed, 1 errored, 0 broken.
但现在(据我所知)我无需在终端输出中向上滚动就可以查看出了什么问题。如果我的测试套件足够长,并产生足够的诊断信息,我什至可能会丢失错误信息,或者至少很难找到。
那么,有人知道解决这个问题的好方法吗?是否可以为宏 @testset
提供选项以确保它打印或收集错误以供进一步处理?
您可以定义您的自定义 AbstractTestSet
。它在 Julia 手册中有描述here。
这是根据手册改编的示例。首先定义:
using Test
struct CustomTestSet <: Test.AbstractTestSet
description::AbstractString
results::Vector
CustomTestSet(desc) = new(desc, [])
end
Test.record(ts::CustomTestSet, child::Test.AbstractTestSet) = push!(ts.results, child)
Test.record(ts::CustomTestSet, res::Test.Result) = push!(ts.results, res)
function Test.finish(ts::CustomTestSet)
if Test.get_testset_depth() > 0
Test.record(Test.get_testset(), ts)
end
ts
end
现在你可以写:
julia> res = @testset CustomTestSet "custom testset" begin
# this testset should inherit the type, but not the argument.
@testset "custom testset inner" begin
@test 1==1
@test 1==2
@test 2==2
@test 2==3
end
end
CustomTestSet("custom testset", Any[CustomTestSet("custom testset inner", Any[Test Passed, Test Failed at REPL[10]:5
Expression: 1 == 2
Evaluated: 1 == 2, Test Passed, Test Failed at REPL[10]:7
Expression: 2 == 3
Evaluated: 2 == 3])])
julia> res.results[1].results
4-element Array{Any,1}:
Test Passed
Test Failed at REPL[10]:5
Expression: 1 == 2
Evaluated: 1 == 2
Test Passed
Test Failed at REPL[10]:7
Expression: 2 == 3
Evaluated: 2 == 3
并且您可以访问一个向量,它会告诉您什么通过了什么失败了,如果失败了,问题是什么。
您还可以过滤掉通过的测试:
julia> filter(x -> !(x isa Test.Pass), res.results[1].results)
2-element Array{Any,1}:
Test Failed at REPL[6]:5
Expression: 1 == 2
Evaluated: 1 == 2
Test Failed at REPL[6]:7
Expression: 2 == 3
Evaluated: 2 == 3
如果您的测试具有更复杂的嵌套结构,您应该递归地进行。
这是你想要的吗?
我正在使用 Julia 测试套件功能,我非常喜欢它。 然而我没弄清楚的是如何让测试套件在完成时报告潜在的消息。
假设我有一个如下所示的测试套件,其中每个函数在返回之前依次执行一系列测试
@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
如果现在说 my_test_4
失败或抛出错误,那么输出将如下所示
Test Summary: | Pass Error Total
MyTestSuite | 65 1 66
Subtest1 | 5 1 6
Subtest2 | 10 0 10
Subtest3 | 20 0 20
Subtest4 | 30 0 30
ERROR: LoadError: Some tests did not pass: 65 passed, 0 failed, 1 errored, 0 broken.
但现在(据我所知)我无需在终端输出中向上滚动就可以查看出了什么问题。如果我的测试套件足够长,并产生足够的诊断信息,我什至可能会丢失错误信息,或者至少很难找到。
那么,有人知道解决这个问题的好方法吗?是否可以为宏 @testset
提供选项以确保它打印或收集错误以供进一步处理?
您可以定义您的自定义 AbstractTestSet
。它在 Julia 手册中有描述here。
这是根据手册改编的示例。首先定义:
using Test
struct CustomTestSet <: Test.AbstractTestSet
description::AbstractString
results::Vector
CustomTestSet(desc) = new(desc, [])
end
Test.record(ts::CustomTestSet, child::Test.AbstractTestSet) = push!(ts.results, child)
Test.record(ts::CustomTestSet, res::Test.Result) = push!(ts.results, res)
function Test.finish(ts::CustomTestSet)
if Test.get_testset_depth() > 0
Test.record(Test.get_testset(), ts)
end
ts
end
现在你可以写:
julia> res = @testset CustomTestSet "custom testset" begin
# this testset should inherit the type, but not the argument.
@testset "custom testset inner" begin
@test 1==1
@test 1==2
@test 2==2
@test 2==3
end
end
CustomTestSet("custom testset", Any[CustomTestSet("custom testset inner", Any[Test Passed, Test Failed at REPL[10]:5
Expression: 1 == 2
Evaluated: 1 == 2, Test Passed, Test Failed at REPL[10]:7
Expression: 2 == 3
Evaluated: 2 == 3])])
julia> res.results[1].results
4-element Array{Any,1}:
Test Passed
Test Failed at REPL[10]:5
Expression: 1 == 2
Evaluated: 1 == 2
Test Passed
Test Failed at REPL[10]:7
Expression: 2 == 3
Evaluated: 2 == 3
并且您可以访问一个向量,它会告诉您什么通过了什么失败了,如果失败了,问题是什么。
您还可以过滤掉通过的测试:
julia> filter(x -> !(x isa Test.Pass), res.results[1].results)
2-element Array{Any,1}:
Test Failed at REPL[6]:5
Expression: 1 == 2
Evaluated: 1 == 2
Test Failed at REPL[6]:7
Expression: 2 == 3
Evaluated: 2 == 3
如果您的测试具有更复杂的嵌套结构,您应该递归地进行。
这是你想要的吗?