超バイオ系

バイオウェット系がバイオバイオしていないブログ。 基本自分用のまとめ。

Julia tips #1:【超簡単】コードのテスト

テストマクロについてのメモ(2017/12/03時点)

環境

windows 10 Pro (Fall Creators Update)
WSL有効化済み
WSLのbashにて実行
環境構築の仕方はこちらをどうぞ

hotoke-x.hatenablog.com

テストマクロの使い方

まずはJuliaのバージョン確認から

$ julia --version
julia version 0.5.2

foo(x)という関数があったとして、その挙動を引数ごとにまとめて行う方法

julia> @testset "Foo Tests" begin
           @test foo("a")   == 1
           @test foo("ab")  == 4
           @test foo("abc") == 9
       end
Test Summary: | Pass  Total
Foo Tests     |    3      3

全部で3回テスト(Total)して、3回ともクリアしたぞ(Pass)って意味。

ネストしていても大丈夫

julia> @testset "Foo Tests" begin
           @testset "Animals" begin
               @test foo("cat") == 9
               @test foo("dog") == foo("cat")
           end
           @testset "Arrays $i" for i in 1:3
               @test foo(zeros(i)) == i^2
               @test foo(ones(i)) == i^2
           end
       end
Test Summary: | Pass  Total
Foo Tests     |    8      8

結果が全部まとめられているが、エラーを吐いている場合は展開して表示してくれる。

Arrays: Test Failed
  Expression: foo(ones(4)) == 15
   Evaluated: 16 == 15
 in record at test.jl:297
 in do_test at test.jl:191
Test Summary: | Pass  Fail  Total
Foo Tests     |    3     1      4
  Animals     |    2            2
  Arrays      |    1     1      2
ERROR: Some tests did not pass: 3 passed, 1 failed, 0 errored, 0 broken.
 in finish at test.jl:362

他にも色んなマクロがある

大体一緒か判定する

@test a≈b

≈は\approxと打った後にtabで表示される。

以下、エラーコードつき。

めっちゃ小さい数値誤差を許容して等しいかどうか判定

julia> @test_approx_eq 1. 0.999999999
ERROR: assertion failed: |1.0 - 0.999999999| < 2.220446049250313e-12
  1.0 = 1.0
  0.999999999 = 0.999999999
 in test_approx_eq at test.jl:75
 in test_approx_eq at test.jl:80

e-12なら通常使用なら問題なさそうかな?

許容誤差を設定して判定

 @test_approx_eq_eps 1. 0.999 1e-3
ERROR: assertion failed: |1.0 - 0.999| <= 0.001
  1.0 = 1.0
  0.999 = 0.999
  difference = 0.0010000000000000009 > 0.001
 in error at error.jl:22
 in test_approx_eq at test.jl:68

こんな書き方もあったりする。

julia> ≈(1, 0.999, atol=0.001)
true

julia> ≈(1, 0.999, atol=0.0001)
false

感想

Pythonでデコレータ書いたりするより遥かに簡単で良い。