这是我参与「第五届青训营 」伴学笔记创作活动的第 10 天
前言
大家好呀,这是我参加青训营伴学笔记创作活动的第 10 天,如存在问题,烦请各位斧正!
其中有一些关键图片超过了最大字符限制,不能上传了,我都使用特殊标记给它标记出来了,如有需要,请联系我。
概述
回归测试:通过终端回归特定主流场景,比如刷新抖音。
集成测试:对系统功能逻辑验证,比如对服务暴露的某个接口进行自动化测试。
单元测试:开发者对单独的函数模块进行验证。
什么是软件测试:使⽤技术⼿段验证软件是否满⾜需求
软件测试目的:减少软件缺陷(bug),保障软件质量!
测试主流技术
1**、功能测试**
说明:功能测试主要验证程序的功能是否满足需求
2**、⾃动化测试**
说明:使用代码或工具代替手工,对项目进行测试
3**、接⼝测试**
说明:使用代码或工具对服务端提供的接口进行测试
4**、性能测试**
说明:模拟多人使用软件,查找服务器缺陷。
单元测试
概述
说明:针对程序源代码进⾏测试(单元:最⼩独⽴功能代码段)
提示:
1、国内单元测试⼀般开发⾃测
2、单元测试可以解决-快速定位缺陷
3、提⾼测试执⾏效率
集成测试
说明:针对单元与单元之间的接⼝进⾏测试
提示:⼜称接⼝测试。
系统测试
说明:针对系统整体功能+兼容+⽂档(说明、安装⽂档)
验收测试
内测:公司内部⼈员使⽤,发觉缺陷并修复。
公测:让⽤户帮忙测试 提示:验收测试,⼀般要根据项⽬类型决定是否使⽤
规则
1)在Go语言中,单元测试使用gotest命令。 所有测试文件以_test.go结尾。
2)_test.go主要有三种类型,分别是测试函数、基准函数、示例函数。
(1)测试函数的函数名前缀是Test,目的是测试程序的逻辑性。如:
<超过最大字符限制>
(2)基准函数的函数名前缀是Benchmark,目的是测试程序的性能。
(3)示例函数的函数名前缀是Example,目的是写一些示例文档。
3)初始化逻辑放到 TestMain中
<超过最大字符限制>
测试函数-检测覆盖率
1、为什么需要覆盖率
1)覆盖率可以衡量代码是否经过了足够的测试
2)覆盖率可以评价项目的测试水准
3)覆盖率可以评估项目是否达到了高水准测试等级
2、基本用法
1)在终端输入: "
go test judgment.go judgment_test.go --cover" 进行覆盖率测试。2)举例:比如测试分数是否及格的函数,大于60分及格则返回true,若单元测试只测试了不及格的情况,则覆盖率就无法达到百分之百了。
3)可视化体现覆盖率的方法:
(1)生成覆盖率输出文件:
go test judgment.go judgment_test.go --cover -coverprofile=c.out(2)再通过go tool生成可视化html结果:
go tool cover -html=c
单元测试小技巧
1)对于一般覆盖率:50%~60%,较高覆盖率80%+。(例如支付等容错低的模块)
2)测试分支:应该做到相互独立、全面覆盖
3)测试粒度:测试单元的粒度要足够小,每个函数做到单一职责
基准测试
1、概述
1)基准测试主要的目的就是为了测试已有函数,优化执行性能。
2)且go内置的测试框架,提供了进行基准测试的能力。
基本参数说明-un用于单次测试,一般用于代码逻辑验证
- bench=.执行所有 Benchmark,也可以通过用例函数名来指定部分测试用例
- benchtime指定测试执行时长
- cpuprofile输出cpu的 pprof信息文件
- reprofile输出heap的ppro信息文件
- blockprofile阻塞分析,记录 goroutine阻塞等待同步(包括定时器通道)的位置
- mutexprofile互斥锁分析,报告互斥锁的竞争情况
2、基本使用
1)如下两个案例:
<超过最大字符限制>
2)测试结果:
<超过最大字符限制>
3)代码与测试结果讲解:
基准测试以 Benchmark开头入参是 testing.B,
用b中的N值反复递增循环测试
(对一个测试用例的默认测试时间是1秒,当测试用例函数返回时还不到1秒,
那么tes中的N值将按1、2、5、10、20,、50.…递增,并以递增后的值重新进行用例函数测试。)
而对于图中的20698326代表的是测试的执行次数,4
9.95代表的平均一次执行(op)花费了499的时间(ns)Resettimer为重置计时器,
因为在测试主要流程前的准备工作,不应该作为基准测试的范围。
Run Parallel为多协程并发测试,测试了这两个测试后,我们发现在并发的case下,
性能存在劣化,主要原因是rand为了保证全局的随机性和并发安全,持有了一把全局锁。