导读:近期Flaky Test逐渐成为很多开发团队关注的热点,本文就Flaky Test的背景、定义、根因、检测思路做以简单介绍。

“说谎者不再被信任,即使他说的是真相”

—伊索。

回归测试

程序员小猪搭建了个自动化测试框架,“一键”即可运行系统中的测试用例,一旦系统功能模块受到破坏,对应的测试用例就会运行失败。当系统

* 部署了新模块、

* 提交了补丁、

* 重构了代码、

* 更改了参数配置,

小猪都会跑下系统中的测试用例。如果有测试失败,就意味着新提交的代码存在缺陷且破坏了原系统的功能模块,小猪就会告知开发人员进行修复。

因为此系统,小猪很受欢迎。团队领导表扬小猪的自动化测试框架用人少、检测快,大大提升了开发效率。团队成员感激小猪的系统避免了自己写的bug流入系统。小猪很是开心。

Flaky Test

然而好景不长,小猪陷入了苦恼之中。事情经过是这样的:

1.程序员小马在系统上部署了新模块,小猪跑完测试后,发现有测试用例失败,就告诉小马其代码有缺陷,需要修复;

2.小马按照小猪提供的测试用例(回归测试中失败的测试用例)去调试缺陷。然而,这次不同于以往,小马分析了半天也未能确定自己的哪块代码有问题;

3.不得已,小马去找小猪重跑该测试用例,想获得更多信息来定位缺陷。然而,当再次运行时,该测试用例并竟然神奇地运行成功了。

小马

什么?运行成功,浪费了半天调试不存在的缺陷?×&%¥#@……”(一顿“喷”小猪)

小猪

什么?同样的测试用例,同样的代码并没有任何改变,怎么前面失败了,这次跑成功了?(一脸的困惑)

经过多番调查,小猪了解到了Flaky Test的概念:测试用例在同一个版本的系统上运行多次,有的运行成功,有的运行失败,这样的测试用例被称为Flaky Test,又称不可靠测试用例。小马的案例就是属于这种情况,小猪报告给小马的测试失败不是缺陷引起的,而是Flaky Test引起的。

更糟糕的是,随着系统规模的增大,这样的Flaky Test越来越多,很多程序员开始给小猪抱怨,Flaky Test误导他们调试不存在的缺陷,浪费了精力与时间。更严重的是,他们不再那么相信测试结果了,当小猪再报告提交的代码有缺陷时,都会应付说“你先确定是不是缺陷导致的测试失败,然后再来烦我”。团队的开发效率也因此受到了影响,团队领导对小猪很有意见。

根因分析

小猪emo了好久,决定调查Flaky Test的根因。经过分析,大致分为如下几类:

①并发引起的。系统涉及到多线程,线程执行顺序是不确定的,而开发人员写的测试用例只应对了部分线程执行顺序,当某些测试运行中出现了未考虑到的执行顺序时,就会导致测试运行失败。

②异步引起的。系统涉及到异步通讯,其通讯时间是不确定的。开发人员在写测试用例的时通常会预估一个相应的时间,大部分情况下,异步通讯都能够在预估时间内执行完成,测试用例成功运行,然而也有异常情况,即异步通讯时间超过预估时间,导致测试失败。

③执行顺序依赖引起的。有些测试用例会依赖特定的测试用例执行顺序,如果执行顺序改变了,测试就会失败,比如Test1是检测一个链表是否为空,Test2是检测能否向该链表中插入一个元素。如果执行顺序是Test1àTest2,那么测试就能成功。如果是Test2àTest1,测试就会失败。

④资源泄露引起的。有些测试用例会导致资源泄露,比如内存泄露。如果测试机器的负载较轻,测试能够成功完成,如果负载较重,则可能因资源不够而导致测试失败。

⑤系统时间引起的。很多测试用例涉及到系统时间,程序员经常以某个特定时区的时间为准,而测试用例可能会在别的时区内执行,就会导致有些时段测试成功,有些时段测试失败。

⑥返回值区间要求过于严格引起的。开发人员通常会使用预定好的值来判断测试是否成功,有时设定的值的范围过于严格,会导致某些执行结果落在预定值之外,导致测试失败。

⑦随机数引起的。开发人员有时候会在测试用例中使用随机数,当某些边界值没有考虑到时,就会导致测试用例执行失败,比如除数是随机数时,就可能出现除以0的情况。

Flaky Test检测

虽然flaky test的根因弄清楚了,如何检测Flaky Test仍然是个问题,一番调查后,小猪发现了如下方案:

①“消极”重跑法。当一个测试用例失败后,重跑该测试用例n次(比如n=5),如果其中某次或多次运行成功,即认为该测试用例为Flaky Test,该方法简单且易于部署。

小猪的担心:该方法虽然简单易行,但存在两个问题:1)检测的成功与否完全靠运气,重跑的结果很可能都是一样的,没有任何保证;(2)系统测试用例数量巨大,每次运行会有上千个测试用例失败,如果都是重跑n次,耗时长,成本高。

②“积极”重跑法。这类方法以测试套件为输入,逐一检查测试用例是否为Flaky Test。其方法是多次运行测试用例,如果发现测试用例既有成功又有失败就标记为Flaky Test。为了让Flaky Test能够展现出不可靠性,重跑过程中,会采用各种手段来提高发现Flaky Test失败的概率,比如:

1)DTDetector[1]、iDFlakies[2]通过改变测试用例的执行顺序尽可能快地发现执行顺序相关的Flaky Test失败;

2)FlakeScanner[3]在测试运行中,通过探索不同的事件序列来发现与并发相关的Flaky Test失败;

3)Shaker[4]通过在运行环境中添加“噪音”,比如增加CPU的负荷,来发现与并发相关的Flaky Test失败。

小猪的担心:虽然该类方法提高了Flaky Test检测的成功率,但仍存在问题:1)系统测试用例数据巨大,多次重跑,耗时长,成本高;2)标记出的Flaky Test并未在回归测试中展现出不可靠的现象,程序员不太乐意去解决,比如修复或者隔离等。

③“积极”标注法。这类方法提取已有的Flaky Test的特征并训练一个模型,通过模型来预测一个测试用例是否为Flaky Test,比如:

1)FlakeFlagger[5]通过收集Flaky Test的特征如测试用例坏味道等,根据这些特征预测Flaky Test;

2)Flakify[6]在语言特征预模型之上,通过测试用例坏味道特征数据重训练来获得Flaky Test的检测模型。

小猪的担心:这类方法虽然不用重跑测试用例,但也存在问题:1)建立预测模型需要大量的标注数据,现实中很难构建这样的数据集;2)预测模型的准确率难以保证,并且标记出的Flaky Test并未在回归测试中展现出不可靠的现象,程序员不太乐意去解决。

小猪的理想

虽然已有很多方法,但都未能完美解决小猪的问题。小猪希望能有一套与开发流程吻合、切实可行的Flaky Test检测方法,具体而言:

①针对Flaky Test失败的检测工具。困扰小猪的直接难题是,一次回归测试可能会有上千个用例失败,如何从这些失败中快速辨别出Flaky Test失败,避免给开发人员带来困扰。

②无需重跑。当回归测试完成后,无需重跑即可识别出Flaky Test失败。

参考文献

[1]   Sai Zhang, Darioush Jalali, Jochen Wuttke, Kıvanç Muşlu, Wing Lam, Michael D.Ernst, and David Notkin. 2014. Empirically revisiting the test independence assumption. In ISSTA.

[2]   Wing Lam, Reed Oei, August Shi, Darko Marinov, and Tao Xie. 2019. iDFlakies: A framework for detecting and partially classifying flaky tests. In ICST.

[3]   Zhen Dong, Abhishek Tiwari, Xiao Liang Yu, and AbhikRoychoudhury.2021. Flaky test detection in Android via event order exploration. In ESEC/FSE.

[4]   Denini Silva, Leopoldo Teixeira, and Marcelod’Amorim.2020.ShakeIt!Detecting Flaky Tests Caused by Concurrency with Shaker. In IEEE International Conference on Software Maintenance and Evolution.

[5]   A. Alshammari, C. Morris, M. Hilton and J. Bell, "FlakeFlagger: Predicting Flakiness Without Rerunning Tests," 2021 IEEE/ACM 43rd International Conference on Software Engineering (ICSE), 2021, pp. 1572-1584, doi: 10.1109/ICSE43902.2021.00140.

[6]   Fatima S,  Ghaleb T A,  Briand L. Flakify: A Black-Box, Language Model-based Predictor for Flaky Tests. TOSEM 2022.

作者简介

董震,复旦大学计算机科学技术学院青年副研究员,上海市领军人才(海外)计划入选者。2017年获得德国海德堡大学博士学位,2017年至2021年在新加坡国立大学计算机系任博后研究员,致力于软件分析与软件测试的相关的研究,获得ICSE'20 ACM SIGSOFT Distinguished Paper Award、AsiaCCS’21 Best Paper Award (1/370)、TOSEM Distinguished Reviewer等奖项或荣誉称号,长期担任国际知名期刊审稿人、国际会议程序委员会委员。

CodeWisdom

Codewisdom平台由复旦大学软件工程实验室运营,提供智能化软件开发平台及线上沙龙相关资讯,关注可了解更多智能化软件开发的最新消息~

技术科普 | Flaky Test很神秘?程序员小猪的切身经历告诉你相关推荐

  1. 公司技术管理角度看C++游戏程序员发展

    公司技术管理角度看C++游戏程序员发展 H3D 这是我多年来招聘培训游戏程序员的一点想法.一直想汇总一下.主要目的是为了更好的对公司新进C++程序员进行培训,并且建立起游戏程序员培训,发展,成才,成为 ...

  2. 35 岁程序员的独家面试经历

    35 岁程序员的独家面试经历 2015年12月15日 17:34:33 松门一枝花 阅读数:524 创业失败后,在找工作.选择了三家(两家上市公司,一家将上市),都走到了关键的节点.我记录了面试过程中 ...

  3. 刚从培训机构出来的Java程序员且无工作经历该如何找工作?

    近年来IT行业火热,因为薪资高的原因,很多人都想转行去学IT,所以JAVA培训机构就应运而生了.但培训完之后就发现了这样一个问题,刚从培训机构出来的Java程序员且无工作经历该如何找工作?   由于很 ...

  4. “中国第一程序员” 求伯君的传奇经历

    "中国第一程序员" 求伯君的传奇经历 研发 他被称为"中国第一程序员",25岁就凭一己之力击溃"英美联军" 为何却在最巅峰的时候激流勇退?2 ...

  5. 如何从挫败感到成就感,身为程序员每天都在经历这些!

    >>原创文章,欢迎转载.转载请注明:转载自IT人故事会,谢谢! >>原文链接地址:如何从挫败感到成就感,身为程序员每天都在经历这些! 昨天加班遇到了一个问题,关于ios的微信端 ...

  6. 目睹一个程序员精神失常的经历

    目睹一个程序员精神失常的经历 2013年05月05日 17:31:43 gaorongchao1990626 阅读数:39594更多 个人分类: 编程经验 版权声明:本文为博主原创文章,未经博主允许不 ...

  7. 看BAT技术面试官如何挑选Java程序员

    又到一年一度的跳槽求职高峰季,很多人问我,你们公司还需要人么,你们用的技术栈是哪些,有哪些是你们比较关注技术重点? 没错,作为负责技术面试的我,面对数十甚至上百封简历,肯定要做一轮筛选.究竟哪些技术点 ...

  8. java三年技术差_3年经验Java程序员面阿里P6 差距在哪里

    虽然这位小伙伴觉得自己工作三年了,结果阿里连面都不面就把自己挂了,这让自己感到很伤心.但是还是有网友觉得,三年不到p6,很正常啊,明年再面就没有问题啦! Java程序员3年经验面阿里P6,2面连面都没 ...

  9. 技术不够硬?90%的程序员都错了!

    面对日新月异的技术潮流,怎样才能避免沦为与市场脱钩.甚至被无情清退的大龄码农?很多程序员都走了弯路! 安于现状,对于学习新技术这件事有些抵触: 一再拖延,身边的同事新框架玩的飞起,自己却懒于行动: 盲 ...

最新文章

  1. python 日期时间处理 常用方法
  2. python匿名函数里用for_请问这段Python代码如何用匿名函数简化?
  3. 第七篇: 高可用的分布式配置中心(Spring Cloud Config)(Finchley版本)V2.0_dev
  4. java socket client_java socket client
  5. Java基础学习总结(184)—— 从 Java 9 到 Java 17 的新特性解读
  6. Bailian2911 受限完全平方数【暴力】
  7. C#+OpenGL+FreeType显示3D文字(3) - 用PointSprite绘制文字
  8. [转]Ubuntu下快速安装python
  9. shell 截取文件名及扩展名
  10. 用计算机弹让我做你的眼睛,童珺 - 让我做你的眼睛 (改编版)-酷歌词...
  11. word文档打印表格时预览时看的到表格打印出来的表格没有上下两根横线?
  12. IOS开发之——硬件开发-加速计应用实例(04)
  13. 安卓手机做服务器(django),完成废物利用
  14. find vba 模糊_求Find模糊查找和绝对查找的方法。
  15. 【Python】matplotlib画图设置标题、轴标签、刻度、刻度标签(系列1)
  16. java拯救苹果代码_java swing游戏编程高仿金山打字教程-拯救苹果
  17. SQLServer 查询分析器里大小写转换快捷键
  18. 【技术美术图形部分】图形渲染管线2.0-GPU管线概述几何阶段
  19. MySQL数据类型 int(M) 表示什么意思?
  20. iOS-检测 iOS 系统网络权限被关闭

热门文章

  1. Java变量和运算符详解
  2. mysql 1326_SQL Server 出现Error: 1326错误(管理器无法连接远程数据库)问题解决方案...
  3. Adobe Bridge CC资源管理软件使用方法
  4. 如何确定计算机的负载算是高负载
  5. 企企通:为什么成长型企业,需要SaaS采购管理平台?
  6. 数组转JSON json对象 json字符串
  7. 吴军博士给工程师的分级
  8. 【MSRA】微软亚洲研究院实习经验收获整理
  9. 【TestNG】TestNG使用教程详解
  10. 夜雨数竞笔记-不定积分(6)-待定系数法-非有理分式