go:测试库testify

303 阅读2分钟

简介

github.com/stretchr/te… 是一个 Go (Golang) 测试工具包,主要提供了两个非常有用的功能来增强标准的 Go 测试库:断言 (assert) 和模拟 (mock)。

以下是关于这个项目的详细介绍:

1. 断言 (assert):

assert 包提供了一组方便的断言函数,用于比较测试中的实际值和预期值。使用这些函数可以简化测试代码并提供更清晰的错误消息。

例如,使用标准的 Go 测试库,你可能会这样写:

if someValue != expectedValue {
    t.Errorf("Expected %v, but got %v", expectedValue, someValue)
}

使用 testify/assert,上述代码可以简化为:

assert.Equal(t, expectedValue, someValue)

assert 提供了许多其他的断言函数,例如 NotNil, True, Contains 等,使测试变得更简洁、易读。

2. 模拟 (mock):

mock 包提供了一种强大的方式来模拟(或伪造)你的依赖关系,使得单元测试变得更加简单。这在当你想要隔离特定的测试部分时特别有用,例如当你想测试的功能依赖于数据库、网络或其他外部资源。

使用 testify/mock, 你可以创建模拟对象,设置期望的方法调用,然后在测试中使用这些对象。测试完成后,你可以验证这些期望是否已经满足。

3. 使用示例:

以下是使用 testify/assert 和 testify/mock 的一个简单示例:

package main

import (
    "testing"

    "github.com/stretchr/testify/assert"
    "github.com/stretchr/testify/mock"
)

// Mock
type MyMockedObject struct {
    mock.Mock
}

func (m *MyMockedObject) DoSomething(number int) (bool, error) {
    args := m.Called(number)
    return args.Bool(0), args.Error(1)
}

// Test
func TestSomething(t *testing.T) {
    // assert functionality
    assert.Equal(t, 123, 123, "they should be equal")

    // mock functionality
    mockObj := new(MyMockedObject)
    mockObj.On("DoSomething", 123).Return(true, nil)

    // now, our mocked object is ready
    something, err := mockObj.DoSomething(123)

    assert.NoError(t, err)
    assert.True(t, something)
    mockObj.AssertExpectations(t)
}

总结:

testify 是 Go 测试生态系统中的一个非常有价值的库,特别是对于希望编写更简洁、表达性更强且易于维护的测试代码的开发者。它提供的断言和模拟功能填补了标准 Go 测试库的一些空白,并在 Go 社区中广受欢迎。