当前位置:首页 > 公众号精选 > strongerHuang
[导读]关注、 星标公众号,不错过精彩内容 来源:EDN电子技术设计 编辑整理:strongerHuang 开发一个项目不是说编码时间短,项目就完成的更快。也不是测试、调试时间短项目整体就快。其实,三者是息息相关的。如果编码的只顾编码、测试的只顾测试,那么项目周期将是


关注、 星标公众,不错过精彩内容

来源:EDN电子技术设计

编辑整理:strongerHuang


开发一个项目不是说编码时间短,项目就完成的更快。也不是测试、调试时间短项目整体就快。其实,三者是息息相关的。如果编码的只顾编码、测试的只顾测试,那么项目周期将是遥遥无期。

前不久给大家分享了一篇关于《 嵌入式软件测试的10条秘诀 》讲述了测试相关的内容,今天来听一位资深工程讲述如何减少编码、测试和调试三个阶段的bug。

一、会导致难点bug的问题

1.事件顺序

在处理事件时,提出下列问题会很有成效:事件可以以不同的顺序到达吗?如果我们没有接收到此事件会怎么样?如果此事件接连发生两次会怎么样?哪怕通常不会发生,但系统(或交互系统)其他部分的bug可能会导致事件发生呢。


2.过早

这是第一点“事件顺序”的一个特例,但它确实会引起一些棘手的bug,因此我把它单独拎出来说明。例如,如果信令消息在配置和启动程序完成之前就被过早接收,那么可能就会有很多奇怪的行为发生。另一个例子:连接在被放进空闲列表之前就被标记为down。在调试这类问题时,我们总是假定在空闲列表中的时候连接被设置为down(但当时为什么不把它放到列表外面呢?)。这是我们思考的不足,没有考虑到有时候事情会过早发生。


3.悄无声息的故障

一些最难跟踪的bug有部分是由那些静静失败并扩展而不是抛出错误的代码所导致的。例如,没有检查代码却返回错误的系统调用(如bind)。又如:解析代码在它遇到错误元素的时候只是返回而非抛出错误。在错误状态中持续了一段时间的调用,会使调试变得更难。最好一旦检测到故障就返回错误。


4.if

有若干条件的if语句,if (a 或 b) ,特别是当有链接的时候, if (x) else if (y),都给我引发了很多bug。即使if语句在概念上很简单,但当有多个条件要跟踪的时候依然很容易出错。这些天,我尝试重写代码使之更简单,以避免处理复杂的if语句。


5.else

有一些bug是因为没有正确考虑到如果条件为false时会发生什么而引起的。几乎在所有的情况下,都应该有一个else部分来应对每一条if语句。此外,如果你在if语句的分支中设置变量,那么或许你在另一个分支中也要设置。与此种情况相关的是标记被设置的情况。只添加用于设置的标记的条件不难,但是很容易忘了添加当标记应该再次重置时的条件。留下一个永远设置的标志可能会导致之后接连不断的bug。


6.改变假设

许多一开始最难预防的bug是因为改变了假设所造成的。例如,在开始时,可能每天只有一个客户事件。于是很多代码是在这样的假设下写下的。但是后来,设计改变了,允许每天有多个客户事件了。发生这种情况时,很难改变新设计影响到的所有情况。找到关于改变的所有显式依赖关系不难,难的是要找到所有隐性依赖于旧的设计的情况。例如,可能会有获取给定某一天所有客户事件的代码。其中的隐含假设是结果集永远不会超过客户的数量。关于这方面的问题我也没有很好的策略方法,如果各位有的话,还请不吝赐教。


7.日志记录

可视化程序做什么至关重要,特别是当逻辑很复杂的时候。确保补充足够多的(但不要太多)日志记录,这样你就可以说明为什么程序要这么做。如果一切正常,那也没关系,但要是有问题发生,你会很庆幸自己添加了这些日志。


二、测试

作为一个开发人员,直到要测试了我才会去处理功能。至少,这意味着每一行新的或改变了的代码行至少已经被执行过一次。此外,单元测试和功能测试都很不错,但还不够。新的功能也必须进行测试,并在类似于产品的环境中探索。只有这样,我才能说我完成了一个功能。下面是我经历过的bug所教会我的关于测试的一些重要的经验教训:


1.零和null

如果可行的话,确保总是用零和null来测试。对于字符串,这意味着要测试长度为零的字符串以及字符串为null两种情况。又如:测试TCP连接的断开,要在发送数据给它发送之前。不使用这些组合方法测试是导致bug出现的首位原因。


2.添加和删除

通常,新的功能包括能够添加新的配置到系统中——例如,一个用于手机号码转换的新的配置文件。测试它能否添加新的配置文件是很自然的。但是,我发现我们很容易忘记去测试删除配置文件是不是同样ok。


3.错误处理

处理错误的代码往往是难以测试的。最好有能检查错误处理代码的自动测试,但有时这是不可能的。我有时会使用的一招是临时修改代码,使得错误处理代码运行起来。要做到这一点最简单的方法是反转if语句——例如,从if error_count > 0改成error_count == 0。另一个例子是拼错数据库列名,从而导致期望的错误处理代码运行。


4.随机输入

通常,揭露bug测试的一种测试方法是使用随机输入。例如,H.323协议的ASN.1解码使用二进制数据操作。通过发送随机字节去解码,我们发现了解码器中的几个bug。另一个例子是用测试呼叫来生成脚本,此时呼叫持续时间,接听延迟,第一方挂断等等都是随机生成的。这些测试脚本会暴露许多bug,特别是一起发生的事件会产生并拢干扰。


5.检查不应该发生的动作

通常测试包括检查期望动作是不是发生了。但我们很容易忽视相反的情况——忘记检查不应该发生的动作是不是的确没有发生。


6.拥有工具

我创建了自己的小工具,以使得测试更加简单。例如,当我用VoIP SIP协议工作时,我写了一个能够用正是我想要的标题和值回复的小脚本。这个工具使得测试很多边界情况变得容易起来。另一个例子是可以进行API调用的一个命令行工具。通过启动逐渐添加所需小功能,我得到了一些非常有用的工具。自己写工具的好处是,我得到的正是我想要的。


在测试中发现所有的bug,那绝对是不可能的。有一个案例中,我更改了数字相关性的处理,数字由两个部分组成:路由地址前缀(通常是不变的),以及从000到999动态分配的数字。问题在于当找到相关性时,动态分配的数字的第一个数字会在呈现在表格中之前遭到误删。也就是说637变成了37。这意味着,到100之前它都是可以工作的,因此,前面100个电话是正常的,但是接下来的900个都是失败。所以,除非我在重新启动之前能够测试超过100次(事实是我没有),否则我在测试时就不会发现这个问题。


三、调试

1.讨论

帮助我最多的调试技术是与同事讨论问题。通常情况下,只是和同事说明问题,就会让我意识到问题的症结。此外,即使他们不是很熟悉有问题的代码,他们也往往能提出一些好点子。与同事讨论在处理最难的bug时特别有效。


2.密切关注

通常,如果调试问题花了很长时间,往往是因为我做了错误的假设。例如,我认为问题发生在某一方法中,但事实却是它甚至从来没有到达那个方法。或者,被抛出的异常不是我以为的那个。或者,我认为软件的最新版本上正在运行,但其实是一个旧版本。因此,一定要核实细节,而不是假设。人们更容易看到自己希望看到的东西,而不是事实。


3.最近的变化

当曾经可以正常工作的东西停止工作,那么这通常是因为最近改变的东西所导致的。在一个案例中,最近的改变只是日志记录,但是日志中的错误却导致了一个更大的问题。为了更容易找到这种回归,承认不同的提交会导致不同的变化,以及清楚说明这些更改会有所裨益。


4.相信用户

有时,当用户报告问题的时候,我的本能反应是,“这是不可能的。一定是他们做错了什么事”。但我学会了不再用这种方式去回应。更多的时间,事实往往证明,他们所报告的的确是实际发生的情况。因此,这些天,我开始接受他们所报告的内容的表明价值。当然,我依然会仔细检查一切是否被正确地设置等等。我见过很多这样的情况,让我明白,因为不寻常的配置或意料之外的用法而导致不可思议的事情的发生,而我默认的假设是,他们是正确的,程序是错误的。


5.测试修复

如果bug修复已准备就绪,那就必须进行测试。首先在修复前运行代码,并观察该bug。然后应用修复并重复测试案例。到此为止错误行为应消失。遵循这些步骤可以确保它确实是一个bug,并且此次修复的确可以解决这个问题。简单而有必要。


免责声明: 本文来源网络,版权归原作者所有。如涉及作品版权问题,请与我联系删除。
推荐阅读:
树莓派基于 Linux 的 Windows XP
嵌入式软件测试的10条秘诀
国产EDA落后的根源探究

关注 微信公众号『strongerHuang』,后台回复“1024”查看更多内容,回复“加群”按规则加入技术交流群。


长按前往图中包含的公众号关注

免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

上海2024年4月17日 /美通社/ -- 近日,国际公认的测试、检验和认证机构SGS为歌尔股份有限公司(以下简称"歌尔")颁发QTL认可实验室证书,彰显了歌尔在产品佩戴体验舒适度检测及声学检测领域的...

关键字: 声学 测试 ISO 检测技术

HBM高带宽存储芯片被广泛应用于最先进的人工智能(AI)芯片,据业界消息,英伟达的质量测试对存储厂商提出挑战,因为相比传统DRAM产品,HBM的良率明显较低。

关键字: HBM 良率 存储 英伟达 测试

近日某厂员工爆料,公司程序员因线上流量异常BUG事故,被公司进行处罚。处罚的结果是被要求将去年发的 4 万多年终奖归还给公司,否则就收取滞纳金并辞退,逾期将以每天万分之 5 的利息收取滞纳金。

关键字: 程序员 BUG 事故 年终奖 工程师

业内消息,近日有媒体报道一名女子将年度总结发到朋友圈并将状态设为私密,但随后她发现其好友可以看到她发了朋友圈,尽管无法看到具体内容。随即,微博话题#微信私密朋友圈被吐槽有BUG# 很快冲上热搜第一,许多网友也纷纷表示遇见...

关键字: 微信 BUG

在嵌入式系统设计中,搭建开发环境是实现项目成功的重要步骤之一。本文将介绍如何在嵌入式系统中构建一个完整的开发环境,包括硬件和软件方面的考虑。 在嵌入式系统设计中,搭建一个良好的开发环境是非常重要的,它能够帮助开发人员高效...

关键字: 嵌入式 开发环境 测试

北京2023年9月23日 /美通社/ -- 近日,主线科技正式获准在北京市智能网联汽车政策先行区道路开启常态化测试与示范,将与物流客户在真实开放的城区道路场景中,率先开启基于L4级别自动驾驶能力的智能卡车运输示范。 随...

关键字: 智能卡 测试 高速公路 BSP

北京2023年9月21日 /美通社/ -- 随着生成式AI快速发展,人工智能在各行各业广泛应用,AI算力需求剧增,AI芯片多元化趋势凸显,带来了芯片开发成本高、多元芯片使用难等挑战。近日,浪潮信息面向全行业公布了《开放加...

关键字: 生成式AI AI芯片 加速卡 测试

重庆2023年9月20日 /美通社/ -- 近日,国际独立第三方检测、检验和认证机构德国莱茵TÜV大中华区(以下简称"TÜV莱茵")亮...

关键字: 摩托 测试 动力电池 CE

(全球TMT2023年9月14日讯)近日,国际公认的测试、检验和认证机构SGS为武汉芯必达微电子有限公司LDO产品颁发AEC-Q100认证证书。AEC-Q100认证的产品范围包括了各种类型的集成电路,如模拟、数字、混合...

关键字: LDO AEC-Q100 测试 模拟

(全球TMT2023年9月13日讯)9月13日, 由开放数据中心委员会(ODCC)主办的“2023开放数据中心峰会”在北京国际会议中心召开。三星向ODCC捐赠SITS (Samsung/ SSD Intelligent...

关键字: 三星电子 内存 固态硬盘 测试
关闭
关闭