测试|青训营

107 阅读2分钟

测试

img_18.png

从上到下,覆盖率逐层变大,成本却逐层降低,这就是测试金字塔的思想。

  • 回归测试:回归测试是QA手动通过终端回归一些固定的主流程场景
  • 集成测试:集成测试是在CI/CD流程中,对系统功能维度进行测试,保证系统功能的正确性
  • 单元测试:单元测试是在开发阶段,对代码逻辑进行测试,保证代码的正确性

1. 单元测试

img_21.png

  • 单元测试规则
    • 测试用例文件名必须以_test.go结尾
    • func TestXxx(*testing.T)
    • 初始化逻辑放到TestMain(m *testing.M)中

例如:

  • judgment.go
package test

func JudgePassLine(score int16) bool {
	if score >= 60 {
		return true
	}
	return false
}
  • judgment_test.go
package test

import (
	"github.com/stretchr/testify/assert"
	"testing"
)

func TestJudgePassLineTrue(t *testing.T) {
	isPass := JudgePassLine(70)
	//assert是断言,断言isPass的值为true
	assert.Equal(t, true, isPass)
}

func TestJudgePassLineFail(t *testing.T) {
	isPass := JudgePassLine(50)
	assert.Equal(t, false, isPass)
}

1.1 覆盖率

如何衡量代码是否经过了足够的测试? 如何评价项目的测试水平?

go test judgment_test.go judgment.go --cover

img_22.png

输入为70,执行单侧,指定cover参数,覆盖率为66.7%,因为只执行了两行代码

  • 一般覆盖率:50%~60%,较高覆盖率:80+%
  • 测试分支相互独立,全面覆盖
  • 测试单元力度足够小,函数单一职责

1.2 依赖

img_23.png

单元测试需要保证稳定性和幂等性。要实现这一目的,就需要mock机制。

  • 稳定:相互隔离,能在任何时间,任何环境,运行测试
  • 幂等:多次运行,结果一致

1.3 Mock测试

  • 为一个函数打桩,不依赖本地文件

  • mock_test.go

func TestProcessFirstLineWithMock(t *testing.T) {
	//为ReadFirstLine()打桩 一直返回line110
	monkey.Patch(ReadFirstLine, func() string {
		return "line110"
	})
	defer monkey.Unpatch(ReadFirstLine) //取消打桩

	line := ProcessFirstLine()
	assert.Equal(t, "line000", line)
}

2.基准测试

  • 优化代码,需要对当前代码分析
  • 内置的测试框架提供了基准测试的能力