版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Go语言的测试与性能Go语言从入门到精通了解Go语言中的功能测试01FUNCTION02PERFORMANCEtarget目标了解Go语言中的性能测试目录导航17.1功能测试Contents功能测试
功能测试在编程开发中是指对某些具体功能进行针对性的测试以确认该功能是否被正确地实现当功能测试针对的是较小的代码单位,例如包、对象类甚至是函数时,一般也称作“单元测试”功能测试的目的功能测试主要测试功能是否正常实现,是否存在代码错误(一般常简称为“bug”)导致程序运行结果异常甚至崩溃,是否对于指定的输入一定会得到预期的输出等测试用例功能测试一般会针对某个功能设计一个或多个“测试用例”(testcase或usecase)
每个测试用例中有指定的输入和预期的输出
执行测试的过程:依次(顺序)或并行执行每个测试用例,并记录结果,最终形成完整的测试报告Go语言中测试代码的写法每个包中可以有专门用于测试的代码文件,这些文件必须以“_test”作为文件名的结尾在该包的目录下使用“gotest”命令时,会运行该目录下所有符合条件的测试代码文件进行测试
每个测试代码文件中不能有主函数,所有测试用例的函数需要以“Test”开始,并且后面的第一个字符不能是小写字符测试代码示例:tools_test.gopackage
tools
import
(
"testing")
func
TestGenerateRandomStringX(t
*testing.T)
{
rs
:=
GenerateRandomStringX(5,
8,
true,
true,
true,
false,
false,
false)
t.Logf("随机字符串:%v",
rs)}测试效果用于测试的错误代码//
StringToInt
转换字符串为整数func
StringToInt(strA
string)
(int,
error)
{
nT,
errT
:=
strconv.ParseInt(strA,
0,
0)
if
errT
!=
nil
{
return
0,
errT
}
return
int(nT),
nil}功能测试不通过的情况func
TestStrToInt(t
*testing.T)
{
n1,
errT
:=
StringToInt("12")
if
errT
==
nil
&&
n1
!=
12
{
t.Logf("测试失败:n1为%v(预期值:%v)",
n1,
12)
t.Fail()
}
n2,
errT
:=
StringToInt("012")
if
errT
==
nil
&&
n2
!=
12
{
t.Logf("测试失败:n2为%v(预期值:%v)",
n2,
12)
t.Fail()
}
n3,
errT
:=
StringToInt("ABZ")
if
errT
==
nil
{
t.Logf("测试失败:errT为nil(预期应不为nil),n3为%v",
n3)
t.Fail()
}}功能测试不通过的效果C:\goprjs\src\tools>gotest-v===RUNTestGenerateRandomStringX---PASS:TestGenerateRandomStringX(0.00s)tools_test.go:10:随机字符串:94mxd8===RUNTestStrToInt---FAIL:TestStrToInt(0.00s)tools_test.go:25:测试失败:n2为10(预期值:12)FAILexitstatus1FAILtools0.045s立即中止测试用例函数func
TestStrToInt(t
*testing.T)
{
n1,
errT
:=
StringToInt("12")
if
errT
==
nil
&&
n1
!=
12
{
t.Logf("测试失败:n1为%v(预期值:%v)",
n1,
12)
t.Fail()
}
n2,
errT
:=
StringToInt("012")
if
errT
==
nil
&&
n2
!=
12
{
t.Logf("测试失败:n2为%v(预期值:%v)",
n2,
12)
t.FailNow()
}
n3,
errT
:=
StringToInt("ABZ")
if
errT
==
nil
{
t.Logf("测试失败:errT为nil(预期应不为nil),n3为%v",
n3)
t.Fail()
}}立即中止测试用例函数-2func
TestStrToInt(t
*testing.T)
{
n1,
errT
:=
StringToInt("12")
if
errT
==
nil
&&
n1
!=
12
{
t.Errorf("测试失败:n1为%v(预期值:%v)",
n1,
12)
}
n2,
errT
:=
StringToInt("012")
if
errT
==
nil
&&
n2
!=
12
{
t.Fatalf("测试失败:n2为%v(预期值:%v)",
n2,
12)
}
n3,
errT
:=
StringToInt("ABZ")
if
errT
==
nil
{
t.Errorf("测试失败:errT为nil(预期应不为nil),n3为%v",
n3)
}
}跳过测试用例T.SkipNow函数相当于先调用T.Log再调用T.SkipNow函数T.Skipf函数,相当于先调用T.Logf再调用T.SkipNow函数进行并发测试-1func
TestStrToIntParallel(t
*testing.T)
{
for
i
:=
0;
i
<
1000000;
i++
{
n1
:=
rand.Intn(500)
n2,
errT
:=
StringToInt(IntToString(n1))
if
errT
!=
nil
{
t.Fatalf("测试失败:n1的值为%v,n2的值为%v,
errT为%v",
n1,
n2,
errT)
}
if
n1
!=
n2
{
t.Fatalf("测试失败:n1的值为%v,n2的值为%v",
n1,
n2)
}
}}进行并发测试-2func
Test001(t
*testing.T)
{
t.Parallel()
for
i
:=
0;
i
<
5;
i++
{
t.Run("并发测试",
TestStrToIntParallel)
}}
func
Test002(t
*testing.T)
{
t.Parallel()
for
i
:=
0;
i
<
5;
i++
{
t.Run("并发测试",
TestStrToIntParallel)
}}T.Parallel与T.Run结合使用在测试用例函数中调用T.Parallel函数的作用是声明该测试用例函数可以与其他测试用例函数并发执行
T.Run函数可以调用另一个测试用例函数作为它的子测试用例,并等待该子测试用例执行完毕再继续执行其他代码指定运行的测试用例gotestgotest-run=gotest-run=.gotest-run=Test0gotest-run=00\d目录导航17.2性能测试Contents基本的性能测试–待测试函数//
CalPi
是使用随机落点法计算圆周率Π值的函数//
一般来说,输入参数pointCountA的值越大,计算结果越准,但耗费时间也越多func
CalPi(pointCountA
int)
float64
{
inCircleCount
:=
0
var
x,
y
float64
var
Pi
float64
for
i
:=
0;
i
<
pointCountA;
i++
{
x
=
rand.Float64()
y
=
rand.Float64()
if
x*x+y*y
<
1
{
inCircleCount++
}
}
Pi
=
(4.0
*
float64(inCircleCount))
/
float64(pointCountA)
return
Pi}基本的性能测试–进行测试package
tools
import
(
"testing")
func
BenchmarkCalPi(b
*testing.B)
{
for
i
:=
1;
i
<
b.N;
i++
{
rs
:=
CalPi(i)
b.Logf("Pi值:%v",
rs)
}}基本的性能测试–测试效果C:\goprjs\src\tools>gotest-v-bench=.-run=Benchmarkgoos:windowsgoarch:amd64pkg:toolsBenchmarkCalPi-810000226170ns/op---BENCH:BenchmarkCalPi-8benchmark_test.go:10:Pi值:0benchmark_test.go:10:Pi值:4benchmark_test.go:10:Pi值:4benchmark_test.go:10:Pi值:4benchmark_test.go:10:Pi值:2.4benchmark_test.go:10:Pi值:4benchmark_test.go:10:Pi值:4benchmark_test.go:10:Pi值:2benchmark_test.go:10:Pi值:3.5555555555555554benchmark_test.go:10:Pi值:3.6...[outputtruncated]PASSoktools2.314s根据性能测试结果进行优化和比对//
CalPiX
是使用随机落点法计算圆周率Π值的函数//
与CalPi唯一的不同是使用了更快的随机数发生器//
但有可能不是并发安全的,建议仅在单线程中使用func
CalPiX(pointCountA
int)
float64
{
inCircleCount
:=
0
var
x,
y
float64
var
Pi
float64
r
:=
tk.NewRandomGenerator()
for
i
:=
0;
i
<
pointCountA;
i++
{
x
=
r.Float64()
y
=
r.Float64()
if
x*x+y*y
<
1
{
inCircleCount++
}
}
Pi
=
(4.0
*
float64(inCircleCount))
/
float64(pointCountA)
return
Pi}效果C:\goprjs\src\tools>gotest-v-bench=.-run=Benchmarkgoos:windowsgoarch:amd64pkg:toolsBenchmarkCalPi-810000223870ns/op---BENCH:BenchmarkCalPi-8benchmark_test.go:10:Pi值:0benchmark_test.go:10:Pi值:4benchmark_test.go:10:Pi值:2.4benchmark_test.go:10:Pi值:2benchmark_test.go:10:Pi值:3.5555555555555554benchmark_test.go:10:Pi值:3.6...[outputtruncated]BenchmarkCalPiX-830000132331ns/op---BENCH:BenchmarkCalPiX-8benchmark_test.go:17:Pi值:0benchmark_test.go:17:Pi值:1benchmark_test.go:17:Pi值:1.6benchmark_test.go:17:Pi值:2benchmark_test.go:17:Pi值:1.7142857142857142benchmark_test.go:17:Pi值:2.2222222222222223...[outputtruncated]PASSoktools6.716s指定性能测试的时长gotest-v-bench=.-run=Benchmark-benchtime=5s手动控制测试计时testing.B对象的ResetTimer、StartTimer、StopTimer函数测试内存分配的情况//
Fibonacci
计算斐波那契数列func
Fibonacci(c
int64)
int64
{
if
c
<
2
{
return
c
}
return
Fibonacci(c-2)
+
Fibonacci(c-1)}func
BenchmarkFibo38(b
*testing.B)
{
rs
:=
Fibonacci(38)
b.Logf("斐波那契38结果值:%v",
rs)}
func
BenchmarkFibo48(b
*testing.B)
{
rs
:=
Fibonacci(48)
b.Logf("斐波那契48结果值:%v",
rs)}测试效果C:\goprjs\src\tools>gotest-v-bench=Fibo-run=Benchmark-benchmemgoos:windowsgoarch:amd64pkg:toolsBenchmarkFibo38-810000000000.25ns/op0B/op0allocs/op---BENCH:BenchmarkFibo38-8benchmark_test.go:23:斐波那契38结果值:39088169benchmark_test.go:23:斐波那契38结果值:39088169benchmark_test.g
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论