前言

本文从单元测试实践角度出发,提升对代码质量的意识。

本文内容主要包括:单元测试、Mock测试、基准测试。

测试

测试可以提高代码的质量、减少事故的发生。

测试又分为:回归测试、集成测试、单元测试。

回归测试是指对QA手动回归一些特定场景,可以理解为我们说的手动点点。

集成测试是指对系统功能维度做验证,比如对服务暴露的接口验证,一般是自动化的验证。

单元测试是指在开发阶段,开发者对单独的函数、模块做验证,写一些测试用例。

单元测试

单元测试组成部分:输入、输出、测试单元、与期望的校对,测试单元又包括函数、接口、模块、复杂的聚合函数等。

通过单元测试的输出再与期望输出进行校对,来验证代码的正确性。通过单元测试可以保证代码的质量,也可以在一定程度上提升效率,比如通过运行单元测试可以快速定位到有问题的代码。

规则

单元测试的编写有一定的规则:

_test.goTesttestingfunc TestXxx(t *testing.T)TestMaingo test

示例

go testTomJerry

assert

assertif
go test

覆盖率

如何评估单元测试呢?是通过代码覆盖率来评估的,评估的标准包括:

  • 衡量代码是否经过了足够的测试
  • 评价项目的测试水准
  • 评估项目是否达到了高水平的测试等级

下面通过一个例子来看下代码覆盖率:

go test judgepass_test.go judgepass.go --cover

输出结果为:

ok  command-line-arguments  0.327s  coverage: 66.7% of statements

66.7%if100%
50%~60%80%+

依赖

一个实际项目不可能只是一个简单的单体函数,肯定会很复杂,存在其他的依赖,比如依赖数据库、redis、文件等外部依赖。

单元测试一般有两个目标:幂等、稳定。

幂等:重复执行一个用例、调用一个接口,返回的结果是一样的。

稳定:单元测试是相互隔离的,在任何时间都能独立运行。

Mock

Mock
Mock
monkeyGounsafeMock
MockPatchUnpatch
Patchtargetreplacement
Unpatch
Mock
ProcessFirstLineReadFirstLineMock

基准测试

Go

基准测试规则:

  • 基准测试以Benchmark为前缀
  • 需要一个*testing.B类型的参数b
  • 基准测试必须要执行b.N次

下面通过一个模拟负载均衡的例子,来看下基准测试:

go test -bench=.

goos: darwin
goarch: amd64
pkg: learning/bench
cpu: Intel(R) Core(TM) i7-9750H CPU @ 2.70GHz
BenchmarkSelect-8               50264580               23.47 ns/op
BenchmarkSelectParallel-8       13717840               133.4 ns/op
PASS
ok      learning/bench  4.559s

BenchmarkSelect-8Select8GOMAXPROCS
23.47 ns/opSelect23.47ns
5026458050264580

字节开源的go框架:github.com/bytedance/g…

您可能感兴趣的文章: