原标题:真的没有办法提高 "测试慢" 吗?
在TDD训练营里,熊老师说每次做一点修改就要运行所有测试,但当回到真实项目里,测试运行起来却很慢。具体从三个问题角度考虑,今日极限拷问:
① 你的项目里运行全部测试需要多长时间?
② 时间耗在哪里了?
③ 有什么办法可以更频繁地运行测试?
测试慢这个问题,我也在想办法快起来。
比如
只运行其中一个测试,一般测试框架都有这种功能;代码的方法都应该尽量独立,互相解耦;选择开启监听代码改动来自动运行单元测试,这类的工具和插件也是非常有帮助的。
我自己运行单元测试大概在3分钟,也分具体项目。
现在这个项目在单元测试自动化上做的很失败,写过的Junit代码里运行速度慢的部分,都是依赖了很多外部资源,每次启动,都要注入很多东西。
运行快的部分是独立的单元,不依赖基础设施的,针对model的Junit都很快。
问了身边朋友的测试时间,
第一种是:"在目前项目,单元测试10分钟作用,冒烟测试2分钟左右 " ;
第二种是:" 分了微服务,每个服务大概2分多-3分钟,API 文档是通过 API 测试自动生成的,所以 API 测试是必须编写(占用时间稍多),每个服务单元测试1分钟左右跑完 ";
第三种是:" 用TDD 做的单元测试部分很快,但项目之前已经存在好些单元测试,是依赖了框架的,大概3-5分钟 "。
可是你有想过时间长的原因是什么吗?主要耗在哪里了?
除了语言和系统性能因素,时间可能花在初始化外部资源(包括:框架上下文、网络IO、数据库、文件系统等);
有的单元测试里有pylint语法及格式检查,10分钟的测试时间,可能pylint占4到5分钟;
请求响应、页面DOM处理;
框架的启动和初始化。
测试想做到更频繁运行,就要快。
如果是在 UTDD 周期内,单元测试并不会花多少时间(除非单元测试依赖外部资源)。
如果是集成测试,可以通过 "测试工具 " 把耗时的测试识别出来,然后选择性地把测试下沉到测试金字塔下一层。
重要的事情说三遍:
单元测试不要依赖外部资源!!!单元测试不要依赖外部资源!!!单元测试不要依赖外部资源!!!
我的单元测试对于外部的资源采用mock 的操作,不依赖于spring 等的第三方框架,这样可以使单元测试时间消耗时间较低,也保证了频繁运行的基础。
不过我遇到有些情况,比如对于某段逻辑的期望是改变数据的一个状态,由于使用mockito,会用verify 验证对应orm 的方法是否被调用,以及是否自己期望调用此方法时的参数。
而且在单元测试之外集成测试也是必要的,否则会遗漏掉在真实场景下会出现的问题。
可以参考下面的方法达到测试频繁运行的目的,包括团队:
如果测试日志没有办法告诉我们错误的原因,擅用debug工具,精准去定位问题,而不是一遍遍修改日志位置;
隔离耗时操作如数据库、远程网络、框架(如Spring),仅仅测试业务逻辑,这样速度就有保证;
采用单元测试——除了集成测试,其他的代码使用单元测试,减少依赖框架的上下文;
将项目拆分成不同的工程,这样每个工程的测试项目都不会很多,跑起来就会更快;
对有变更的测试单元文件运行测试,或者对之前没有通过的测试用例进行运行;
让团队练习TDD,向公司申请给完成TDD练功房的员工报销费用;
将Task拆小,确保每次添加/重构一小部分代码;
只针对对象的业务逻辑进行单元测试;
可提升成员面向对象开发的能力。
【问——答】
Q:controller层是否需要单元测试?像接口地址,请求方式,参数解析,参数校验等 (既注解是否正确)这些点是否需要测试?
A:没逻辑可以不加UT,以上这些在接口测试里已经覆盖了。
以上内容整合自【极限编程中国 | 实践者】 微信群28日讨论,内容贡献者:
现在还有名额免费加入
【极限编程中国 | 实践者】微信群
和前ThoughtWorks总监咨询师熊节实践敏捷开发
【极限编程中国|微信群】今日中奖
@西安 天鸿 世风十三
,
极客学院请你晚饭!
【极限编程中国 | 实践者交流群】
和《重构》、《持续交付2.0》译者交流
和300+极客一起讨论
现在可免费进群
返回搜狐,查看更多
责任编辑:
声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。