软件测试学习笔记2
产品说明书:利用文字和图形描述产品的书面文档。
黑盒测试black-box testing=功能性测试functional testing=行为测试behavioral testing
黑盒测试是需要知道软件要做什么,而无法看到盒子里的软件是如何运行的。用某些输入可以得到某些结果即可。
白盒测试white-box testing=透明盒测试clear-box testing
软件测试员可以访问程序的代码,并通过检查代码的线索来协助测试(可以看到盒子里面)
白盒测试要冒一些风险,因为要以适应代码操作来定制测试,所以很容易形成偏见而无法进行客观测试。
静态测试(static testing):测试不运行的部分——只是检查和审核。
动态测试(dynamic testing):指通常意义上的测试——使用和运行软件
测试产品说明书属于静态黑盒测试。
测试产品说明书第一步不是马上钻进去找缺陷,二十站在一个高度上进行审查。审查产品说明书是为了找出根本性的问题、疏忽或遗漏之处。
优秀产品说明书应具有的8个重要属性:
完整
准确
精确、不含糊、清晰
一致
贴切
合理
代码无关
可测试性
动态黑盒测试:不深入代码细节测试软件。
测试员输入数据、接受输出、检验结果。
动态——程序在运行,测试员像用户一样使用它
黑盒——测试时不需要知道程序如何工作。
也常称为行为测试,因为测试的是软件在使用过程中的实际行为。
测试用例(test case):进行测试时需要使用的特定输入,以及测试软件的过程步骤。
没有产品说明书时使用探索测试——了解软件、设计测试、执行测试同时进行。
软件测试两种基本方法:
通过性测试(test-to-pass):确认软件至少能做什么,而不会考验其能力。用最简单最直观的测试用例。
失效性测试(test-to-fail)、错误强制测试:纯粹为了破坏软件而设计和执行的测试用例。蓄意攻击软件的薄弱环节。
选择测试用例的方法:等价类划分(equivalence partitioning)/等价分类(equivalence classing)
等价类划分是指分步骤的把海量(无限)的测试用例集减小得很小,但过程同样有效。
一个等价类或者等价划分是指测试相同目标或者暴露相同软件缺陷的一组测试用例。
寻找等价划分时,考虑把具有相似输入、相似输出、相似操作的分在一组。
等价类划分的目标:把可能的测试用例集缩减到可控制且仍然足以测试软件的小范围内。
等价类划分可能主观,两个人可能得出两组不同的等价划分,只要它们足以覆盖测试对象就都可以。
对数据进行软件测试,是检查用户输入的信息、返回的结果以及中间计算结果是否正确。
等价类划分的关键原则(以合理减少测试用例):
1、边界条件:
软件运行在计划操作界限的边界的情况。
如果要选择在等价划分中包含哪些数据,就根据边界来选择。
边界确定时考虑数据类型:数值、字符、位置、数量、速度、地点、尺寸
特征:第一个/最后一个、开始/完成、空/满、最慢/最快、最大/最小、相邻/最远、最小值/最大值、超过/在内、最短/最长、最早/最迟、最高/最低
突出边界条件时,一定要测试临近边界的有效数据,测试最后一个可能有效的数据,同时测试刚超过边界的而无效数据。
缓冲区溢出(buffer overrun)是由边界缺陷引起的,是造成软件安全问题的头号原因。(溢出主要原因:数据引用错误)
2、次边界条件(sub-boundary conditions)/内部边界条件(internal boundary conditions)
有些边界在软件内部,最终用户几乎看不到,但是软件测试员仍有必要进行检查。
ASCII 8位 能表示256种字符
UNICODE 16位 能表示65535种字符,其中21000多种是中国象形字
3、要考虑单独的等价划分用于处理默认值、空白、空值、零值或无输入等情况
4、非法、错误、不正确和垃圾数据
边界测试、次边界测试、默认值测试是通过性测试;垃圾数据是失效性测试。
除了数据测试还有状态测试——通过不用的状态验证程序的逻辑流程
软件状态(software state):软件当前所处的条件或者模式。
测试软件的逻辑流程
1、建立状态转换图
状态转换图应该标出:软件可能进入的每一种独立状态、从一种状态转入另一种状态所需要的输入和条件、进入或者退出某种状态是的设置条件及输出结果
2、减少要测试的状态及转换的数量
5种实现方法:
a、每种状态至少访问一次。
b、测试看起来是最常见和最普遍的状态转换。
c、测试状态之间最不常用的分支。
d、测试所有错误状态及其返回值。
e、测试随机状态转换。
3、具体测试
测试状态及其转换包括检查所有的状态变量(state variables)——与进入和退出状态相关的静态条件、信息、值、功能等。
失败状态测试
1、竞争条件和时序错乱
多任务(multitasking)指操作系统设计用来同时执行多个独立的进程。
2、重复、压迫和重负
重复测试(repetion testing):不断进行同样的操作。目的是检查是否存在内存泄漏(memory leaks)
压迫测试(stress testing):使软件在不够理想的条件下运行,eg.内存小、磁盘空间小等。观察软件对外部资源的要求和依赖的程度。
重负测试(load testing):尽可能提供条件任其发挥(与压迫测试相反,压迫是尽量限制软件),让软件处理尽可能大的数据文件。
其他黑盒测试技术
1、无经验用户:无测试规则,找到缺陷。
2、已经找到缺陷的地方再找
3、像黑客一样思考
4、凭经验、直觉、预感
静态白盒测试/结构化分析:再不执行软件的条件下有条理地仔细审查软件设计、体系结构和代码,从而找出软件的缺陷。
原因:1、尽早发现软件缺陷,找出动态黑盒测试难以发现或隔离的软件缺陷。2、为黑盒测试员设计和应用测试用例提供思路。
正式审查(formal review):静态白盒测试的过程。
正式审查4个基本要素:
1、确定问题:代码和设计的问题。
2、遵守规则:
3、准备:
4、编写报告
通用代码审查清单
1、数据引用错误:使用未经正确声明和初始化的变量、常量、数组、字符串或记录而导致的软件缺陷。
数据引用错误是缓冲区溢出的主要原因。
2、数据声明错误:不正确地声明或使用变量和常量。
3、计算错误:数学问题。
4、比较错误:大于小于等于不等于真假(很可能是由于边界问题)
5、控制流程错误:循环等控制结构未按预期完成
6、子程序参数错误:来源是软件子程序不正确地传递数据。
7、输入输出错误:
8、其他检查:
4个基本测试技术:静态黑盒(测试产品说明书)、动态黑盒(测试软件)、静态白盒(检查程序代码)、动态白盒
动态白盒测试/机构化测试(structural testing):利用查看代码功能(做什么)和实现方式(怎么做)得到的信息来确定哪些需要测试、哪些不需要测试、如何展开测试。
动态白盒测试不仅看代码运行情况,还包括直接测试和控制软件。
动态白盒测试包括4部分:
1、直接测试底层函数、过程、子程序和库:win中叫应用程序编程接口API
2、以完整程序的方式从顶层测试软件,但根据对软件运行的了解调整测试用例。
3、从软件获得读取变量和状态信息的访问权,以便确定测试与预期结果是否相符,同时强制软件以正常测试难以实现的方式运行。
4、估算执行测试时“命中”的代码量和具体代码,然后调整测试,去掉多余的测试用例,补充遗漏的用例。
动态白盒测试VS调试(debugging)
动态白盒测试的目标是寻找软件缺陷
调试的目标是修复缺陷。
单元测试(unit testing)/模块测试(module testing):在底层进行的测试
↓
集成测试(integration testing)
↓
系统测试(system testing)
自底向上测试(bottom-up)
编写测试驱动模块调用正在测试的模块。测试驱动模块以和将来真正模同样的方式挂接,向处于测试的模块发送测试用例数据,接受返回结果,验证结果是否正确。
优点:对整个软件进行全面测试,为他提供全部类型和数量的数据,甚至高层难以发送的数据。
自顶向下测试(top-down)
在进行白盒测试前,一定要根据说明书建立黑盒测试用例。用这种方式可以真正测试模块的功能和作用。
数据流(data flow)覆盖主要是指在软件中完全跟踪一批数据。
代码覆盖(code coverage):为了全面 测试,不仅要测试数据还要测试程序状态和程序流程,必须设法进入和退出每一个模块,执行每一行代码,进入软件每一条逻辑和决策分支。
代码覆盖是一种动态白盒测试,要求通过完全访问代码以查看运行测试用例时经过了那些部分。
eg.单步调试
代码覆盖=语句覆盖(statement coverage)=代码行覆盖(line coverage)
动态白盒测试作用:了解代码的内部细节可以消除冗余的测试用例,增加针对原先没有考虑到的区间的测试用例。
测试基础总结:
静态黑盒测试是指检查产品说明书,并在软件编写之前找出问题。
动态黑盒测试是指在不了解软件如何工作的前提下进行测试。
静态白盒测试是指通过正式审查和检验检查代码的细节。
动态白盒测试是指在看到软件的工作方式时,根据获得的信息对软件进行测试。