vlang
  • 目录
    • V语言学习笔记
    • 目录
    • 安装
    • 开发工具
    • 快速总览
    • 模块
    • 基本类型
    • 变量
    • 常量
    • 枚举
    • 数组
    • 字典
    • 流程控制
    • 函数
    • 结构体
    • 访问控制
    • 方法
    • 注解
    • 接口
    • 泛型
    • 类型别名
    • 联合类型
    • 联合体
    • 错误处理
    • 运算符重载
    • 内置json支持
    • 内置sql支持
    • 并发
    • 内存管理
    • 代码测试
    • 文档生成
    • 编译时代码
    • 包管理器
    • 单个V文件
    • V shell script
    • 不安全代码
    • 集成C代码库
    • 集成汇编代码
    • 裸机环境
    • 生成wasm
    • GUI开发
    • web开发
    • 数据库开发
  • builtin
  • strings
  • arrays
  • maps
  • datatypes
  • strconv
  • os
  • runtime
  • time
  • math
  • json
  • encoding
  • compress
  • toml
  • flag
  • term
  • log
  • io
  • readline
  • reflection
  • net
  • net.http
  • eventbus
  • regex
  • crypto
  • rand
  • sync
  • x
  • db.pg
  • db.mysql
  • db.mssql
  • db.sqlite
  • orm
  • ui
  • sokol
  • gg
  • gx
  • fontstash
  • stbi
  • clipboard
  • V抽象语法树
  • V语言服务
  • V编译器源代码
  • 生成C代码
  • 生成js代码
  • 生成go代码
  • 生成native代码
  • 解释器直接运行
  • 附录1 关键字
  • 附录2 运算符
  • 附录3 编码风格
  • 附录4 V编译器命令行使用
  • 附录5 V调试及错误定位
  • 附录6 V和Go基本语法参照
  • 附录7 V和Zig基本语法参照
由 GitBook 提供支持
在本页
  • 编写测试文件
  • assert 断言语句
  • 断言继续
  • 执行测试
  • 特定操作系统测试

这有帮助吗?

  1. 目录

代码测试

编写测试文件

模块目录中:

测试文件:以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
}
上一页内存管理下一页文档生成

最后更新于2年前

这有帮助吗?