身为万千码农中的一员,程序中的bugs往往困扰着我们,给我们朴实无华的编程生活带来无尽的惊喜(惊吓)和感动(崩溃),下面结合我编程经历,分享一些调试经验。
1. 找bugs
当代码报错的时候,最重要就是出错提示,IDE会给我们提示errors有哪些,errors在哪些行,这往往是最有用的,但往往也是最有迷惑性的,当看到几十个error的时候,可能会有些崩溃,但是通常的经验而言,有两种常见的情况:(1)这众多的error所属同一类的可能性非常高,也就意味着当解决一个,其他的也就迎刃而解;(2)一个error引发其他error,由于存在函数的层次、嵌套调用,最底层的代码出现error(一般情况为传参失误,导致高层一系列错误),导致高层代码出错。
2. 软件测试思想
软件测试是一个发现错误的过程,核心思想“证伪”。软件测试最常用的是白盒、黑盒以及灰盒测试。白盒测试是在已知代码的情况下进行的测试,从而编写详细测试代码;黑盒测试是没有获得代码,从而处于“黑盒”状态,我们只可以使用程序的功能,所以黑盒测试是功能测试;灰盒测试结合了白盒和黑盒的特点,黑盒测试直接面向功能和需求,所以容易发现错误,但是我们无法提出解决bugs的方案,而白盒测试要求程序员清楚程序代码的逻辑和细节信息,工作量巨大而且要求比较高,灰盒测试最为常用,我们常常是先进行黑盒测试,再对代码进行白盒测试。
3. bug定位
在报错的行设置断点,然后debug的思路固然很好,但是有些程序往往不能进行调试,例如程序涉及多线程、事件触发等等,所以常用的解决方法如下:在报错的行前后写一些输出语句,核对前后的输出结果。我们需要验证的是:程序有没有执行进入这一分支(循环或这一行代码)、执行结果是否正确。所以常用的两种输出语句,第一类例如在报错前后输出print(“haha”)来验证程序有没有执行或进入这一部分(需要注意的是前后都要有,形成自己定义的一个测试域);第二类,类似第一类,在需要测试的域前后分别输出变量值,用来核对……这一方法虽然简单,但是非常实用,可以发现和解决大量错误,如果自己不能解决的话,在搜索引擎查找可以解决99.9%的问题。
4. 常用方法
(1)边界值分析
如果输入条件规定了值的个数,则用最大个数、最小个数、比最小个数少一、比最大个数多一的数作为测试数据。用来验证值的边界部分。
(2)专业的软件自动化测试软件
例如PC-Lint用来做C/C++静态测试,Junit进行Java单元测试,QTP:功能测试(QTP需要VBScript基础),Eclemma:用测试覆盖率评价测试代码的质量……
5. 软件测试整体流程
(1)单元测试:分模块测试;
(2)集成测试:模块间的集成;
(3)确认测试:确认功能;
(4)系统测试:验证系统是否满足需求规格定义;
(5)验收测试:用户在测试人员的协助下对系统进行测试和接收;
(6)回归测试:修改了旧代码后,重新进行测试以确认修改没有引入新的错误。
结合软件测试各阶段的思想,进行软件测试从而发现bugs,祝大家都有所收获,解决所有bugs。