go里面怎么写测试用例

本文详细介绍了如何在Go语言中使用testing框架进行单元测试(T类型)和性能测试(B类型),包括测试文件命名规则、包的命名规范、测试函数命名以及gotest命令的使用方法,强调了测试在代码开发中的重要性。

Go 语言有自带的测试框架testing,可以用来实现单元测试(T 类型)和性能测试(B 类型),通过go test命令来执行单元测试和性能测试。

当你执行go test 测试用例时,是以 go 包为单位进行测试的。执行时需要指定包名,例如go test + 包名,如果没有指定包名,默认会选择执行命令时所在的包。go test 在执行时,会遍历以_test.go结尾的源码文件,执行其中以Test、Benchmark、Example开头的测试函数。

假设我要测试下列文件:

package test

func ArrSort(arr []int) []int {
	n := len(arr)
	for i := 0; i < n-1; i++ {
		// 每一轮将最大值放到数组末尾
		for j := 0; j < n-i-1; j++ {
			if arr[j] > arr[j+1] {
				arr[j], arr[j+1] = arr[j+1], arr[j]
			}
		}
	}
	return arr
}

包的命名

Go 的测试文件名必须以_test.go结尾。例如,如果我们有一个名为array.go的文件,那它的测试文件必须命名为array_test.go。这样做是因为,Go 需要区分哪些文件是测试文件。这些测试文件可以要被 go test 命令行工具加载,用来测试我们编写的代码,但会被 Go 的构建程序忽略掉,因为 Go 程序的运行不需要这些测试代码。

Go 的测试可以分为白盒测试和黑盒测试。
在白盒测试中,Go 的测试包名称需要跟被测试的包名保持一致,举个例子:array.go定义了一个abc包,则array_test.go的包名也要为abc,这也意味着array.go和array_test.go都要在同一个目录中。

然而黑盒测试中,Go 的测试包名称需要跟被测试的包名不同,你也可以存放在同一个目录下。举个例子,array.go定义了一个abc包,则array_test.go的包名需要跟abc不同,通常我们命名为abc_test。

go test 工具的默认白盒测试;使用白盒测试,我们可以测试和使用不可导出的标识符。测试文件和包的命名规范,都会由 Go 语言及 go test 工具来强制约束。

函数的命名

测试用例函数必须以Test、Benchmark、Example开头,例如TestAbc、BenchmarkAbc、ExampleAbc,Abc部分为任意字母数字的组合,首字母大写。这是由 Go 语言和 go test 工具来进行约束的,Abc一般是需要测试的函数名。

变量的命名

Go 中的变量名应该尽量短短而不是长。变量离声明越远,对名称的描述性要求越高。像循环、索引之类的变量,名称可以是单个字母(i)。如果是不常见的变量和全局变量,变量名就需要具有更多的描述性。

单元测试

单元测试用例函数以 Test 开头,例如 TestXxx 或 Test_xxx ( Xxx 部分为任意字母数字组合,首字母大写)。函数参数必须是 *testing.T,可以使用该类型来记录错误或测试状态。我们可以调用 testing.T 的 Error 、Errorf 、FailNow 、Fatal 、FatalIf 方法,来说明测试不通过;调用 Log 、Logf 方法来记录测试信息。例如测试一下上面写的数组排序算法

func TestArrSort(t *testing.T) {
	arr := []int{3,1,2,5,7,4,6}
    got := ArrSort(arr)
    if len(got) == 0 {
        t.Errorf("排序错误")
    }
}

然后运行go test命令来执行如上单元测试用例:

$ go test
PASS
ok      demo/test    0.002s

go test 还支持下面三个参数。
-v,显示所有测试函数的运行细节:

$ go test -v
=== RUN   ArrSort
--- PASS: ArrSort (0.02s)
PASS
ok     demo/test    0.002s

-run < regexp>,指定要执行的测试函数:

$ go test -v -run='TestA.*'
=== RUN   TestArrSort
--- PASS: TestArrSort (0.02s)
PASS
ok      demo/test    0.001s

这样子,我们就只运行了以TestA开头的测试函数。

-count N,指定执行测试函数的次数:

$ go test -v -run='TestA.*' -count=2
=== RUN   TestArrSort
--- PASS: TestArrSort (0.02s)
PASS
ok      demo/test    0.002s

好了,一个简单的测试用例就完成了,这样子可以有效的看到我们自己写的函数的执行速度,方便我们调优。

性能测试

接下来说一下性能测试,
性能测试用例函数必须以Benchmark开头,以*testing.B 作为函数入参,通过 go test -bench 运行。
例如:

func BenchmarkRandInt(b *testing.B) {
    for i := 0; i < b.N; i++ {
        RandInt()  //你自己需要测试的函数名,也可以我上面写的排序函数。
    }
}

go test命令默认不会执行性能测试函数,需要通过指定参数-bench 来运行性能测试函数。-bench后可以跟正则表达式,选择需要执行的性能测试函数,例如go test -bench=“.“表示执行所有的压力测试函数。
开始执行go test -bench=”.

$ go test -bench=".*"
goos: linux
goarch: amd64
pkg: demo/test
BenchmarkRandInt-4      97384827                12.4 ns/op
PASS
ok      demo/test    1.223s

看执行的的结果

BenchmarkRandInt-4,BenchmarkRandInt表示所测试的测试函数名.

4 表示有 4 个 CPU 线程参与了此次测试,默认是GOMAXPROCS的值。

97384827 ,说明函数中的循环执行了97384827次。

12.4 ns/op,说明每次循环的执行平均耗时是 12.8 纳秒,该值越小,说明代码性能越高

测试库的B 类型的性能测试还支持下面 4 个参数。

benchmem,输出内存分配统计:

$ go test -bench=".*" -benchmem
goos: linux
goarch: amd64
pkg: demo/test
BenchmarkRandInt-4      96776823                12.8 ns/op             0 B/op          0 allocs/op
PASS
ok      demo/test    1.255s

你看指定了-benchmem参数后,执行结果中又多了两列:

0 B/op,表示每次执行分配了多少内存(字节),该值越小,说明代码内存占用越小;

0 allocs/op,表示每次执行分配了多少次内存,该值越小,说明分配内存次数越少,意味着代码性能越高。

benchtime,指定测试时间和循环执行次数(格式需要为 Nx,例如 100x):

$ go test -bench=".*" -benchtime=10s # 指定测试时间

$ go test -bench=".*" -benchtime=100x # 指定循环执行次数

cpu,指定 GOMAXPROCS。
timeout,指定测试函数执行的超时时间:

$ go test -bench=".*" -timeout=10s

结语

当我们编写完代码之后,就可以用T类型或者B类型写出符合我们预期的测试用例,这是一个非常好的习惯,对于我们检查代码维护代码有很大的用处。

### ACC自适应巡航控制系统测试用例数量与标准 关于ACC(自适应巡航控制)系统的测试用例数量和标准,可以从多个角度进行分析。通常情况下,测试用例的设计需覆盖功能性需求、安全性需求以及实际应用场景中的各种边界条件。 #### 功能性测试用例 功能性测试主要关注ACC的核心能力,例如速度控制和距离控制。这些测试用例应基于具体的标准和技术规范设计。例如,在《i-VISTA中国智能汽车指数评价体系》中提到的评估方法[^1],明确了针对M1类车辆(整备质量不超过3500kg的载客车辆)的具体测试流程。这一体系提供了详细的测试场景描述,包括但不限于: - 前方无目标车辆时的速度稳定性测试; - 跟随低速或静止目标车辆的能力测试; - 高速下的跟车性能测试; 上述每种情况都可能对应若干具体的测试用例,其总数取决于所需验证的功能细节复杂度。 #### 安全性测试用例 对于涉及功能安全性的部分,则需要依据ISO 26262等相关国际标准来进行深入考量[^2]。特别地,在压力条件下如何表现成为重要考察点之一。比如极端天气状况下传感器精度下降的影响、突然切入切出车道行为处理等等都需要单独设立相应的测试项目加以检验。因此这类特殊情境往往会导致额外增加不少针对性强但独立性强的小型子项作为补充说明材料里列举出来的几种典型例子就很好地体现了这一点——它们分别代表不同层面的要求并共同构成了完整的解决方案框架结构图谱的一部分内容集合体形式呈现出来供大家参考学习使用! 另外值得注意的是,“全速域”版本即所谓的FSR(From Stop To Go)-type ACC除了常规操作外还需额外注意从完全停止状态重新启动过程中的平稳过渡特性是否满足预期效果等问题[^3]。 #### 实际应用环境模拟 最后还有一点不可忽视的就是要尽可能多地还原真实世界里的驾驶情景以便更好地衡量产品最终交付给消费者之后的表现水平到底怎么样?这就意味着我们需要创建大量贴近日常生活的虚拟仿真模型或者是物理原型试验场来反复演练直至找到最佳参数配置组合为止[^4][^5]。 综上所述,虽然无法给出确切的一个固定数值区间用于概括所有类型的ACC系统开发过程中需要用到多少条正式记录下来的官方认可过的标准化文档所规定的条款数目清单列表,但是可以根据实际情况灵活调整规模大小从而确保产品质量始终处于可控范围内不偏离既定轨道太远以至于造成不必要的损失浪费现象发生。 ```python # 示例代码:简单展示如何定义一组基本测试用例 test_cases = [ {"description": "No leading vehicle", "speed_setpoint": 80, "expected_speed": 80}, {"description": "Leading vehicle at constant speed (70 km/h)", "initial_gap": 50, "leading_vehicle_speed": 70, "expected_following_distance": 50}, {"description": "Sudden deceleration of leading vehicle", "deceleration_rate": -5, "reaction_time": 1} ] def run_test(test_case): pass # Implement test logic here for case in test_cases: run_test(case) ``` 相关问题
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BIMCC筑云

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值