团队单元测试开展

在金字塔模型之前,流行的是冰淇淋模型。包含了大量的手工测试、端到端的自动化测试及少量的单元测试。造成的后果是,随着产品壮大,手工回归测试时间越来越长,质量很难把控;自动化case频频失败,每一个失败对应着一个长长的函数调用,到底哪里出了问题?单元测试少的可怜,基本没作用。

团队单元测试开展_第1张图片

Mike Cohn 在他的着作《Succeeding with Agile》一书中提出了“测试金字塔”这个概念。这个比喻非常形象,它让你一眼就知道测试是需要分层的。它还告诉你每一层需要写多少测试。 测试金字塔本身是一条很好的经验法则,我们最好记住Cohn在金字塔模型中提到的两件事:

  • 编写不同粒度的测试
  • 层次越高,你写的测试应该越少

团队单元测试开展_第2张图片

同时,我们对金字塔的理解绝不能止步于此,要进一步理解: 我把金字塔模型理解为——冰激凌融化了。就是指,最顶部的“手工测试”理论上全部要自动化,向下融化,优先全部考虑融化成单元测试,单元测试覆盖不了的 放在中间层(分层测试),再覆盖不了的才会放到UI层。因此,UI层的case,能没有就不要有,跑的慢还不稳定。按照乔帮主的说法,我不分单元测试还是分层测试,统一都叫自动化测试,那就应该把所有的自动化case看做一个整体,case不要冗余,单元测试能覆盖,就要把这个case从分层或ui中去掉。 越是底层的测试,牵扯到相关内容越少,而高层测试则涉及面更广。比如单元测试,它的关注点只有一个单元,而没有其它任何东西。所以,只要一个单元写好了,测试就是可以通过的;而集成测试则要把好几个单元组装到一起才能测试,测试通过的前提条件是,所有这些单元都写好了,这个周期就明显比单元测试要长;系统测试则要把整个系统的各个模块都连在一起,各种数据都准备好,才可能通过。 另外,因为涉及到的模块过多,任何一个模块做了调整,都有可能破坏高层测试,所以,高层测试通常是相对比较脆弱的,在实际的工作中,有些高层测试会牵扯到外部系统,这样一来,复杂度又在不断地提升。 为什么做单测

这个问题我们规避不掉。新闻是这次研发模式改革的主力军之一,所以自上而下的推动让这个问题不那么棘手:做了就是做了。不做,却又有那么多的理由:(搜集到的吐槽真实声音)

  • 单元测试浪费了太多的时间
  • 单元测试仅仅是证明这些代码做了什么
  • 我是很棒的程序员,我是不是可以不进行单元测试?
  • 后面的集成测试将会抓住所有的bug
  • 单元测试的成本效率不高我把测试都写了,那么测试人员做什么呢?
  • 公司请我来是写代码,而不是写测试
  • 测试代码的正确性,并不是我的工作

我觉得我们总监指导的很到位:改革,一是工作方式的改革,更难的是思想上的改革。 单元测试的意义

新闻的总监dot老师是至始至终推进单测的好领导,他讲述了螺丝钉与飞机的故事:干货 | 测试扁平化之必备神器:好的单元测试

团队单元测试开展_第3张图片

  • 单元测试对我们的产品质量是非常重要的。
  • 单元测试是所有测试中最底层的一类测试,是第一个环节,也是最重要的一个环节,是唯一一次有保证能够代码覆盖率达到100%的测试,是整个软件测试过程的基础和前提,单元测试防止了开发的后期因bug过多而失控,单元测试的性价比是最好的。
  • 据统计,大约有80%的错误是在软件设计阶段引入的,并且修正一个软件错误所需的费用将随着软件生命期的进展而上升。错误发现的越晚,修复它的费用就越高,而且呈指数增长的趋势。作为编码人员,也是单元测试的主要执行者,是唯一能够做到生产出无缺陷程序这一点的人,其他任何人都无法做到这一点
  • 代码规范、优化,可测试性的代码
  • 放心重构
  • 自动化执行three-thousand times

下面这张图,来自微软的统计数据:bug在单元测试阶段被发现,平均耗时3.25小时,如果漏到系统测试阶段,要花费11.5小时。

团队单元测试开展_第4张图片

下面这张图,旨在说明两个问题:85%的缺陷都在代码设计阶段产生,而发现bug的阶段越靠后,耗费成本就越高,指数级别的增高。所以,在早期的单元测试就能发现bug,省时省力,一劳永逸,何乐而不为呢

团队单元测试开展_第5张图片

单元测试特别耗时?

不能一刀切,不能只盯着单测阶段的耗时。 我采访了新闻客户端、后台的开发,首先肯定的是,单测会增加开发量、增加开发时长。

团队单元测试开展_第6张图片

在《单元测试的艺术》这本书提到一个案例:找了开发能力相近的两个团队,同时开发相近的需求。进行单测的团队在编码阶段时长增长了一倍,从7天到14天,但是,这个团队在集成测试阶段的表现非常顺畅,bug量小,定位bug迅速等。最终的效果,整体交付时间和缺陷数,均是单测团队最少。

团队单元测试开展_第7张图片

单测,存在即合理。一方面,需要把单测放在整个迭代周期来观测其效果;一方面,写单测也是技术活,写得好的同学,时间少代码质量高(也即,不是说写了单测,就能写好单测) 谁来写单测呢?

  • 开发同学写单测
  • 测试同学具有写单测的能力。重点在于开发脚手架、分层测试/端到端测试

增量还是存量

  • 单测case针对增量代码
  • 当存量代码出现大规模重构,后者质量暴露出极大风险时,都是推动补全单测的好时机

单元测试的阶段

一. 广义的单元测试,我们指这三部分的有机组合:

  • code review
  • 静态代码扫描
  • 单元测试用例编写

二. 结合新闻的实践,我把单测成长的过程分为4个目标,分别为:

  • 会写,全员可写
  • 写的好,同时关注可测性问题,试点解决
  • 识别可测性问题,熟练使用重构方法进行重构;识别代码架构设计问题;case与业务代码同步编写
  • TDD。但这个目标是期望,不能作为必须实现的目标。

团队单元测试开展_第8张图片

截至发稿当天,新闻处于第三阶段,即,每个迭代均能产出高质量的case,人数覆盖和需求覆盖均较高;关注重点在于可测性,时刻注重重构。 单元测试的指标

还挺尴尬的,不太有直接的指标去衡量单测的效果。我们也经常被问到,“怎么证明你们新闻单测的作用呀?”

  • bug类指标(间接指标):连续迭代的bug总数趋势、迭代内新建bug的趋势、千行bug率
  • 单测的需求覆盖度(50%以上),参与人员覆盖度(80%以上)
  • 单测case总数趋势,代码行增量趋势
  • 增量代码的行覆盖率(接入层80%,客户端30%)
  • 单函数圈复杂度(低于40),单函数代码行数(低于80),扫描告警数

在迭代需求持续高吞吐量的前提下,以新闻iOS的数据为例:

团队单元测试开展_第9张图片

团队单元测试开展_第10张图片

团队单元测试开展_第11张图片

团队单元测试开展_第12张图片

你可能感兴趣的:(软件测试,单元测试,团队,敏捷)