如今的大环境下,很多企业还存在着一个错误的想法,觉得测试的岗位没有开发重要。认为测试上手快,技术和经验要求低,因此测试相对开发而言会不受到重视一些。
其实,这样的想法,对企业自身的发展是很不利的。要知道,一个产品的质量取决于这个产品链上最薄弱的环节。如果把程序员比作铸造城墙的勇士,那测试员就是作为把关大门的检验师,设计开发和测试是对等的,设计强而测试弱,产品的质量一样上不去。
软件的质量在很大程度上依赖测试人员,取决于测试人员的素质和管理者对测试的理解。如果不注重这一块在产品上线时,就很容易发生问题。近日,就因为一个程序Bug,某项目方直接损失了 2.2 亿人民币。
程序Bug,损失2.2亿人民币
前段时间在NFT圈子里发生了的一件事,某项目方因为自己的程序代码出错,导致锁定的 11539.5 个 ETH(以太坊代币)无法取出,按照目前的价格,这些 ETH 总价值 2.2 亿人民币。
什么是NFC呢,它是一种非同质化代币,属于区块链领域的一种应用, 可以理解为一种虚拟的数字资产。比如你买了一张NFC的头像,那这张图片的所有权就是你的了。
而这次出事的是一个叫 Akutar的 NTF 项目方,他们发起了一个 NFT 产品售卖,为了激励用户早点下单,其采用的是由高到低出价的拍卖方式,也就是假设一件产品的定价是 10000 元,想买入的就直接按照这个价格下单。如果最终成交价是 8000 元,那项目方会退你 2000 元。
很快,这个项目就完成了预定销售额,之后就是项目方需要履行后续的环节,退款和提现,也就是项目方需要先退回最终成交价和定价之间的差额给用户,然后才能自己提走项目售卖收益。
而为了让客户安心,项目方在智能合约里规定了需要先完成差价退款才能提现。而就是这份智能合约中的代码中的判断条件,出现了问题。
在智能合约代码里就有这么一个判断条件。
懂点技术的读者知道,这是一段函数代码,这个函数的作用是项目方用来提现的。
其中被红框标记起来的是一个判断条件, refundProgress >= totalBids,问题也恰恰出在这里。
按照定义,变量 refundProgress 表示 已经完成的用户退款数,而变量 totalBids 表示 所有用户下单的 NFT 总数。
因为一个用户可以购买多个 NFT,所以 totalBids 的数值一定是大于或等于 refundProgress 的。
也就是说,不可能出现像智能合约代码中 refundProgress >= totalBids 的情况。
因此,当代码执行到这里的时候,这个判断条件始终不会成立,后面的合约代码就无法执行。
看懂的读者应该知道了,这个 Bug 的关键点就是这两个变量之间的判断符号写反了。
程序员写的是 >=,而正确的应该是写成 <=。用户无法获得退款,项目方也无法提现。
对用户来说,虽然不能获得退款,但至少还是买到了 NFT。但对于项目方来说, 这价值 2.2 亿人民币的收益就直接被永久锁定了,无法提走。
对于项目方而言,就像拿了一个永远无法打开的巨额钱包,一个符号,价值 2.2 亿,可以说是一个惊天Bug 了。
而这个失误,则和上线前没有精准测试有关,项目方认为能够跑通全流程就可以了,这也是没有进行极端情况测试所留下的弊端。
因Bug亏损30亿、致6人死亡
其实这件事不是个例,近几年因为程序 Bug 导致产品重大损失的案例并不在少数。
几个历史数据转储逻辑Bug或发货逻辑Bug,就能让几十万轻松蒸发:
还有因为写出Bug差点进去的,有码农表示自己参与开发的一款发薪软件曾出现Bug,会导致发放的薪资变成双倍,总共能多发 2000多万。
当时查出Bug的时候发薪单已经生成,就差批量任务向银行发起请求了。
而纵观全球性的Bug所带来的损伤更是难以估量。比如在1996年,欧洲运载火箭Ariane 5在发射37秒后当场爆炸。
一瞬间, 70亿美元的开发费用白费, 5亿美元的设备原地蒸发。
这一切都由一个整数溢出 (Integer Overflow)的Bug引起。
有时,甚至会带来意外死亡。
1985年到1987年间,由加拿大AECL公司开发的Therac-25放射线疗法机器在软件互锁机制上出现了Bug,从而使辐射能量变成了正常剂量的 100倍。
最终,至少有6名来自美国和加拿大地区的患者由于遭受 过量辐射而意外死亡。
种种案例,都无不告诉我们,在项目上线前,找一个靠谱的测试团队是多么重要,为了省钱而省去一些步骤,可能只会挖出更大的坑。
软件测试的重要性
有很多比较小的企业认为,测试的工作可以由开发一并兼容了,但其实很多时候从开发人员的角度会比较难发现产品出现了问题,这个道理很简单,因为开发人员是制造者,而不是使用者。很多软件人员除了编译自己的软件外,从来不使用自己写的软件。这样,他们根本不知道自己写出来的东西究竟好不好。
生产者很难客观地审查和评价自己辛苦创造的东西,所以他们对自己的产品不如使用者了解。
而测试人员在长时间的测试过程中,逐渐了解了软件和系统存在的各种问题,对可能出现的问题更加敏锐。那些架构师们也许只需要花上半天时间,找测试人员聊聊,就知道自己设计出来的东西有多么大的问题了。
因此对于很多企业而言,提高测试人员的责任感和素质,对于提升产品质量是很重要的。并且,测试人员是其中非常重要的一个组成,他们不仅仅是测试的执行者,更是理解需求,审查需求分析,讨论软件架构,寻找系统瓶颈的重要参与者,更是用户的代言人。
写在最后
当然,我们不难发现,伴随着互联网行业的发展,高水平的测试工程师在企业中的地位越来越重要,越来越被认可。
所以可以预测的是,在未来,测试人员的需求也会不断增加,希望大家能够不断提升技能、掌握最新技术需求,在测试岗位上有更深远的发展。
(责任编辑:代码如诗) |