Заставить тестовый набор Джулии сообщать обо всех сообщениях об ошибках в конце запуска.

Я играю с функциональностью набора тестов 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, чтобы убедиться, что он печатает или собирает ошибки для дальнейшей обработки?


person Mikael Fremling    schedule 30.01.2019    source источник


Ответы (1)


Вы можете определить свой собственный AbstractTestSet. Это описано здесь в инструкция Юлия.

Вот пример, адаптированный из руководства. Сначала определите:

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

Если ваши тесты имеют более сложную вложенную структуру, вы должны сделать это рекурсивно.

Это то, что вы хотели?

person Bogumił Kamiński    schedule 01.02.2019
comment
Это, безусловно, соответствует тому, что я искал, и это уже очень полезно. Однако написанная вами функция также записывает все успешные тесты. В моем случае это немного проблематично, так как я генерирую много тестов автоматически (путем простого @test с циклами foor), и они также отображаются. Есть ли хорошая настройка вашего решения, чтобы записывались только неудачные тесты? - person Mikael Fremling; 01.02.2019
comment
Да - просто отфильтруйте успешные тесты. Я покажу пример в ответе. - person Bogumił Kamiński; 01.02.2019