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(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.assertTure gotcha
【薛定谔|检查了 666 个代码库,竟有 3% 代码未能通过单元测试!】虽然pytest非常流行 , 但28%的代码库仍然使用内置的unittest包 。
使用内置unittest包的代码库存在assertTrue gotcha的风险 。
assertTrue的文档表明 , 测试expr结果为Ture , 但这个解释不完整 。
实际上 , 测试expr结果为Ture , 这意味着如果将以下任何值用作第一个参数 , 测试将通过:
这个调用签名通过这个错误 , 测试通过 , 因此可能会无声地失败 。
例如 , 在制作20个PR修复问题时 , 我们发现 , 一旦测试不再是薛定谔单元测试 , 其中一个测试由于应用程序逻辑错误而失败:
我们还发现 , 因为测试中的逻辑错误 , 至少有两个测试失败 。 如果我们把单元测试看作是描述产品如何运作的一种文档形式 , 那也很糟糕 。
从开发人员的角度来看 , 单元测试比注释和文档字符串更可信 , 因为注释和文档字符串是编写的声明(可能很久以前 , 也可能现在已经过时或不完整) , 而通过的单元测试表明逻辑是可行的……只要测试不是薛定谔测试!
也许我们需要更多的数据 , 但这可能意味着薛定谔的单元测试中有15%(20分之3)隐藏了损坏的功能 。
TestCase.asserEqual
当代码审查时 , CodeReview.doctor github bot在GitHub pull请求中检测到此错误 , 建议使用以下解决方案:
文章图片
《 新程序员003 》正式上市 ,50余位技术专家共同创作 , 云原生和数字化的开发者们的一本技术精选图书 。 内容既有发展趋势及方法论结构 , 华为、阿里、字节跳动、网易、快手、微软、亚马逊、英特尔、西门子、施耐德等30多家知名公司云原生和数字化一手实战经验!
? Android 13 “鸡肋”?可它跑起了 Windows 11、Linux 发行版!
? Unix 操作系统背后的女程序员 Lorinda Cherry 去世 , 享年 78 岁
推荐阅读
- Google|YouTube增加了TikTok风格的提示 以显示频道中进行的直播流媒体
- Tencent|腾讯要被“锤”?公关总监张军辟谣:喊重锤的人销号了
- 数据|棒糖科技跃升至出海收入榜Top24 女性向&大健康赛道也跑出了爆款APP
- Lenovo|两次被踢出恒生指数:联想又回来了
- IT|为了做冰墩墩,他们居然用上了造歼-20的技术!
- 社交|特朗普“真相社交”应用正式上线 但出现了问题
- IT|张艺谋总结夏奥会到冬奥会心路历程:国家和我们都不一样了
- 散热|游戏本现在都这么卷了吗?神舟第十二代i7笔记本活动只需7299元
- 硬件|“矿难”真的来了?爆料称3月份AMD、NVIDIA显卡价格将暴跌
- 操作系统|Android 13 “鸡肋”?可它跑起了 Windows 11、Linux 发行版!
