今天参加了软件评测师考试,趁着热乎劲,总结下软件测试的相关知识。
软件测试原则
1.所有的软件测试都应追溯到用户需求。
2.应当把“尽早地和不断地进行软件测试”作为软件测试者的座右铭。
3.完全测试是不可能的,测试需要终止。
4.测试无法显示软件潜在的缺陷。
5.充分注意测试中的群集现象。
6.程序员应避免检查自己的程序。
7.尽量避免测试的随意性。
软件测试对象
根据软件的定义,软件包括程序、数据和文档。
所以,软件测试并不仅仅是程序测试,还应包括相应文档和数据的测试。
软件测试分类
- 按照开发阶段划分:单元测试、集成测试、系统测试、确认测试以及验收测试。
常见的单元测试工具:Java JUnit、Python unittest
- 按照测试技术划分:白盒测试(white-box testing)、黑盒测试(black-box testing)以及灰盒测试(gray-box testing)。
- 根据是否需要执行被测试代码划分:静态测试(static testing)和动态测试(dynamic testing)。
静态测试指不运行被测程序本身,仅通过分析或检查源程序的文法、结构、过程、接口等来检查程序的正确性。
动态测试是指通过运行软件来检验软件的动态行为和运行结果的正确性,主要是对软件的逻辑、功能等方面进行评估。
测试停止准则
1.测试用例全部执行结束
2.测试覆盖率达到要求
3.测试超出了预定时间
4.查出了预定数目的故障
5.执行了预定的测试方案
白盒测试
用于确认程序结构逻辑的正确性。
逻辑覆盖法
语句覆盖
语句覆盖(Statement Coverage,SC):选择足够多的测试数据,使被测程序中每条语句至少执行一次。
判定覆盖
判定覆盖(Decision Coverage,DC):设计足够的测试用例,使得被测程序中的每个判定表达式至少获得一次“真值”或“假值”,从而使程序的每一个分支至少都通过一次。
条件覆盖
条件覆盖(Condition Coverage,CC):构造一组测试用例,使得每一判定语句中每个逻辑条件的可能值至少满足一次。
条件/判定覆盖
条件/判定覆盖(Condition/ Decision Coverage,CDC):设计足够的测试用例,使得判定中每个条件的所有可能(真/假)至少出现一次,并且每个判定本身的判定结果(真/假)也至少出现一次。
条件组合覆盖
多条件覆盖,也称条件组合覆盖(Multiple Condition Coverage,MCC):选择足够的测试用例,使得每个判定中条件的各种可能组合都至少出现一次。
修正条件/判定覆盖
修正条件/判定覆盖(Modified Condition/ Decision Coverage,MC/DC):设计适当数量的测试用例,保证在一个程序中每一种输入输出至少得出现一次,在程序中的每一个条件必须产生所有可能的输出结果至少一次,并且每个判断中的每个条件必须能够独立影响一个判断的输出,即在其他条件不变的前提下仅改变这个条件的值,而使判断结果改变。
基本路径测试
在程序控制流图的基础上,通过分析控制构造的环路复杂度,导出基本可执行路径集合,从而设计测试用例的方法。
程序的环路复杂度是程序中每个可执行语句至少执行一次所需要的测试用例数目的上限。
1 | 程序的环路复杂度V(G)=边数-节点数+2 |
黑盒测试(功能测试)
用于确认软件功能的正确性和可操作性。
等价类划分法
- 确定等价类的原则:
1.如果规定了输入数据的取值范围或值的个数,可以确定一个有效等价类和两个无效等价类。
例如,如果规定输入值a的取值范围为1~99,那么可以得到一个有效等价类{a|1<=a<=99}和两个无效等价类{a|a<1}、{a|a>99}
2.如果输入条件规定了输入值的集合或者规定了“必须如何”的条件,则可以确定一个有效等价类和一个无效等价类(该集合有效值之外)。
例如,如果规定输入值b为奇数,那么可以得到一个有效等价类{b|b是奇数}和一个无效等价类{b|b不是奇数}。
3.如果规定了一组输入数据(假设包括n个输入值),并且程序要对每一个输入值分别进行处理,可以确定n个有效等价类和一个无效等价类。
例如,如果规定输入值x的取值为1,2,3三个数之一,那么可以得到3个有效等价类{x|x=1}、{x|x=2}、{x|x=3}和一个无效等价类{x|x≠1,2,3}。
4.如果规定了输入数据必须遵守的规则或限制条件,可以确定一个有效等价类(符合规则)和若干个无效等价类(从不同角度违反规则)。
例如,如果规定输入值A是最多保留两位小数的正浮点数,那么可以得到一个有效等价类{A|A是最多保留两位小数的正浮点数}和三个无效等价类{A|A不是浮点数}、{A|A不是正浮点数}以及{A|A是多于两位小数的正浮点数}。
- 编写测试用例
如果输入全部都来自有效等价类,则从每个有效等价类选取一个代表元素作为输入;
如果要考虑无效等价类,则每次只选取一个无效等价类,其余输入都从有效等价类中选取。
边界值分析
边界值分析法是对输入或输出的边界值进行测试的一种黑盒测试方法。
通常边界值分析法是作为对等价类划分法的补充,这种情况下,其测试用例来自等价类的边界。
长期的测试工作经验告诉我们,大量的错误是发生在输入或输出范围的边界上,而不是发生在输入输出范围的内容。
用边界值测试方法设计测试用例,首先应确定边界情况。
通常输入和输出等价类的边界,就是应着重测试的边界情况。
应当选取正好等于,刚刚大于或刚刚小于边界的值作为测试数据,而不是选取等价类中的典型值或任意值作为测试数据。
负载压力测试
负载压力测试是指在一定约束条件下测试系统所能承受的并发用户量、运行时间、数据量,以确定系统所能承受的最大负载压力。负载压力测试包括负载测试、压力测试、并发性能测试、疲劳强度测试、大数据量测试等内容。
常用工具:Apache JMeter、LoadRunner
负载测试
负载测试是通过逐步增加系统负载,测试系统性能的变化,并最终确定在满足性能指标的情况下,系统所能承受的最大负载量的测试。
压力测试
压力测试是通过逐步增加系统负载,测试系统性能的变化,并最终确定在什么负载条件下,系统性能处于失效状态,以此来获得系统能提供的最大服务级别的测试。
通俗地讲,压力测试是为了发现在什么条件下系统的性能会变得不可接受。
可见,压力测试是一种特定类型的负载测试。
并发性能测试
逐渐增加并发用户数负载,直到系统的瓶颈或者不能接收的性能点,通过综合分析交易执行指标、资源监控指标等来确定系统并发性能的过程。
疲劳强度测试
通常是采用系统稳定运行情况下能够支持的最大并发用户数,或者日常运行用户数,持续执行一段时间业务,保证达到系统疲劳强度需求的业务量,通过综合分析交易执行指标和资源监控指标,来确定系统处理最大工作量强度性能的过程。
大数据量测试
大数据量测试包括独立的数据量测试和综合数据量测试。
独立数据量测试是指针对系统存储、传输、统计、查询等业务进行的大数据量测试;
综合数据量测试是指和压力测试、负载测试、疲劳强度测试相结合的综合测试。
Web应用测试
页面设计测试
页面测试可以从以下几个方面进行:
1.页面的一致性如何;
2.在每个页面上是否设计友好的用户界面和直观的导航系统;
3.是否考虑多种浏览器的需要;
4.是否建立了页面文件的命名体系;
5.是否充分考虑了合适的页面布局技术,如层叠样式表、表格和帧结构等。
链接测试
首先,测试所有链接是否按指示的那样确实连接到了该链接的页面;
其次,测试所链接的页面是否存在;
最后,保证Web应用系统上没有孤立的页面。所谓孤立页面是指没有链接指向该页面,只有知道正确的URL地址才能访问。
图形测试
主要检查点如下:
1.颜色饱和度和对比度是否合适;
2.需要突出的链接的颜色是否容易识别;
3.是否正确加载所有的图形。
表单测试
1.检查每个字段的所有验证;
2.检查字段的缺省值;
3.检查表单中的错误输入,是否有错误提示;
4.提交操作的完整性。
兼容性测试
平台兼容性和浏览器兼容性
测试浏览器的兼容性可以与操作系统的兼容性结合起来,最有效的方法是创建一个兼容性测试矩阵。
平台\浏览器 | IE(7,8,9,10) | Chrome | Firefox | Safari | … |
---|---|---|---|---|---|
Windows (XP,7,8,10) | |||||
Mac | |||||
Linux | |||||
… |
安全性测试
功能验证
采用软件测试中的黑盒测试方法,对涉及安全的软件功能进行测试,验证所提供的功能是否有效。
漏洞扫描
借助于特定的漏洞扫描工具,在安全漏洞造成严重危害前,发现漏洞并加以防范。
模拟攻击试验
模拟攻击试验是一组特殊的黑盒测试案例,通过模拟典型的安全攻击来验证软件或信息系统的安全防护能力。
侦听测试
通过典型的网络数据包获取技术,在系统数据通信或数据交互的过程中,对数据进行截取分析,从而发现系统在防止敏感数据被窃取方面的安全防护能力。