Go语言实践 - 测试 | 青训营

38 阅读3分钟

3、测试

在实际工程开发中,另一个重要的概念就是单元测试,go测试包括单元测试,Mock测试, 以及基准测试。测试关系着系统的质量,质量则决定线上系统的稳定性,一旦出现bug漏洞,就会造成事故。

测试般分为,回归测试、集成测试、单元测试。回归测试一般手动通过终端回归些固定的主流程场景,集成测试是对系统功能维度做测试验证,而单元测试测试开发阶段,开发者对单独的函数、模块做功能验证,层级从上至下,测试成本逐渐减低,而测试覆盖率确逐步上升,所以单元测试的覆盖率在一定程度上决定着代码的质量。

屏幕截图 2023-08-22 221929.png

3.1 单元测试

单元测试主要包括,输入,测试单元,输出,以及校对,单元的概念比较广,包括接口,函数,模块等;用最后的校对来保证代码的功能与我们的预期相符;单元测试一方面可以保证质量,在整体覆盖率足够的情况下,一定程度上既保证了新功能本身的正确性,又未破坏原有代码的正确性。另一方面可以提升效率,在代码有bug的情况下,通过编写单元测试,可以在一个较短周期内定位和修复问题。

3.1.1 单元测试-规则

下面是单元测试的一些基本规范:
1、所有测试文件以_test.go结尾
2、func TestXxx( * testing.T)

func TestPublishPost(t *testing.T) {

3、初始化逻辑放到TestMain中

func TestMain(m *testing.M) {
    //测试前:数据装载、配置初始化等前置工作
    code := m.Run()
    //测试后:释放资源等收尾工作
    os.Exit(code)
}
3.1.2 单元测试tips

在实际项目中,一般的要求是50%~60%覆盖率,而对于资金型服务,覆盖率可能要求达到80%;我们做单元测试,测试分支相互独立、全面覆盖。测试单元粒度足够小,函数单一职责。则要求函数体足够小,这样就比较简单的提升覆盖率,也符合函数设计的单一职责。

3.2 单元测试-依赖

工程中复杂的项目,一般会依赖外部依赖,数据库、文件或缓存等。而我们的单元测试需要保证稳定性和幂等性,稳定是指相互隔离,能在任何时间,任何环境,运行测试。幂等是指每一次测试运行都应该产生与之前一样的结果。而要实现这一目的就要用到mock机制。

3.3 单元测试-Mock

这里我们用了monkey,monkey是一个开源的mock测试库,可以对method,或者实例方法进行mock。
monkey:github.com/bouk/monkey 该包提供了快速Mock函数:
为一个函数打桩,为一个方法打桩。打桩可以理解为用函数A去替换函数B,B就是原函数,A就是打桩函数。
Mockey Patch的作用域在Runtime,在运行时通过通过Go的unsafe包,能够将内存中函数的地址替换为运行时函数的地址。

3.4 基准测试

基准测试是指优化代码,需要对当前代码分析并且内置的测试框架提供了基准测试的能力。Go语言还提供了基准测试框架,基准测试是指测试一段程序的运行性能及耗费CPU的程度。而我们在实际项目开发中,经常会遇到代码性能瓶颈,为了定位问题经常要对代码做性能分析,这就用到了基准测试。使用方法类似于单元测试。