检查了 666 个代码库,竟有 3% 代码未能通过单元测试!

2022 年 2 月 21 日 CSDN

CSDN编者按:有一种特殊类型的单元测试,这种方法可以通过单元测试,但结果并非是我们想要的。本文作者将其命名为薛定谔的单元测试。在这篇文章中,作者在使用666个Python代码库,以检测薛定谔的单元测试,会有什么样的结果,我们不妨一探究竟。

原文链接:https://richardtier.com/2022/02/16/3-of-666-python-codebases-we-checked-had-silently-failing-unit-tests-and-we-fixed-them-all%ef%bf%bc/

本文为 CSDN 翻译,转载请注明来源出处。

译者 | 章雨铭        责编 | 屠敏
出品 | CSDN(ID:CSDNnews)

我们将一种特殊类型的单元测试命名为:薛定谔的单元测试

这种方法可以通过单元测试,但结果并非是我们想要的。

这个测试不会失败。

这篇文章主要介绍我们对666个Python代码库的代码进行扫描,以检测薛定谔的单元测试。具体来说,我们在20个代码库中发现了一个gotcha(在计算机编程领域中是指在系统或程序、程序设计语言中,合法有效,但是会误解意思的构造,程式容易造成错误,或是一些易于使用但其结果不如期望的构造)之后,就会推送一个自动生成的修复程序:

你发现错误了吗?对于开发者来说,这是一个较为常见的错误:将assertEqual 和assertTrue混淆了。事实上,在我们检查的666个代码库中,我们发现有3%的代码混淆了这两者。这是一个真实存在的问题,会对真实的代码库产生影响,甚至是对那些拥有强大社区和代码审查操作的大型活跃代码库。

譬如:详细名单见(https://gist.github.com/code-review-doctor/9b0b4be2129bc2d4678f4e205aec8811)

  • Python.org (很讽刺)

  • Celery

  • UK Ministry of Justice

  • Ansible

  • Django CMS

  • Keras

  • PyTorch

  • Ray

  • Salt

这个问题如此普遍,这表明在代码审查中很容易忽略该问题,是导致这个问题的关键原因。快速浏览代码时,这些错误不会引人注意。并且看起来可行。


薛定谔单元测试


19世纪末,马克吐温曾说:“使我们陷入困境的不是无知,而是看似正确的谬误论断。”19世纪文学中的道理,在21世纪早期Python单元测试中仍然适用:测试不想测试的内容不如不测试。因为薛定谔的测试盲目地相信这个功能是可行的。

你进行过下面的工作流程吗:

  • 提交被混淆后的代码,在本地通过功能测试。

  • 拉取请求生成时,测试在CI中运行,未报告任何失败。

  • 在代码审核阶段,同行审核并通过了该变更。“LGTM!”(代码已经审核过,可以合并)

  • 运用被混淆的代码,但在初次遇到用户时就会失败。

  • 阅读完错误报告后,还自言自语道:“但测试通过了!”。

在重新审查单元测试时,我们注意到,在软件开发生命周期中如此依赖的单元测试实际上根本没有测试功能。如果你遇到了这个问题,那么你会遇到这类的单元测试。TestCase.assertTrue就是其中之一。


TestCase.assertTure gotcha


虽然pytest非常流行,但28%的代码库仍然使用内置的unittest包。

使用内置unittest包的代码库存在assertTrue gotcha的风险。

assertTrue的文档表明,测试expr结果为Ture,但这个解释不完整。

实际上,测试expr结果为Ture,这意味着如果将以下任何值用作第一个参数,测试将通过:

'foo', ‘bar’, 1, [1], {‘a’}, True

 

反之,如果值错误,测试将失败:

'', 0, [], {}, False,

 

assertTrue还接受第二个参数,这是显示第一个参数是否正确的自定义错误消息。

这个调用签名通过这个错误,测试通过,因此可能会无声地失败。

例如,在制作20个PR修复问题时,我们发现,一旦测试不再是薛定谔单元测试,其中一个测试由于应用程序逻辑错误而失败:

 

我们还发现,因为测试中的逻辑错误,至少有两个测试失败。如果我们把单元测试看作是描述产品如何运作的一种文档形式,那也很糟糕。

从开发人员的角度来看,单元测试比注释和文档字符串更可信,因为注释和文档字符串是编写的声明(可能很久以前,也可能现在已经过时或不完整),而通过的单元测试表明逻辑是可行的……只要测试不是薛定谔测试!

也许我们需要更多的数据,但这可能意味着薛定谔的单元测试中有15%(20分之3)隐藏了损坏的功能。


TestCase.asserEqual


当代码审查时,CodeReview.doctor github bot在GitHub pull请求中检测到此错误,建议使用以下解决方案:

 

新程序员003》正式上市,50余位技术专家共同创作,云原生和数字化的开发者们的一本技术精选图书。内容既有发展趋势及方法论结构,华为、阿里、字节跳动、网易、快手、微软、亚马逊、英特尔、西门子、施耐德等30多家知名公司云原生和数字化一手实战经验!


   
   
     
微信试行1065工作制,18点强制下班;传苹果不再开发屏下指纹识别;AMD首席独立GPU架构师跳槽回到英特尔|极客头条
Android 13 “鸡肋”?可它跑起了 Windows 11、Linux 发行版!
Unix 操作系统背后的女程序员 Lorinda Cherry 去世,享年 78 岁
登录查看更多
0

相关内容

【干货书】《Pydon'ts:编写优雅的Python代码》,263页pdf
专知会员服务
91+阅读 · 2021年11月2日
【2021新书】《用正确的方式学Python》,456页pdf
专知会员服务
76+阅读 · 2021年6月9日
专知会员服务
72+阅读 · 2021年1月12日
【干货书】数据科学家统计实战,附代码与409页pdf
专知会员服务
59+阅读 · 2020年11月6日
49篇ICLR2020高分「图机器学习GML」接受论文及代码
专知会员服务
60+阅读 · 2020年1月18日
计算机视觉最佳实践、代码示例和相关文档
专知会员服务
17+阅读 · 2019年10月9日
Go应用单元测试实践
阿里技术
0+阅读 · 2022年4月8日
JavaScript命名冲突不可避免?
CSDN
0+阅读 · 2022年3月17日
JavaScript 中的 7 个“杀手级”单行代码
AI前线
1+阅读 · 2022年3月8日
谈一谈单元测试
阿里技术
0+阅读 · 2022年2月14日
改 3 行代码不应该花一整天的时间
InfoQ
0+阅读 · 2022年1月25日
改3行代码不应该花一整天的时间
AI前线
0+阅读 · 2022年1月15日
“三行代码,确实需要耗上一整天!”
2021 年 Python 的好与坏
InfoQ
2+阅读 · 2021年11月16日
我用Transformer修复代码bug
夕小瑶的卖萌屋
1+阅读 · 2021年9月9日
国家自然科学基金
0+阅读 · 2015年12月31日
国家自然科学基金
1+阅读 · 2014年12月31日
国家自然科学基金
0+阅读 · 2014年12月31日
国家自然科学基金
1+阅读 · 2013年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
1+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2011年12月31日
国家自然科学基金
1+阅读 · 2010年12月31日
Arxiv
0+阅读 · 2022年4月20日
Disentangled Information Bottleneck
Arxiv
12+阅读 · 2020年12月22日
VIP会员
相关VIP内容
【干货书】《Pydon'ts:编写优雅的Python代码》,263页pdf
专知会员服务
91+阅读 · 2021年11月2日
【2021新书】《用正确的方式学Python》,456页pdf
专知会员服务
76+阅读 · 2021年6月9日
专知会员服务
72+阅读 · 2021年1月12日
【干货书】数据科学家统计实战,附代码与409页pdf
专知会员服务
59+阅读 · 2020年11月6日
49篇ICLR2020高分「图机器学习GML」接受论文及代码
专知会员服务
60+阅读 · 2020年1月18日
计算机视觉最佳实践、代码示例和相关文档
专知会员服务
17+阅读 · 2019年10月9日
相关资讯
Go应用单元测试实践
阿里技术
0+阅读 · 2022年4月8日
JavaScript命名冲突不可避免?
CSDN
0+阅读 · 2022年3月17日
JavaScript 中的 7 个“杀手级”单行代码
AI前线
1+阅读 · 2022年3月8日
谈一谈单元测试
阿里技术
0+阅读 · 2022年2月14日
改 3 行代码不应该花一整天的时间
InfoQ
0+阅读 · 2022年1月25日
改3行代码不应该花一整天的时间
AI前线
0+阅读 · 2022年1月15日
“三行代码,确实需要耗上一整天!”
2021 年 Python 的好与坏
InfoQ
2+阅读 · 2021年11月16日
我用Transformer修复代码bug
夕小瑶的卖萌屋
1+阅读 · 2021年9月9日
相关基金
国家自然科学基金
0+阅读 · 2015年12月31日
国家自然科学基金
1+阅读 · 2014年12月31日
国家自然科学基金
0+阅读 · 2014年12月31日
国家自然科学基金
1+阅读 · 2013年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
1+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2011年12月31日
国家自然科学基金
1+阅读 · 2010年12月31日
Top
微信扫码咨询专知VIP会员