【JS-task4】如何验证程序是否完成,测试以及修正Bug?
分享人:田迪生
目录
1.背景介绍
2.知识剖析
3.常见问题
4.解决方案
5.编码实战
6.扩展思考
7.参考文献
8.更多讨论
在日常中,我们码代码都是按照需求来的,为了验证我们的工作成果是否符合项目的需求,那么验证程序是否完成、测试以及修复bug就成了我们工作中非常重要的流程。
1.什么样的程序是完成的程序
2.测试的分类
3.一些测试的概念
1.什么样的程序是完成的程序
- 从需求的角度看:满足用户的全部需求
- 从程序的角度看:代码不存在明显bug,结构明晰,逻辑通顺,有一定的优化
- 从UI图的角度看:较为完美的还原了UI图的设计
- 从后期版本维护迭代的角度看:注释完备,稳定性好,不加班的代码就是好代码
2.测试的分类
测试:测试是使用人工操作或者软件自动运行的方式来检验它是否满足规定的需求或弄清预期结果与实际结果之间的差别的过程。
软件测试的方法
- 按照测试范围,可以分为模块测试和整体联调
- 按照测试条件,可以分为正常操作情况测试和异常情况测试
- 按照测试的输入范围,可以分为全覆盖测试和抽样测试
- 按照测试方式
- 模块测试:针对设计中的一个一个模块来进行测试的,目的是保证每个模块作为一个单元能正确运行,所以模块测试通常又被称为单元测试。在这个测试步骤中所发现的往往是编码和详细设计的错误。
- 整体联调:测试模块间接口的正确性、各模块间的数据流和控制流是否按照设计实现其功能、以及集成后整体功能的正确性。
- 正常操作情况测试:根据正确的操作流程对单独的模块或整体进行测试,确定被测对象可以良好运行
- 异常情况测试:异常情况,可能会包括数据库异常,系统异常,用户异常操作等情况
3.一些测试的概念
- 成熟性:软件产品要避免由软件中错误而导致失效的能力
- 容错性:在软件失效或者违反规定的接口的情况下,软件产品维持规定的性能级别的能力
- 易恢复性:在发生故障的情况下,软件重建规定的性能级别并恢复受直接影响的数据的能力
- 可靠性依从性:软件产品依附于同可靠性相关的标准、约定或规定的能力
- 全覆盖测试:对于被测对象全面,整体,多维度的测试,受限于时间和人力成本,除非被测对象级别很高,不然不会采用这种测试方式
- 抽样测试:针对功能及模块随机抽取被测对象
老大在知乎上的回答:
- 确认Bug是否在本地可以重现。
- 确认Bug在哪一段代码中。
- 去除掉所有无关代码,只去调试和Bug相关的代码。
- 和之前正常运行的版本对比,尝试恢复到之前可以正常运行的代码
- 重新写一个小Demo,确认是否可以正常运行,可以的话,移动代码到原有的代码中。
- 如果本地无法重现,打日志,观察线上行为。
- 重启服务,重启IDE,重启笔记本,重启服务器。
- 跟产品经理说这个Bug解决不了,花费的代价很大,不值得。
张明云在知乎上的回答:
解决问题的流程:了解问题→定位问题→分析问题→解决问题→验证问题
- 借助搜索引擎:遇到有明显的异常信息,且自己并不熟悉为什么异常时,最高效的解决方法是借助搜索引擎,这里的搜索引擎一定是谷歌,不是百度;借助搜索引擎能解决工作中的大部分bug,你要相信,全世界这么多开发人员,你遇到过的大多数问题其他人也遇到过;
- 打印调试法:这是最笨但最有效的办法,人会说谎、断点调试可能会说谎,但日志一定不会说谎;
- 二分排除法:当你遇到随机问题、帮助他人解bug或者遇到自己不熟悉的代码时,通过屏蔽一部分代码,运行观察问题仍然存在,如果存在则进一步分析屏蔽一部分代码,直到定位到有问题的具体位置为止,这种方法能解决工作中的很大一部分疑难杂症;
- 小黄鸭调试法:当你向某个对象陈述你的思路时,往往会有意想不到的结果,哪怕对方并不是一个生物;
- 断点调试法:受限于效率不高以及在多线程环境下断点调试并不灵,有必要时才考虑用这种方法;通常可以使用打印调试法来代替;
- 线上求助:包括论坛提问、RTX和微信群提问等;不到万不得已不要用这种办法,在有限的圈子里面,你遇到的一个具体技术问题很有可能其他人并没有遇到过,多数时候问了也是白问,但有时候也可能是一种有效的方法。
什么是小黄鸭调试法?
小黄鸭调试法,又称橡皮鸭调试法、黄鸭除虫法(Rubber Duck Debugging)是可在软件工程中使用的一种调试代码的方法。方法就是在程序的调试、除错或测试过程中,操作人耐心地向小黄鸭解释每一行程序的作用,以此来激发灵感与发现矛盾。
此概念是参照于一个故事。故事中程序大师随身携带一只小黄鸭,在调试代码的时候会在桌上放上这只小黄鸭,然后详细地向鸭子解释每行代码。许多程序员都有向别人提问及解释编程问题的经历,而目标甚至可能是完全不懂编程的人。而就在解释的过程中,程序员可能就发觉了问题的解决方案。一边阐述代码的意图,一边观察它实际上的意图并做调试,两者间的任何不协调都会变得更明显,使人更容易发现错误所在。如果没有玩具小鸭,操作人也可以向其他任何东西倾诉,比如桌上的盆栽、键盘/鼠标等。
- 软件开发流程
- 测试分析中对异常情况考虑
- 老程序员解bug有那些通用套路
如何避免写出bug?
改动代码时要考虑到对其他模块的影响;思考问题要全面,考虑到可能发生的各种情况;从其他地方找到的代码要弄清楚原理,了解这个知识点,再用到自己的项目中。
语法:
return[()[expression][]];
可选项 expression 参数是要从函数返回的值。如果省略,则该函数不返回值。
用 return 语句来终止一个函数的执行,并返回 expression 的值。如果 expression 被省略,
或在函数内没有 return 语句被执行,则把值 undefined 赋给调用当前函数的表达式。