这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天
今天的录播课程内容比较多,包括并发、进程通信、测试和工程实践。内容较多,因此只对测试部分进行一个简单的总结。
测试是保障软件质量,避免事故的最后一道屏障。软件事故会造成严重的危害,造成经济损失,通过测试能够防止软件事故的发生。
测试一般分为三种:回归测试、集成测试和单元测试。回归测试一般是QA同学通过终端回归一些固定的主流程场景;集成测试是对系统功能维度做测试验证;单元测试测试开发阶段,开发者对单独的函数、模块做功能验证。这三种测试方法从前到后,成本依次降低,测试覆盖率逐步上升。因此单元测试的覆盖率一定程度上决定了代码的质量。
单元测试主要包括输入、测试单元、输出以及校对。单元范围较广,包括接口、函数、模块等。通过最后的校对保证代码的功能与预期一致。
单元测试有命名规范,所有测试文件以_test.go结尾,函数接口为TestXXX(*testing.T),初始化逻辑放到TestMain中。
下面是一个单元测试的代码例子
func HelloTom() string {
return "Jerry"
}
func TestHelloTom(t *testing.T){
output := HelloTom()
expectOutput := "Tom"
if output != expectOutput {
t.Error("Expect %s do not match actual %s", expectOutput, output)
}
}
运行之后可以得到测试结果的输出。
也可以用assert进行测试,可以直接比较输出。
代码覆盖率是衡量测试水准和测试量的概念,使用assert时会直接输出,代码覆盖率体现了通过测试的代码部分与全部代码行数的比例。一般的代码覆盖率在50%-60%,较高覆盖率在80%以上。
单元测试还需要测试工程中复杂项目的依赖,我们的测试在依赖中要保持稳定性和幂等性。我们可以使用Mock进行测试。
Go语言还提供基准测试的框架,用来测试一段程序的运行性能和耗费CPU的程度。