@eval 在@testset 名称参数中转义 $

@eval escapes $ in @testset name argument

我在一个文件中有几个 @testset,我想对齐它们的输出。
一开始看起来像这样:

Test Summary: | Pass  Total
short         |    1      1
Test Summary:         | Pass  Total
test with longer name |    1      1

我希望 | 对齐,这样就可以了:

Test Summary:         | Pass  Total
short                 |    1      1
Test Summary:         | Pass  Total
test with longer name |    1      1

我尝试使用 @sprintf 使名称长度相同,但 @testset 宏需要一个字符串文字。所以我使用 @eval 将格式化字符串插入到名称中:

testName(name) = @sprintf("%-25s", name)

@eval begin

@testset $(testName("short")) begin
    @test true
end

@testset $(testName("test with longer name")) begin
    @test true
end

end # @eval

这给了我想要的简单测试集,但达不到 for 循环变量插入到名称中。
如果我添加这样的测试:

@testset $(testName("some for test $i")) for i in 9:11
    @test i > 0
end

输出是

Test Summary:             | Pass  Total
short                     |    1      1
Test Summary:             | Pass  Total
test with longer name     |    1      1
Test Summary:             | Pass  Total
some for test $i          |    1      1
Test Summary:             | Pass  Total
some for test $i          |    1      1
Test Summary:             | Pass  Total
some for test $i          |    1      1

看起来 eval 宏以某种方式转义了 $,它不再适用于 @testset 宏。 为什么它不起作用,我如何强制 $ 在名称字符串文字中不转义地存在? (也欢迎就如何对齐结果提出建议)。

使用 String 和插值作为 @testset 宏的参数:

julia> @testset "$(testName("some for test $i"))" for i in 9:11
           @test i > 0
       end;
Test Summary:             | Pass  Total
some for test 9           |    1      1
Test Summary:             | Pass  Total
some for test 10          |    1      1
Test Summary:             | Pass  Total
some for test 11          |    1      1