单元测试快速入门 | 学习笔记

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 快速学习单元测试快速入门

开发者学堂课程【Go 语言核心编程 - 面向对象、文件、单元测试、反射、TCP 编程单元测试快速入门】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/626/detail/9742


单元测试快速入门

 

内容介绍

一,单元测试基本介绍

二,单元测试快速入门

三,单元测试快速入门总结

 

一,单元测试基本介绍

Go 语言中自带有一个轻量级的测试框架 testing 和自带的 go test 命 令来实现单元测试和性能测试(性能测试最主要的参考指标,时间,执行一个代码,花费多少时间,本身能把,函数测试时间返回则最方便), testing 框架 和其他语言中的测试框架类似,可以基于这个框架写针对相应函数的测试用例,也可以基于该框架写相应的压力测试用例。通过单元测试,可以解决如下问题:
1)确保每个函数是可运行,并且运行结果是正确的
2)确保写出来的代码性能是好的,
3)单元测试能及时的发现程序设计或实现的逻辑错误,使问题及早暴露,便于问题的定位解决,而性能测试的重点在于发现程序设计上的一些问题,让程序能够在高并发的情况下还能保持稳定.

 

二,单元测试快速入门

使用 Go 的单元测试,对 addUpper 和 sub 函数进行测试。
特别说明:测试时,可能需要暂时退出360。(因为360 可能会认为生成的测试用例程序是木马),接下来演示如何进行单元测试:

package main

Import (
_"fmt"

)

//一个被测试函数

func addupper(n int) int {
res :=θ
for i :=1; i<= n - 1;1++ {
   res += 1
}
return res

//传统的测试方法,就是在 main 函数中使用看看结果是否正确
// res :=  addUpper(10)  // 1.+ 1θ = 55
//if res != 55 {
//fmt . Printf(" addUpper 错误 返回值=%v 期望值=%vn", res, 55)
//} else {
//fmt. Printf(" addUpper 正确 期望值=%vln", res, 55)
package main
import(
"fmt"
"testing" //引入 go 的 testing 框架包
)
//编写要给测试用例,去测试 addUpper 是否正确
func TestAddupper(t *testing.T) {

//调用
res := addupper(1θ)
if res ! = 55 {
//fmt .Printf(" Addupper(1θ) 执行错误,期望值=%v实际值=%v\n", 55, res)
t.Fatalf("Addupper(1θ) 执行错误,期望值=%v 实际值=%v\n", 55, res)
}
//如果正确,输出日志
t.Logf("Addupper(1θ) 执行正确...")

Testing 提供对 Go 包的自动化测试的支持。通过go test 命令,能够自动执行如下形式的任何函数:func TestXxx(*testing.T)
其中 xxx 可以是任何字母数字字符串(但第一一个字母不能是[a-z]) ,用于识别测试例程。
在这些函数中,使用 Error, Fail 或相关方法来发出失败信号。
要编写一个新的测试套件,需要创建-一个名称以_ test.go  结尾的文件,该文件包含 'TestXxx 函数,如上所述。将该文件放在与被测试的包相同的包中。该文件将被排除在正常的程序包之外,但在运行“go test"命令时将被包含。有关详细信息,请运行"go help test"和"go help testtlag"了解。
如果有需要,可以调用*T和*B的Skip方法,跳过该测试或基准测试:
func TestTimeConsuming(t *testing.T) {
if testing. Short() {
t. Skip("skipping test in short mode.")}

T是传递给测试函数的一种类型,它用于管理测试状态并支持格式化测试日志。测试日志会在执行测试的过程中不断累积,并在测试完成时转储至标准输出。
当一个测试的测试函数返回时,又或者当一个测试函数调用 FailINow、Fatal、 Fatalf、 SkipNow、 Skip 或者Skipf中的任意一个时 ,该测试即宣告结束。跟 Parallel方法样,以上提到的这些方法只能在运行测试函数的 goroutine 中调用。
至于其他报告方法,比如 Log 以及 Error 的变种,则可以在多个goroutine 中同时进行调用。

cal.go
函数1
函数2
cal_test.go
对cal.go的函数进行测试 function TestAUpper(t*testing.T)
testing 框架
将  xxx_test.go 的文件引入 import…
main(){
 //调用 Testxxx()函数

package main
import (
"fmt"
”testing" //引入go的 testing 框架包

//编写要给测试用例,去测试 addupper  是否正确
func TestGetsub(t *testing.T) {
//调用
res := getSub(1θ, 3)
if res != 7 {
//fmt. Printf(" Addupper(1θ) 执行错误,期望值=%v实际值=%v\n", 55, res)
t.Fatalf("getSub(1θ, 3)执行锴误,期望值=%v实际值=%v\n", 7, res)

//如果正确,输出日志
t.Logf("getSub(1θ, 3) 执行正确...")

package main
import (
"fmt"
”testing" //引入go的 testing 框架包

//编写要给测试用例,去测试 addupper  是否正确
func TestGetsub(t *testing.T) {
//调用
res := getSub(1, 3)
if res != 55 {
//fmt. Printf(" Addupper(1θ)执行错误,期望值=%v实际值=%v\n", 55, res)
t.Fatalf("getSub(1θ, 3)执行锴误,期望值=%v实际值=%v\n", 7, res)

//如果正确,输出日志
t.Logf("getSub(1θ, 3) 执行正确...")

}
func TestHello(t *testing-T) a
fmt Println("TestHe11o..")

package main
import (
"fmt"
"testing" //引入 go 的 testing 框架包
)
//编写要给测试用例,去测试 addupper  是否正确
func TestGetsub(t *testing.T) {
//调用
res ;= getsub(1θ,3)
if res != 7 {
//fmt . Printf("Addupper(1θ)执行错误,期望值=%v实际值=%v\n", 55, res)
t.Fatalf("getSub(1θ, 3)执行错误,期望值=%v实际值=%v\n", 7, res)
}
//如果正确,输出日志
t.Logf("getSub(1θ, 3)执行正确...")

package main
//一个被测试函数
func addupper(n int) int {
res := θ
for i:= 1;1 <= n - 1; 1++ {
res += i
}
return res
}
//求两个数的查
func getSub(n1 int, n2 int) int {
return n1- n2
}

package cal
import (
"fmt"
”testing" //引入go的 testing 框架包

//编写要给测试用例,去测试 addupper 是否正确
func TestGetsub(t *testing.T) {
//调用
res := getsub(1θ, 3)
if res != 7 {
//fmt. Printf(" Addupper(1θ)执行错误,期望值=%v实际值=%v\n", 55, res)
t.Fatalf("getSub(1θ, 3)执行锴误,期望值=%v实际值=%v\n", 7, res)

//如果正确,输出日志
t.Logf("getSub(1θ, 3) 执行正确!!!!...")

package main
//一个被测试函数
func addupper(n int)   int   {
res :=
for i:= 1;1 <= n; 1++ {
res +=  i
}
return res
}
//求两个数的查
func getSub(n1 int, n2 int) int {
return n1- n2


三,单元测试快速入门总结

1. 测试用例文件名 必须以 test.go  结尾。比如 cal test.go,cal 不是固定的。

2. 测试用例函数必须以 Test 开头,一般来说就是  Test+被测试的函数名,比如esddpperor3) TestAddUpper(t *tesing.T)的形参类型必须是*testing.T

3. 一个测试用例文件中, 可以有多个测试用例函数,比如TestAddUpper、 TestSub5)运行测试用例指令

cmd>go test [如果运行正确,无日志,错误时,会输出日志]

cmd>go test -V [运 行正确或是错误,都输出日志]

4. 当出现错误时,可以使用 t.Fatalf  来格式化输出错误信息,并退出程序

t.Logf  方法可以输出相应的日志

5. 测试用例函数,并没有放在 main 函数中,也执行了,这就是测试用例的方便之处[原理图].

6. PASS 表示测试用 例运行成功,FAIL 表示测试用例运行失败

测试单个文件,一定要带上被测试的原文件go test-v cal test.go cal.go

7. 测试单个方法

go test -V -test.run TestAddUpper

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
Web App开发 JavaScript 前端开发
NB-loT 之通过 Iwm2m 服务器测试 Coap 协议报文 | 学习笔记
快速学习 NB-loT 之通过 Iwm2m 服务器测试 Coap 协议报文
NB-loT 之通过 Iwm2m 服务器测试 Coap 协议报文 | 学习笔记
|
27天前
|
测试技术
自动化测试项目学习笔记(五):Pytest结合allure生成测试报告以及重构项目
本文介绍了如何使用Pytest和Allure生成自动化测试报告。通过安装allure-pytest和配置环境,可以生成包含用例描述、步骤、等级等详细信息的美观报告。文章还提供了代码示例和运行指南,以及重构项目时的注意事项。
129 1
自动化测试项目学习笔记(五):Pytest结合allure生成测试报告以及重构项目
|
27天前
|
测试技术 Python
自动化测试项目学习笔记(四):Pytest介绍和使用
本文是关于自动化测试框架Pytest的介绍和使用。Pytest是一个功能丰富的Python测试工具,支持参数化、多种测试类型,并拥有众多第三方插件。文章讲解了Pytest的编写规则、命令行参数、执行测试、参数化处理以及如何使用fixture实现测试用例间的调用。此外,还提供了pytest.ini配置文件示例。
19 2
|
27天前
|
测试技术 Python
自动化测试项目学习笔记(二):学习各种setup、tearDown、断言方法
本文主要介绍了自动化测试中setup、teardown、断言方法的使用,以及unittest框架中setUp、tearDown、setUpClass和tearDownClass的区别和应用。
49 0
自动化测试项目学习笔记(二):学习各种setup、tearDown、断言方法
|
6月前
|
Java 测试技术 编译器
JMM测试利器-JCStress学习笔记
JMM测试利器-JCStress学习笔记
java202303java学习笔记第四十六天-请求-postman接口测试
java202303java学习笔记第四十六天-请求-postman接口测试
77 0
|
测试技术
java202304java学习笔记第六十天-ssm-spring配置文件-完善测试环境
java202304java学习笔记第六十天-ssm-spring配置文件-完善测试环境
76 0
|
存储 关系型数据库 测试技术
快速入门nest.js(10/10)--测试
初识Jest 很好的错误消息和内置Mocking实用程序 可靠的并行运行测试 优先运行以前失败的测试 根据测试文件花费的时间重新组织测试运行
326 0
|
存储 Kubernetes 监控
PolarDB-X 混沌测试系统搭建赛题解析 | 学习笔记
快速学习 PolarDB-X 混沌测试系统搭建赛题解析
PolarDB-X 混沌测试系统搭建赛题解析 | 学习笔记
|
关系型数据库 OLAP API
测试 API|学习笔记
快速学习测试 API
135 0
测试 API|学习笔记