在测试上难以自动化的软件,很难成为好的软件。—《Google 软件测试之道》
对于单元测试的想法
对于单元测试,开发者总是有着十分矛盾的思维。
- 单元测试很好,它能帮忙咱们找到很多暗藏的 bug
- 但写单元测试,比搬砖还累,我真的不想写~
没错,单元的确是一个磨炼意志的货色,如果不是在大公司,人力也不够,而因为单元测试往往是没有 KPI 的,所以常常在做完功能测试之后就疾速上线一直迭代了。
但,如果想要成为一个杰出的软件,或者说是作品,单元测试是保障可继续倒退的地基。比方,很多的开源软件,为了保障牢靠,单元测试覆盖率往往都有着很高的规范。
于是,从 JAVA 的 JUnitTest 的坑爬出来之后,我筹备来写写,在 Golang 中咱们如何做单元测试。不肯定是最佳实际,但相对算是不错的参考。本文先来说说单元测试的要求和留神点。
什么是单元测试
笔者从书中总结了一句话:自动化 验证一个 独立模块 的代码是否能满足 预期要求 的测试。
所以单元测试是一个最最底层的一个测试,思路就是保障最小的模块没有问题,只有底子稳了,下面的业务才不容易呈现问题。
要求
总结自《代码整洁之道》
自动化
自动化是一个最根底的要求,你不能说单元测试是通过你手动点击某个按钮,输出一个用户名明码,这样进行测试。单元测试应该就是启动之后主动实现的,并且对于测试后果应该做到自动化验证,而不是通过人的眼睛去判断输入的内容是否合乎产品需要。
疾速
单元测试应该测试的够快,如果单元测试跑的太慢会导致的一个问题就是人们很少去运行它。如果一个单元测试要跑 10 秒钟,那么开发者就会想着反正 10 秒钟,跑就跑一下。频繁的跑单元测试更容易提前发现未知的问题。
环境统一
测试的环境应该是和应用环境统一的,这也是很多测试的一个根本保障。应用环境是 mysql8 你用 mysql5.7 进行测试就会可能脱漏问题。并且这个测试环境应该是包含在单元测试外面的。
独立
单元测试应该是独立存在的,也就是对于执行程序应该是没有要求的。A 模块先测试而后 B 模块再测试就没有问题;然而 B 模块先测试 A 模块再测试就会报错,这样是不行的。这也是一个最根本的要求,一个单元测试运行的前后,要么 数据现场复原,要么你能保障以后的测试数据肯定不会影响前面的测试。在你通常无奈保障的时候,原则上都要进行数据恢复。比方你测试减少 1 条数据,那么测试实现之后就须要将数据删除。
注意事项
不要为了谋求覆盖率而忘本
拿数据谈话,在很多中央都实用,数据往往能给人们很大的安全感,没错,单元测试覆盖率 99% 那么能够给人十分大的安全感。然而!这是不太事实的。 对于绝大多数的软件来说,只有软件我的项目够大,你要反对的覆盖率越大,你的开发成本也就越大。
最重要的是:即便你的代码覆盖率是 100% 也不是状况 100% 笼罩。代码尽管这部分跑过了,然而因为数据的不同,一个边界条件就能让你雷同的代码报错。打算法较量的人都晓得,同样的性能,只有测试数据全过能力 AC。所以与其去测试一个十分偶尔的数据库连贯异样,不如多测一组 ‘-1’ 数据会不会报错。
单元测试既有开发成本也有保护老本
《单元测试的艺术》中说到单元测试的老本:
个别残缺的单元测试和开发成本是统一的(开发一天;测试一天,这件事其实很难掂量性价比)。而且单元测试写的越多,保护老本也就开始一直减少,当我的项目的性能一直变动,单元测试也要跟着调整,也就是说,你的麻利开发和疾速迭代会被单元测试所连累,你须要掂量老本。
并不举荐一开始就写
在国内(拥抱变动 ),特地是中小型公司,往往业务性能是不稳固的,需要始终在扭转,所以其实我并不举荐一开始就写单元测试。有工夫不如将功能测试全副通过,这样能更快上线,更快有反馈。尤其是像国内这种以产品为导向的开发方式,需要变动往往只须要一个小时,前一秒是产品经理认为能够,下一秒老板就说不行的状况太多了。在业务稳固之后,缓缓补,我集体真的感觉并不是一件错事。
当然,大公司为了保障业务牢靠,也有测试左移等等思路,并且一些有着残缺布局并且实施方案的我的项目,TDD(测试驱动开发)也未尝不可,总之也是须要具体情况具体分析的。
PS:我也已经有一个我的项目领会过测试驱动开发,写了一大堆测试用例和单元测试之后,当理论在开发性能的时候还再回过头来批改测试用例 😭
Golang web 根本分层测试思路
前面,我将会从一个最根底的 web 开发的思路,分层进行阐明(如下所示),如何编写 Golang 在 Web 开发中的单元测试,以及其中能够应用哪些工具来帮忙咱们疾速实现和测试。
- repo 数据层:间接拜访数据库或者缓存这一层的单元测试
- service 逻辑层:针对业务逻辑层的单元测试
- API 接口层:http 的接口层如何进行正当的测试
- 其余测试相干:如何做表格驱动测试,bentchmack 测试,测试覆盖率
单元测试是一场辛苦的修行,来让咱们开启一个 Golang 单测之旅 ~