golang轻量级专业测试框架插件库is的使用

golang轻量级专业测试框架插件库is的使用

is是一个专业的轻量级Go测试迷你框架,具有以下特点:

  • 易于编写和阅读
  • 简洁优雅的API,提供所有你需要的功能:is.Equalis.Trueis.NoErris.Fail
  • 可以使用注释添加描述(测试失败时会显示)

使用示例

以下代码展示了如何使用is的各种辅助方法:

func Test(t *testing.T) {
    // 创建is实例
    is := is.New(t)
    
    // 测试函数返回值和错误
    signedin, err := isSignedIn(ctx)
    is.NoErr(err)            // isSignedIn error
    is.Equal(signedin, true) // must be signed in
    
    // 测试字符串包含
    body := readBody(r)
    is.True(strings.Contains(body, "Hi there"))
}

完整示例demo

package main

import (
    "testing"
    "github.com/matryer/is"
)

// 被测函数示例
func Add(a, b int) int {
    return a + b
}

func TestAdd(t *testing.T) {
    is := is.New(t)
    
    // 测试加法
    result := Add(2, 3)
    is.Equal(result, 5) // 2+3应该等于5
    
    // 测试边界情况
    result = Add(0, 0)
    is.Equal(result, 0) // 0+0应该等于0
    
    // 测试负数
    result = Add(-1, 1)
    is.Equal(result, 0) // -1+1应该等于0
}

func TestStringContains(t *testing.T) {
    is := is.New(t)
    
    str := "Hello, world"
    is.True(strings.Contains(str, "world")) // 字符串应包含"world"
    is.True(!strings.Contains(str, "foo"))  // 字符串不应包含"foo"
}

错误输出

测试失败时的输出非常易于阅读:

Examples of failures

颜色设置

要关闭颜色输出,可以使用以下两种方式之一:

  1. 使用-nocolor标志:
go test -nocolor
  1. 设置NO_COLOR环境变量:
NO_COLOR=1 go test

is测试框架提供了简单直观的API,让测试代码更易于编写和维护,是Go项目测试的理想选择。


更多关于golang轻量级专业测试框架插件库is的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang轻量级专业测试框架插件库is的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Golang轻量级测试框架is的使用指南

is是一个极简的Go测试断言库,它提供了简单直观的API来编写测试断言,相比标准库的testing包提供了更友好的错误输出和更简洁的语法。

安装

go get github.com/matryer/is

基本用法

package main

import (
	"testing"
	"github.com/matryer/is"
)

func TestAddition(t *testing.T) {
	is := is.New(t)
	
	result := 2 + 2
	
	is.Equal(result, 4)        // 断言相等
	is.True(result == 4)       // 断言为true
	is.NoErr(nil)              // 断言无错误
}

func TestString(t *testing.T) {
	is := is.New(t)
	
	str := "hello world"
	
	is.True(len(str) > 5)      // 长度大于5
	is.Equal(str, "hello world") // 字符串相等
}

主要API方法

相等性断言

is.Equal(a, b)  // a == b
is.Equal(1+1, 2)
is.Equal("hello", "hello")

错误处理

is.NoErr(err)    // err == nil
is.Err(err)      // err != nil

布尔断言

is.True(condition)  // condition == true
is.False(condition) // condition == false

空值检查

is.Nil(val)    // val == nil
is.NotNil(val) // val != nil

高级用法

自定义消息

is := is.NewRelaxed(t) // 使用NewRelaxed可以自定义消息

is.Equal(1, 2, "expected 1 to equal 2")

测试HTTP处理程序

func TestHTTPHandler(t *testing.T) {
	is := is.New(t)
	
	handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		w.WriteHeader(http.StatusOK)
		w.Write([]byte("OK"))
	})
	
	req := httptest.NewRequest("GET", "/", nil)
	w := httptest.NewRecorder()
	
	handler.ServeHTTP(w, req)
	
	resp := w.Result()
	
	is.Equal(resp.StatusCode, http.StatusOK)
	body, err := io.ReadAll(resp.Body)
	is.NoErr(err)
	is.Equal(string(body), "OK")
}

测试并发代码

func TestConcurrentMap(t *testing.T) {
	is := is.New(t)
	
	m := make(map[int]int)
	var mu sync.Mutex
	
	var wg sync.WaitGroup
	for i := 0; i < 100; i++ {
		wg.Add(1)
		go func(i int) {
			defer wg.Done()
			mu.Lock()
			defer mu.Unlock()
			m[i] = i * i
		}(i)
	}
	wg.Wait()
	
	is.Equal(len(m), 100)
	is.Equal(m[10], 100)
}

与标准库对比

标准库写法:

if got != want {
	t.Errorf("got %v, want %v", got, want)
}

is库写法:

is.Equal(got, want)

为什么选择is

  1. 简洁性 - 减少样板代码
  2. 可读性 - 测试意图更清晰
  3. 友好错误 - 自动生成详细的错误信息
  4. 轻量级 - 不引入复杂依赖

注意事项

  1. is库不提供mock功能,需要结合其他库如testify/mock使用
  2. 对于复杂断言,可能需要编写自定义辅助函数
  3. 适用于单元测试和小型项目,大型项目可能需要更全面的测试框架

is库是Go测试生态中一个简单高效的选择,特别适合喜欢简洁风格的开发者。

回到顶部