代码测试
编写测试文件
模块目录中:
测试文件:以xxx_test.v结尾。
测试函数:以test_xxx()开头。
assert 断言语句
如果assert语句后面的表达式结果为true,表示测试通过,如果为false,表示测试不通过。
示例:vlib/builtin/string_test.v
fn test_add() {
mut a := 'a'
a += 'b'
assert a==('ab')
a = 'a'
for i := 1; i < 1000; i++ {
a += 'b'
}
assert a.len == 1000
assert a.ends_with('bbbbb')
a += '123'
assert a.ends_with('3')
}
fn test_ends_with() {
a := 'browser.v'
assert a.ends_with('.v')
}
fn test_between() {
s := 'hello [man] how you doing'
assert s.find_between('[', ']') == 'man'
}
assert语句还支持附带错误消息:当表达式结果为false时,可以输出一个错误消息,方便测试定位问题。
错误消息必须是字符串类型,或者返回字符串的函数调用。
fn test_abc() {
i := 123
assert 4 == 2 * 2
assert 2 == 6 / 3, 'math works'
assert 10 == i - 120, 'i: $i' //附带字符串类型的错误消息,当表达式为false时输出
}
执行错误时输出:
> assert 10 == i - 120, 'i: $i'
Left value: 10
Right value: 3
Message: i: 123
断言继续
如果测试函数加了assert_continues注解,当断言不为真时,仍然继续往下执行,只是把所有断言不通过时的表达式左值和右值打印出来。如果没有这个注解,碰到第一个不通过的条件,测试就会停止,只打印出第一个不通过时的表达式。
[assert_continues]
fn abc(ii int) {
assert ii == 2
}
fn test_abc() {
for i in 0 .. 4 {
abc(i)
}
}
输出所有断言不通过的表达式值:
main_test.v:3: ✗ fn abc
> assert ii == 2
Left value: 0
Right value: 2
main_test.v:3: ✗ fn abc
> assert ii == 2
Left value: 1
Right value: 2
main_test.v:3: ✗ fn abc
> assert ii == 2
Left value: 3
Right value: 2
也可以使用命令行参数来实现相同的效果,而不用每个函数都加assert_continues注解。
v -assert continues test .
另外-assert也有别的选项:
v -assert aborts test . #默认的行为,碰到断言不通过,停止测试
v -assert backtraces test . #碰到断言不通过,停止测试,并调用print_backtrace()显示堆栈信息
执行测试
执行单个测试文件:
v test xxx_test.v
执行模块测试文件:
v test xxx(模块名/目录名)
会逐个执行模块,包括子模块中的所有测试文件,所有以test_开头的测试函数。
执行测试时,可增加-stats选项,显示更为详细的测试结果。
v -stats test xxx.v
忽略testdata目录
如果希望有一些测试文件要忽略执行,可以创建名为testdata的目录,测试框架会忽略这个目录。
实际开发场景中,这个目录还是挺实用的,可以把临时不用的测试文件挪到该目录中。
特定操作系统测试
如果希望有些测试函数只在特定操作系统下执行,可以使用if注解来实现。
执行测试的时候,只有满足操作系统条件的测试函数才执行。
[if macos] //只有macos系统中才执行测试
pub fn test_in_macos() {
println("test in macos")
assert true
}
[if !macos] //只有非macos系统才执行测试
pub fn test_not_in_macos() {
$if !macos {
println("test not in macos")
}
$if macos {
println("test in macos")
}
println("test only not in macos")
assert false
}
[if linux]
pub fn test_only_in_linux() {
println("test only in linux")
assert false
}
[if linux || windows] //在linux或windows系统中才执行测试
pub fn test_in_linux_or_macos() {
println("test in linux or macos")
assert false
}
最后更新于
这有帮助吗?