测试 | 青训营笔记

120 阅读5分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 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为了保证全局的随机性和并发安全,持有了一把全局锁。