软件测试
测试:在规定的条件下操作程序,以发现错误,对软件质量进行评估。
对象:程序,数据,文档。
目的:发现错误,看是否满足用户需求,发现错误产生的原因(不能分析其质量好坏)。
嵌入式硬件一般用专门测试仪器测试,软件除了逻辑正确性外,还看中系统的性能和健壮性,实时性,软硬结合分析。
测试方法
动态:黑盒,白盒,灰盒。
-
黑盒:测试程序功能,把程序视作一个黑盒子。
-
白盒:透明白盒,测试代码具体逻辑。
-
灰盒:两者结合,系统测试常用。
静态:桌前检查,代码审查,代码走查。
- 桌前检查:开发人员自己审查。
- 代码审查:开发人员和测试人员人工审查。
- 代码走查:提供测试用例的检查。
等价类划分:比如程序输入11000,其实210是等价的,测试一个典型的就行。
边界值分析:边界。
错误推测:可能什么地方出错。
因果:对于复杂的程序输入联系,比如约束、组合等关系,用等价类和边界值难以表达的情况。
逻辑覆盖测试要理解每一个覆盖,以及其对应需要多少测试用例。
这里对于各种判断的理解参考这篇文章:动态白盒测试——逻辑覆盖测试法_深秋红枫的博客-CSDN博客
例:
语句覆盖 sc:所有语句(方形的)都被执行过一次,并不是所有情况都被执行过一次。所以两个判断可以是TT FF 或者 TF FT这类,2个测试用例。
判定覆盖/分支覆盖(DC):每个判断里都被执行过一次,还是TT FF 或者TF FT这类就能满足。
条件覆盖:所有逻辑判断(也就是单个的逻辑条件)至少被满足过一次。也就是x>0 x<0 y>0 y<0 magic>0 magic<0都至少有过一次。
条件判定覆盖:条件和判定覆盖都满足。
条件组合覆盖:每个条件语句中所有可能的情况都要出现过,也就是x>0 y>0,x>0 y<0, x<0 y>0, x<0 y<0和magic>0 magic<0的组合都有过,不同条件覆盖里的语句无需组合。
路径覆盖:只要流程图中所有可能的情况都出现过。也就是两个if为TT,TF,FT,FF的情况。但是从图中可以看出,如果x y>0,magic=x+y+10也一定>0,因此x>0 y>0 magic<0也就是TF这种情况不可能出现。所以只有三种情况。
修正条件判定覆盖:
- 所有可能的输出结果都出现。
- 改变众多条件中的一个条件,就能影响判定的结果。
例题:程序
{
if(A&&(B||C))
return true;
}
首先条件组合覆盖所有可能:ABC是000,001,010,011,100,110,111.
语句覆盖:只要为true就能全部执行。1条用例即可。
覆盖所有可能,只需要0结果的一个,1结果的一个就行。但是另一个要求是:测试用例中存在只改变一个输入的用例,而且改变这一个用例可以使得结果改变。
000怎么改变也不会改变结果。
001改成101就可以了,26可以拿出来。
以此类推。
改变A改变结果:26,37,48.
改变B改变结果:57.
改变C改变结果:56.
因此最少需要囊括的是:5,6,7,3.
测试阶段,测试级别
单元测试:代码测试,比如白盒测试法。
集成测试:模块组合测试。增量式组组装就是先测一部分,再逐渐集成新的模块,可以从顶层或者底层开始。如白盒测试。
- 驱动模块:开发出来用于驱动测试的。
- 桩模块:临时开发出来提供给被测模块调用的。
确认测试:
- 验收测试:用户对项目验收测试,看是否符合软件需求规格说明书 srs。
- alpha 测试:开发环境下测试,通过了才能到beta。
- beta 测试:用户实际使用环境测试。通过后才能发布。
系统测试:系统放到实际环境中,测试性能。如灰盒测试。
调试
交叉调试必不可少。调试器和北条氏程序在不同机器上,有某种通信方式建立联系,目标机上通常有协助调试器运行的代理。
调试可以控制程序运行,并修改内存、寄存器、变量等信息。
直接测试:宿主机-目标机
调试监控器法:宿主机上的调试器通过JTAG等下载到目标机的监控器上。
ROM仿真器法:插在目标机上,仿真一个只读的ROM,连接宿主机。
在线仿真器法:仿真CPU。
片上调试法:通过JTAG接口可以取得单片机上的一些寄存器值。现在一般都支持调试和运行两个模式。
模拟器法:都在开发平台上,完完全全模拟硬件。
调试和测试的区别:测试是找出错误,调试是定位错误并修改程序,以达到预期的结果,在测试之后。
软件评审
验证与确认
注重过程和结果。