原标题:真的没有办法提高 "测试慢" 吗?

在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+极客一起讨论

    现在可免费进群 返回搜狐,查看更多

    责任编辑:

    声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。