这篇文章上次修改于 249 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

在开源项目的一个提交被他人提交issue,最后被维护人员认定为regression。那么到底什么是regression呢,解释为回归似乎更令人难以理解。

回归的原意

回归,是常用的汉语词汇。它有两种含义。第一种是归还,返回的意思,例如:香港回归祖国,北回归线,回归初心等。这种含义大家都非常熟悉;另外一种含义来自数学领域,表示研究随机变量相互关系的统计分析方法,例如:回归分析,线性回归等。但不管哪一种含义都无法用来理解软件中的回归。

回归这个词是regression(rɪˈɡreʃ.ən)直译过来的,也正因为直译加深了理解其含义的难度。regression是动词regress的名词形式。剑桥词典中的解释为:

regress

verb [I] formal

to return to a previous and less advanced or worse state, condition, or way of behaving
退步;退化;倒退

  • She suffered brain damage from the car accident and regressed to the mental age of a five-year-old.
    在那起汽车交通事故中,她的脑部受损,智商倒退到5岁孩子的水平。

在此基础上,理解软件中的regression便容易了。

开发中的回归

软件回归(software regression)是一种软件错误(software bug):以前正常的功能变得不正常。在对软件源代码进行更改,包括添加新功能和错误修复后都可能发生;也可能是由于软件运行环境的变化而引入的,例如系统升级、系统修补或夏令时的更改。

软件性能回归是指软件仍能正常运行,但执行速度比以前更慢或使用更多内存或资源的情况。

实践中已经发现了各种类型的软件回归,包括:

  • 本地——更改在更改的模块或组件中引入了新的错误。
  • 远程——软件某一部分的更改会破坏另一模块或组件的功能。
  • 揭露——更改揭露了一个已经存在的错误,该错误在更改之前没有任何影响。

回归通常是由软件补丁中的错误修复引起的。避免此类问题的一种方法是回归测试。设计良好的测试计划希望在发布软件时防止这种软件错误发生,自动化测试和编写良好的测试用例可以降低回归的可能性。

回归测试

回归测试是重新运行测试,以确保先前开发和测试的软件在更改后仍然可以运行。如果不是,那就称为文章开始提到的回归。有人直接把回归测试解释成“重复的测试”、“检测二次出现的/回归的bug的测试”等,可见这些解释与其真正含义有偏差。

回归测试的目的是保证本来能够正常工作的软件在发生变化的情况下不产生衰退。所有引起软件衰退的bug叫做regression bug(有时候直接叫regression)。回归测试可以暴露regression bug。当这种bug被发现并修复了,软件就不会发生衰退(regression)。

触发回归测试的变化是多样的:它既可以是增加一个新功能,也可以是修复一个bug,还可以是修改软件配置。无论哪一种变化,都不应该导致软件衰退:即本来能够正常工作的部分(不管是功能点还是性能指标)被破坏。

通常来说,实现回归测试的方法是重新执行测试用例。根据执行结果是否成功,来鉴别软件是否发生衰退。回归测试与重复测试有关系,但不能将二者划等号。毕竟回归没有重复的含义,并且重复测试不仅用于回归测试,还可以用于稳定性测试。

将回归测试理解为“发现再次出现的bug”也不准确。因为regression bug并不是re-happened bug,regression bug是导致软件衰退的bug,这种bug完全可能是第一次出现的,而是全新的bug。它们不一定曾经出现过。

参考

  1. https://dictionary.cambridge.org
  2. https://en.wikipedia.org/wiki/Software_regression
  3. 何为“回归测试”,“回归测试”你真的理解吗? 作者:测试不将就 肖哥shelwin