《Go语言从入门到精通》Go语言的测试与性能_第1页
《Go语言从入门到精通》Go语言的测试与性能_第2页
《Go语言从入门到精通》Go语言的测试与性能_第3页
《Go语言从入门到精通》Go语言的测试与性能_第4页
《Go语言从入门到精通》Go语言的测试与性能_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

提交评论