go的测试编写、断言、性能测试

本文涉及的产品
性能测试 PTS,5000VUM额度
简介: go的测试编写、断言、性能测试

一、要点

源文件以_test结尾:xxx_test.go

测试方法名以Test开头:func TestXXX(t *testing.T){...}

二、例子

package constant_test
 
import "testing"
 
const (
  Monday = iota + 1
  Tuesday
  Wednesday
)
const (
  Readable = 1 << iota
  Writable
  Executable
)
 
func TestConstantTry(t *testing.T) {
  t.Log(Monday, Tuesday, Wednesday)
}
 
func TestConstantTry1(t *testing.T) {
  a := 7 //o111
  t.Log(a&Readable == Readable, a&Writable == Writable, a&Executable == Executable)
}
 
 
=== RUN   TestConstantTry
    constant_try_test.go:17: 1 2 3
--- PASS: TestConstantTry (0.00s)
=== RUN   TestConstantTry1
    constant_try_test.go:22: true true true
--- PASS: TestConstantTry1 (0.00s)
PASS
package fib
 
import (
  "fmt"
  "testing"
)
 
//菲波拉数列 变量赋值
func TestFibList(t *testing.T) {
  //var a int = 1
  //var b int = 1
  //var(
  //  a int=1
  //  b=1
  //)
  a := 1
  b := 1
  fmt.Print(a, " ")
  for i := 0; i < 5; i++ {
    fmt.Print(" ", b)
    tem := a
    a = b
    b = tem + a
  }
  fmt.Println()
}
 
func TestExchange(t *testing.T) {
  a := 1
  b := 2
  a, b = b, a
  t.Log(a, b)
}
 
=== RUN   TestFibList
1  1 2 3 5 8
--- PASS: TestFibList (0.00s)
=== RUN   TestExchange
    fib_test.go:32: 2 1
--- PASS: TestExchange (0.00s)
PASS
package try_test
 
import "testing"
 
func TestFirstTry(t *testing.T) {
  t.Log("My first try!")
}
=== RUN   TestFirstTry
    first_test.go:6: My first try!
--- PASS: TestFirstTry (0.00s)
PASS

三、Fail、Fatal

package testing
 
func square(op int) int {
  return op * op
}
package testing
 
import (
  "fmt"
  "testing"
)
 
//Fail,Error:该测试失败,该测试继续,其他测试继续执行
//FailNow,Fatal:该测试失败,该测试中止,其他测试继续执行
func TestSquare(t *testing.T) {
  inputs := [...]int{1, 2, 3}
  expected := [...]int{1, 2, 3}
  for i := 0; i < len(inputs); i++ {
    ret := square(inputs[i])
    if ret != expected[i] {
      t.Errorf("iput is %d,the expected is %d,the actual %d", inputs[i], expected[i], ret)
    }
  }
}
 
func TestErrorInCode(t *testing.T) {
  fmt.Println("start")
  t.Error("Error")
  fmt.Println("end")
}
 
func TestFailInCode(t *testing.T) {
  fmt.Println("start")
  t.Fatal("Error")
  fmt.Println("end")
}
=== RUN   TestSquare
    function_test.go:16: iput is 2,the expected is 2,the actual 4
    function_test.go:16: iput is 3,the expected is 3,the actual 9
--- FAIL: TestSquare (0.00s)
 
=== RUN   TestErrorInCode
start
    function_test.go:23: Error
end
--- FAIL: TestErrorInCode (0.00s)
 
=== RUN   TestFailInCode
start
    function_test.go:29: Error
--- FAIL: TestFailInCode (0.00s)
 
FAIL

四、代码测试覆盖率

go test -v -cover

五、断言

安装依赖

go get -u github.com/stretchr/testify/assert

//使用断言
func TestSquareWithAssert(t *testing.T) {
  inputs := [...]int{1, 2, 3}
  expected := [...]int{1, 4, 9}
  for i := 0; i < len(inputs); i++ {
    ret := square(inputs[i])
    assert.Equal(t, expected[i], ret)
  }
}
=== RUN   TestSquareWithAssert
--- PASS: TestSquareWithAssert (0.00s)
PASS

六、Benchmark性能测试

func BenchmarkConcatStringByAdd(b *testing.B) {
 
  elems := []string{"1", "2", "3", "4", "5"}
  b.ResetTimer()
  for i := 0; i < b.N; i++ {
    ret := ""
    for _, elem := range elems {
      ret += elem
    }
  }
  b.StopTimer()
}
func BenchmarkConcatStringByBytesBuffer(b *testing.B) {
  elems := []string{"1", "2", "3", "4", "5"}
  b.ResetTimer()
  for i := 0; i < b.N; i++ {
    var buf bytes.Buffer
    for _, elem := range elems {
      buf.WriteString(elem)
    }
  }
  b.StopTimer()
}

使用bytes.Buffer处理字符串,性能更优。

goos: windows
goarch: amd64
pkg: jike_introduction/src/ch35/benchmark
cpu: AMD Ryzen 7 4800H with Radeon Graphics
BenchmarkConcatStringByAdd
BenchmarkConcatStringByAdd-16           10294040               117.0 ns/op
PASS
 
goos: windows
goarch: amd64
pkg: jike_introduction/src/ch35/benchmark
cpu: AMD Ryzen 7 4800H with Radeon Graphics
BenchmarkConcatStringByBytesBuffer
BenchmarkConcatStringByBytesBuffer-16           16814658                70.41 ns
/op
PASS

七、BDD

安装依赖

go get -u github.com/smartystreets/goconvey/convey

测试编码

import (
  . "github.com/smartystreets/goconvey/convey"
  "testing"
)
 
func TestSpec(t *testing.T) {
  Convey("Given 2 even number", t, func() {
    a := 2
    b := 4
    Convey("when add two numbers", func() {
      c := a + b
      Convey("Then the result is still even", func() {
        So(c%2, ShouldEqual, 0)
      })
    })
  })
}

运行结果

=== RUN   TestSpec
.
1 total assertion
 
--- PASS: TestSpec (0.00s)
PASS
修改数值,错误结果
=== RUN   TestSpec
x
Failures:
 
  * F:/myCode/goland/jike_introduction/src/ch36/bdd/bdd_spec_test.go 
  Line 15:
  Expected: '0'
  Actual:   '1'
  (Should be equal)
 
 
1 total assertion
 
--- FAIL: TestSpec (0.00s)
 
FAIL

相关实践学习
通过性能测试PTS对云服务器ECS进行规格选择与性能压测
本文为您介绍如何利用性能测试PTS对云服务器ECS进行规格选择与性能压测。
相关文章
|
21天前
|
数据采集 监控 机器人
浅谈网页端IM技术及相关测试方法实践(包括WebSocket性能测试)
最开始转转的客服系统体系如IM、工单以及机器人等都是使用第三方的产品。但第三方产品对于转转的业务,以及客服的效率等都产生了诸多限制,所以我们决定自研替换第三方系统。下面主要分享一下网页端IM技术及相关测试方法,我们先从了解IM系统和WebSocket开始。
37 4
|
1月前
|
数据库连接 Go 数据库
Go语言中的错误注入与防御编程。错误注入通过模拟网络故障、数据库错误等,测试系统稳定性
本文探讨了Go语言中的错误注入与防御编程。错误注入通过模拟网络故障、数据库错误等,测试系统稳定性;防御编程则强调在编码时考虑各种错误情况,确保程序健壮性。文章详细介绍了这两种技术在Go语言中的实现方法及其重要性,旨在提升软件质量和可靠性。
34 1
|
1月前
|
数据采集 缓存 测试技术
性能测试中,除了迭代次数,还有哪些因素会影响测试结果?
性能测试中,除了迭代次数,还有哪些因素会影响测试结果?
36 2
|
1月前
|
测试技术 数据库连接 数据库
测试脚本的编写和维护对性能测试结果有何影响?
测试脚本的编写和维护对性能测试结果有着至关重要的影响,
29 1
|
1月前
|
缓存 监控 测试技术
全网最全压测指南!教你如何测试和优化系统极限性能
大家好,我是小米。本文将介绍如何在实际项目中进行性能压测和优化,包括单台服务器和集群压测、使用JMeter、监控CPU和内存使用率、优化Tomcat和数据库配置等方面的内容,帮助你在高并发场景下提升系统性能。希望这些实战经验能助你一臂之力!
91 3
|
1月前
|
测试技术 Go
go语言中测试工具
【10月更文挑战第22天】
33 4
|
1月前
|
缓存 监控 数据挖掘
C# 一分钟浅谈:性能测试与压力测试
【10月更文挑战第20天】本文介绍了性能测试和压力测试的基础概念、目的、方法及常见问题与解决策略。性能测试关注系统在正常条件下的响应时间和资源利用率,而压力测试则在超出正常条件的情况下测试系统的极限和潜在瓶颈。文章通过具体的C#代码示例,详细探讨了忽视预热阶段、不合理测试数据和缺乏详细监控等常见问题及其解决方案,并提供了如何避免这些问题的建议。
59 7
|
3月前
|
缓存 Java 测试技术
谷粒商城笔记+踩坑(11)——性能压测和调优,JMeter压力测试+jvisualvm监控性能+资源动静分离+修改堆内存
使用JMeter对项目各个接口进行压力测试,并对前端进行动静分离优化,优化三级分类查询接口的性能
120 10
谷粒商城笔记+踩坑(11)——性能压测和调优,JMeter压力测试+jvisualvm监控性能+资源动静分离+修改堆内存
|
1月前
|
NoSQL 测试技术 Go
自动化测试在 Go 开源库中的应用与实践
本文介绍了 Go 语言的自动化测试及其在 `go mongox` 库中的实践。Go 语言通过 `testing` 库和 `go test` 命令提供了简洁高效的测试框架,支持单元测试、集成测试和基准测试。`go mongox` 库通过单元测试和集成测试确保与 MongoDB 交互的正确性和稳定性,使用 Docker Compose 快速搭建测试环境。文章还探讨了表驱动测试、覆盖率检查和 Mock 工具的使用,强调了自动化测试在开源库中的重要性。
|
3月前
|
监控 中间件 测试技术
『软件测试5』测开岗只要求会黑白盒测试?NO!还要学会性能测试!
该文章指出软件测试工程师不仅需要掌握黑盒和白盒测试,还应该了解性能测试的重要性及其实现方法,包括负载测试、压力测试等多种性能测试类型及其在保证软件质量中的作用。
『软件测试5』测开岗只要求会黑白盒测试?NO!还要学会性能测试!