关于使用Julia&Base.Test的正确方法:即使有些测试失败,也要运行所有测试

Pic*_*ent 6 unit-testing julia

使用Base.Test我的单元测试,我被立即退出第一次测试失败后立即感到惊讶。

让我们考虑一下这个runtest.jl文件:

using Base.Test

@testset "First" begin
    # test fails
    @test false
end;

@testset "Second" begin
    # never run... 
    @test true 
end;
Run Code Online (Sandbox Code Playgroud)

的输出julia runtest.jl始终为(永远不会运行第二个测试):

First: Test Failed
  Expression: false
Stacktrace:
 [1] macro expansion at /home/picaud/Temp/runtests.jl:14 [inlined]
 [2] macro expansion at ./test.jl:860 [inlined]
 [3] anonymous at ./<missing>:?
Test Summary: | Fail  Total
First         |    1      1
ERROR: LoadError: Some tests did not pass: 0 passed, 1 failed, 0 errored, 0 broken.
Run Code Online (Sandbox Code Playgroud)

我的问题:即使某些测试失败,如何运行并报告所有测试结果?

Pic*_*ent 8

阅读Julia doc 的“测试集”,似乎必须系统地使用嵌套测试集

通常,使用大量测试来确保功能在一定范围的输入范围内正常工作。如果测试失败,则默认行为是立即抛出异常。但是,通常最好先运行其余测试,以更好地了解正在测试的代码中有多少错误。

后来这句话:

@testset()宏可用于将测试分组。将运行测试集中的所有测试,并在测试集结束时打印摘要。

在前面的特殊示例中,

using Base.Test

@testset "All tests" begin

    @testset "First" begin
        @test false 
    end;

    @testset "Second" begin
        # is run, ok
        @test true 
    end;

end;
Run Code Online (Sandbox Code Playgroud)

运行所有测试:

First: Test Failed
  Expression: false
Stacktrace:
 [1] macro expansion at /home/picaud/Temp/runtests.jl:5 [inlined]
 [2] macro expansion at ./test.jl:860 [inlined]
 [3] macro expansion at /home/picaud/Temp/runtests.jl:4 [inlined]
 [4] macro expansion at ./test.jl:860 [inlined]
 [5] anonymous at ./<missing>:?
Test Summary: | Pass  Fail  Total
All tests     |    1     1      2
  First       |          1      1
  Second      |    1            1
ERROR: LoadError: Some tests did not pass: 1 passed, 1 failed, 0 errored, 0 broken.
Run Code Online (Sandbox Code Playgroud)