https://github.com/bilibili/sniper/blob/master/thought.md
单元测试
单元测试部分不适合开源,只能分享一些相关的思考。
没有单元测试,就很难有真正的积累。我们的核心业务逻辑基本都有单元测试覆盖。有一次要改支付逻辑,我改完跑通测试后直接移交测试,测试通过,直接上线,一气呵成。我甚至都没自己用 curl 调一下接口,因为我知道,单元测试已经覆盖的已知的关键流程。
这当然不是什么值得炫耀的事情。但有效的单元测试确实对提高代码的质量有很大的裨益。
但怎么测才好呢?关键在 mock。Go 对 mock 并不是很友好。而且如果 mock 多了,一方面会极大降低写测试用例的体验;另一方面会导致测试用例真就成单元测试了,可能出现各单元都没问题,但整个系统有问题的情况。
所以,写测试一定要简单,测试逻辑一定要有效。为实现这两个目标,我们定了两条规则:
- 外部 http 请求一律 mock,这个基于 jarcoal/httpmock
- mysql, memcache, redis 直接起服务,各测试用例自行维护自己的测试数据集
为了进一步降低编写测试用例的复杂度,我们还提供了自动同步表结构和导入种数据的功能。如果测试用例不想手工维护测试数据集,则可以将相关数据写种子数据集。测试框架会自动导入。