代码测试
编写测试文件
模块目录中:
测试文件:以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
}最后更新于
这有帮助吗?