julia是一门十分适合用于科学计算的语言.
个人学习julia的主要目的就是为了科学计算,相比于python,性能要高得多.因此生态什么的关系不是很大,本来就是当作计算器使用的,语言本身的特性,比如支持一些数学运算的运算符直接使用,很适合用来写数学式子.
当你写完一个工具函数,往往需要进行功能的测试,这时候顺便写一个单元测试,就能为你以后维护代码,修bug也提供许多便利.
@test
julia提供了一些宏可以用于单元测试
我们先引入Test包
using Test
使用names函数可以查看一个模块中export导入的变量,其中imported参数设置为true可以用于查看导入的包,all设置为true可以查看没有exported的变量
我们在julia中查看
julia> names(Test)
19-element Vector{Symbol}:
Symbol("@inferred")
Symbol("@test")
Symbol("@test_broken")
Symbol("@test_deprecated")
Symbol("@test_logs")
Symbol("@test_nowarn")
Symbol("@test_skip")
⋮
:GenericSet
:GenericString
:Test
:TestSetException
:detect_ambiguities
:detect_unbound_args
@test可以用于测试
@test true
@test [1, 2] + [2, 1] == [3, 3]
运行测试文件,如果有没通过的地方就会报错
@test_throws
这个是用于检测抛出错误的测试,可以用来测试你的函数是否和预期的一样抛出错误。
比如参数校验的时候,如果参数不合法,你可以抛出来一个ArgumentError,这个时候我们测试参数检验功能就可以用这个
julia> @test_throws BoundsError [1, 2, 3][4]
Test Passed
Thrown: BoundsError
julia> @test_throws DimensionMismatch [1, 2, 3] + [1, 2]
Test Passed
Thrown: DimensionMismatch
@testset
如果你有很多测试要跑的时候,可以用@testset,这个就比较像其他语言里的测试框架了,比如js的mocha,所以说@test就相当于asset函数,mocha还支持expect.js,should.js等断言库,可读性更高罢了。
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
@testset的特点是里面的@test语句,并不会因为中间的一个发生错误就停止,而是先跳过,最后汇总错误数目。
而且@testset是可以嵌套使用的
实战
写了一个计算排列组合的包
我写的测试如下,其中verbose=true,开启后嵌套的测试信息也能正常显示
using Test
include("../src/probabilities.jl")
@testset verbose = true "probabilities" begin
@testset "probabilities.A" begin
# 测试m为0的情况
@test probabilities.A(0, 1) == 1
# 测试参数校验功能, m不能大于n,两者都不能为负数
@test_throws ArgumentError probabilities.A(0, 0)
@test_throws ArgumentError probabilities.A(0, -1)
@test_throws ArgumentError probabilities.A(3, -1)
@test_throws ArgumentError probabilities.A(3, 2)
# 测试正常计算
@test probabilities.A(3, 3) == factorial(3)
@test probabilities.A(10, 10) == factorial(10)
@test probabilities.A(2, 3) == 6
end
@testset "probabilities.C" begin
# 测试m为0的情况
@test probabilities.C(0, 1) == 1
# 测试参数校验功能, m不能大于n,两者都不能为负数
@test_throws ArgumentError probabilities.C(0, 0)
@test_throws ArgumentError probabilities.C(0, -1)
@test_throws ArgumentError probabilities.C(3, -1)
@test_throws ArgumentError probabilities.C(3, 2)
# 测试正常计算
@test probabilities.C(3, 3) == 1
@test probabilities.C(10, 10) == 1
@test probabilities.C(2, 3) == 3
end
end
测试结果如下:
PS C:\Projects\juliaPackages\test> julia .\probabilities_test.jl
Test Summary: | Pass Total
probabilities | 16 16
probabilities.A | 8 8
probabilities.C | 8 8
网友评论