Golang Go语言中的测试踩坑

Golang Go语言中的测试踩坑

一直在用 testify 写测试,它算是所有测试库里面比较简单可依赖的。然而它还是有些多年没解决的问题。比如比较时间的大小( v2 才支持了,还在开发中)。

比如下面的代码,看上去很正常,但是其实会触发 testify 的 bug:

import (
	"testing"
"github.com/stretchr/testify/suite"

)

func Test(t *testing.T) { suite.Run(t, &Suite{}) }

type Suite struct { suite.Suite }

func (s *Suite) TestA() { s.T().Parallel() s.Equal(2, 1) }

func (s *Suite) TestB() { s.T().Parallel() }

具体的讨论可以看这里: https://github.com/stretchr/testify/issues/187

testify 之所以有这个问题,核心原因是它的设计会导致 Suite 在多个子测试中被竞争。 为了处理这个问题写了个轻量的库,无任何依赖可以用来替代 testify 的 suite,配合 testify 的 assert 的用法如下:

import (
	"testing"
	"time"
"github.com/stretchr/testify/assert"
"github.com/ysmood/got"

)

func Test(t *testing.T) { got.Each(t, beforeEach) }

func beforeEach(t *testing.T) Suite { t.Parallel() return Suite{assert.New(t)} }

type Suite struct { // struct that holds subtests *assert.Assertions }

func (s Suite) A() { // test case A time.Sleep(time.Second) s.Equal(1, 1) }

func (s Suite) B() { // test case B time.Sleep(time.Second) s.Equal(2, 1) }

也可以独立使用,用来做一些简单的测试应该会很顺手,不需要写一堆 Test 前缀和 t *testing.T 了:

import (
	"testing"
"github.com/ysmood/got"

)

func Test(t *testing.T) { got.Each(t, S{}) }

type S struct { got.Assertion }

func (s S) A() { s.Eq(1, 1) }

func (s S) B() { s.Gt(2, 1) }

项目地址: https://github.com/ysmood/got


更多关于Golang Go语言中的测试踩坑的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

没有看太懂…

更多关于Golang Go语言中的测试踩坑的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Golang(Go语言)中的测试阶段,确实可能会遇到一些“坑”。以下是一些常见的测试问题及建议:

  1. 测试环境配置

    • 确保测试环境的硬件和软件配置与生产环境尽量一致,包括CPU、内存、磁盘以及操作系统等。
    • 对于高并发场景的测试,可以使用负载均衡器来模拟真实的流量分发。
  2. 并发测试

    • Go语言支持并发,测试时需要确保goroutine之间的协调和通信正确无误。
    • 注意避免数据竞争、死锁和活锁等问题。
  3. 内存管理

    • 尽管Go语言有垃圾回收机制,但在测试中仍需关注内存的使用情况,避免内存泄漏和不必要的内存分配。
    • 合理使用内存池和GC机制,提高测试的准确性。
  4. 错误处理

    • 测试代码中需要包含对错误情况的处理,并添加错误日志,以便更好地评估测试结果。
  5. 测试工具选择

    • 可以使用ApacheBench(AB)工具进行基本的压力测试。
    • 使用wrk工具进行更为复杂的性能测试,支持设置请求头、自定义请求流量模式等。
  6. 测试代码编写

    • 编写合理的测试代码,包括并发请求的处理、内存管理、错误处理等。

总之,进行Golang测试时,需要关注环境配置、并发问题、内存管理、错误处理等多个方面。通过合理选择测试工具、编写合理的测试代码,可以有效避免测试中的“坑”,提高测试质量和效率。

回到顶部