3、测试
在实际工程开发中,另一个重要的概念就是单元测试,go测试包括单元测试,Mock测试, 以及基准测试。测试关系着系统的质量,质量则决定线上系统的稳定性,一旦出现bug漏洞,就会造成事故。
测试般分为,回归测试、集成测试、单元测试。回归测试一般手动通过终端回归些固定的主流程场景,集成测试是对系统功能维度做测试验证,而单元测试测试开发阶段,开发者对单独的函数、模块做功能验证,层级从上至下,测试成本逐渐减低,而测试覆盖率确逐步上升,所以单元测试的覆盖率在一定程度上决定着代码的质量。
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的程度。而我们在实际项目开发中,经常会遇到代码性能瓶颈,为了定位问题经常要对代码做性能分析,这就用到了基准测试。使用方法类似于单元测试。