當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Julia Test.@test_logs用法及代碼示例


用法:

@test_logs [log_patterns...] [keywords] expression

使用 collect_test_logs 收集 expression 生成的日誌記錄列表,檢查它們是否匹配序列 log_patterns ,並返回 expression 的值。 keywords 提供一些簡單的日誌記錄過濾:min_level 關鍵字控製為測試收集的最低日誌級別,match_mode 關鍵字定義如何執行匹配(默認 :all 檢查所有日誌和模式成對匹配;使用 :any 檢查模式是否在序列中的某個位置至少匹配一次。)

最有用的日誌模式是 (level,message) 形式的簡單元組。可以使用不同數量的元組元素來匹配其他日誌元數據,對應於通過 handle_message 函數傳遞給 AbstractLogger 的參數:(level,message,module,group,id,file,line)。默認情況下,存在的元素將與使用 == 的日誌記錄字段成對匹配,在特殊情況下,Symbol 可用於標準日誌級別,而模式中的 Regex 將匹配字符串或使用 occursin 的符號字段。

例子

考慮一個記錄警告和一些調試消息的函數:

function foo(n)
    @info "Doing foo with n=$n"
    for i=1:n
        @debug "Iteration $i"
    end
    42
end

我們可以使用

@test_logs (:info,"Doing foo with n=2") foo(2)

如果我們還想測試調試消息,則需要使用 min_level 關鍵字啟用這些消息:

@test_logs (:info,"Doing foo with n=2") (:debug,"Iteration 1") (:debug,"Iteration 2") min_level=Logging.Debug foo(2)

如果要測試是否生成了某些特定消息而忽略其餘消息,可以設置關鍵字 match_mode=:any

@test_logs (:info,) (:debug,"Iteration 42") min_level=Logging.Debug match_mode=:any foo(100)

宏可以與 @test 鏈接以測試返回值:

@test (@test_logs (:info,"Doing foo with n=2") foo(2)) == 42

如果要測試是否沒有警告,可以省略指定日誌模式並相應地設置min_level

# test that the expression logs no messages when the logger level is warn:
@test_logs min_level=Logging.Warn @info("Some information") # passes
@test_logs min_level=Logging.Warn @warn("Some information") # fails

如果要測試 stderr 中是否存在不是由 @warn 生成的警告(或錯誤消息),請參閱 @test_nowarn

相關用法


注:本文由純淨天空篩選整理自julialang.org 大神的英文原創作品 Test.@test_logs — Macro。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。