1、概念

1、软件缺陷(bug)的根源来自于软件开发本身

2、软件失效是指软件运行时产生的一种不希望或不可接受的外部行为

3、软件失效的机理可描述为:软件错误→软件缺陷→软件故障→软件失效

4、缺陷引入:程序员引入的缺陷,运行环境导致的缺陷

5、预防和检测

(1)缺陷预防-开发角度

(2)缺陷检测-动态测试

a.自动化测试(缺点:维护自动化测试代码需花费大量时间;优点:重复使用率高,提高测试速度;致命弱点:“预言家难题”,很难预估测试完成情况)

b.手工测试

6、测试目标:软件发布前,所有重要的任务都完成了,而剩下没做的事情都是比较次要的(不影响用户的使用和愉悦感)

7、软件执行的4个基本任务:接收输入、产生输出、存储数据、进行运算

2、手工测试

1、优点:更接近真实场景,容易发现与应用程序业务逻辑(实现用户需求的代码)相关的缺陷

2、缺点:效率低,没有规律,不可反复使用

3、测试脚本:记录了实际运行哪些测试;适用于指定场景,且输出结果可判断

3、探索式测试

1、完全抛开测试脚本

2、测试结果、测试实例、测试文档都会在运行测试时创建

3、记录结果的最佳工具:截屏软件、记录击键的软件

4、使用含有调试信息的软件版本(debug build)、调试器(debugger)、代理程序(proxy)

5、最适用于:“敏捷开发过程”的Web应用程序

6、缺点:可能在测试中找不到重点,盲目测试,浪费大量时间,效率低下

7、指导方法:局部探索式测试法(辅助测试人员在测试过程中即时做出决定)、全局探索式测试法(用于帮助测试人员设计整体测试计划和测试策略)

8、全神贯注,集中精力

9、目标:理解应用程序如何工作,其接口看起来如何,实现了哪些功能;强迫软件展示其全部能力;找到缺陷

4、局部探索式测试法

1、面临选择抉择时使用探索式测试的策略(局部小范围),例如:一个网页,一个对话框,某个类的一个方法

2、好处:测试人员不需要知道很多信息就可以完成细节任务

3、重点:把测试经验、专业知识、软件在操作环境下如何构建和运用的知识结合在一起

4、决策

(1)输入(input)

a.一般定义:输入指的是由环境产生的一种刺激,该刺激导致被测试的应用程序有所响应

b.分为两类:

b1.原子输入(atomic input)- 建议使用“等价类划分”,简单到不能再简单的事件,例如:单击按钮,字符串或整数4

b2.抽象输入(abstract input)- 非法输出(illegal output)

c.影响因素:各种输入之间会相互影响,从而造成软件失效;输入这些值时的先后顺序也会导致问题

d.正向测试(postive testing)

e.逆向测试(negative testing)

f.依据开发人员的思路来构建一个非法输入值,牢抓错误信息(开发在哪些地方编写了错误处理(error-handling)代码,具体错误代码是如何实现的)

g.开发人员有三种基本方式,定义错误处理程序(error handle)

g1.输入筛选器(input filter)- 防止非法的输入值被传递给应用软件的功能代码;是否正确实现了该功能(非法输入和合法输入的区分是否错误),是否可以绕过筛选器

g2.输入检查(input check)- 是应用程序代码的一部分,通常使用类似if、then、else结构的语句实现(或case、select结构,或lookup table)

g3.使用异常(exception)- 异常处理代码把整个routine当成一个整体看待,检测其上发送的任何一个错误

h.常规输入/非常规输入

i.默认输入/用户手动输入(null、删除默认值、默认值附近的其他值)

j.根据输出指导输入选择

j1.先明确功能后确实哪些输入会引发相应输出:明确期望输出结果,考察所有用户场景,观察如何生成期望结果(主动);先观察输出结果,再选择新的输入,并保证新输出与原先不同

j2.抽象角度:非法输出(illegal output);合法输出(lega output)

(2)状态(status)

a.定义:软件的一个状态就是状态空间的一个点,它是由所有内部数据结果的取值来唯一确定

b.软件状态可以看成是用于描述软件记住过去发生的所有输入和输出的一种方式

c.数据辖域:检验软件是否正确实现了数据辖域是一个很重要的测试

d.输入和状态相结合:使用状态信息来帮助寻找相关的输入;使用状态信息来辨别重要的输入序列,当一个输入导致状态信息被更新时,紧接着多次使用同样的输入会导致一连串的状态变化,状态变化被累加,必须考虑是否会溢出(例购物车)

(3)代码路径(code path)

a.一条代码路径就是一连串的代码语句,其起始于开始语句,终止于结束语句

b.必须明确知道程序里可能有哪些分支,并理解哪些输入会导致软件走这条分支而不是另一条

(4)用户数据(user date)- 被动的方式

a.创建一个含有特定数据的数据存储,其含有的数据应该和软件真实用户使用的数据尽量相似

(5)执行环境(execution environment)- 主动的方式

a.使用的操作系统和其当前配置,任何可以影响被侧软件行为的因素都是运行环境的一部分

b.提供输入,接收输出

5、全局探索式测试法

1、确定了如何对软件进行探索式测试的整体方向

例如:

单个单独的测试用例应该覆盖软件的哪些功能

哪些软件的功能必须放在一起测

应该先测哪个功能

如何决定哪个功能先测,哪个后测

一个项目中多人测试,应该使用怎样的测试策略,确保相辅相成

2、漫游测试

(1)商业区测试类型

a.用户所要使用的热门的软件特性和功能

b.方法

b1.指南测试法 – 根据用户手册

b2.卖点测试法 – 出席销售人员给客户的演示会,与销售人员保持良好合作关系

b3.地标测试法 – 确定关键的软件特性,再确定其先后顺序

b4.极限测试法

b5.快递测试法 – 专注于数据,确认那些被存储起来的输入数据并“跟随”它们走遍软件

b6.深夜测试法 – 检测休息时间软件是否正常运行(盲区)

b7.遍历测试法 – 选定一个目标(例如所有菜单项),使用可以发现的最短路径来访问

(2)历史区测试类型

a.针对老功能和缺陷修复代码

b.方法

b1.恶邻测试法 – 对bug聚集地的邻近功能使用遍历测试法进行测试,验证已修代码未引入新bug

b2.博物馆测试法 – 找出遗留代码和老的可执行文件,确保其在测试中正常运行

b3.上一版测试法

(3)娱乐区测试类型

a.测试辅助功能,确保辅助和主线特性结合

b.方法

b1.配角测试法 – 紧邻主要功能的特性

b2.深巷测试法 – 最不可能被用到或者最不吸引用户的特性

b3.通宵测试法 – 连续不断地使用某些特性或将文件一直保存在打开的状态

(4)旅游区测试类型

a.快速访问软件的各种功能

b.方法

b1.收藏家测试法 – 收集软件的输出,越多越好,到达所有可到达的地方并把观察到的输出结果记录下来,以小组为单位

b2.长路径测试法 – 到达目的地之前尽量多地在应用程序中穿行

b3.超模测试法 – 测试界面、外观、性能、是否与期望符合、是否标准

b4.测一送一测试法 – 测试同时运行同一应用程序多个拷贝的情况

b5.苏格兰酒吧测试法 – 适用于大规模的复杂应用程序,找到用户组并参与讨论,花时间了解待测应用程序

(5)旅馆区测试类型

a.经常被忽视或者在测试计划中较少描述的次要及辅助功能

b.方法

b1.取消测试法 – 启动操作然后停止它,确信被取消的操作可以再次执行并成功结束

b2.懒汉测试法 – 尽量少的操作

(6)破旧区测试类型

a.试图利用每个可能的机会暗中破坏程序(故障注入,抓捕漏洞)

a1.强迫软件做一些操作

a2.掌握软件成功完成操作必须使用的资源

a3.在不同程度上移除那些资源或限制使用那些资源

b.方法

b1.反叛测试法 – 要求输入最不可能的数据,或故意恶意输入

总结:

逆向测试法 – 最不可能的数据,测试容错能力

歹徒测试法 – 如何处理非法输入,突破限制

错序测试法 – 错误的顺序

b2.强迫症测试法 – 重复输入、重复操作

6、混合探索式测试技术

1、使用正式脚本可以为探索式测试设立一个明确的框架,探索式测试法可以提高脚本测试的有效性,为脚本中的测试用例提供更多种多样的变化

2、基于场景的探索式测试

3、有价值的场景包含

(1)讲述用户故事 – 记录用户使用软件的动机、目的以及具体动作

(2)描述需求

(3)演示产品功能 – 经常出现在在线帮助和用户说明书中

(4)演示集成场景 – 定义了功能集成后的场景或端对端的场景

(5)描述设置和安装

(6)描述警告和出错情形

4、场景操作 – 对场景的步骤加以操作,给场景注入变化

5、衍生场景 – 对现有场景进行操作时,会得到一个新的场景

6、通过(静态)场景操作注入变化

(1)插入步骤(延长场景)

a.增加更多数据 – 例,场景要求在购物车中放入一件商品,测试人员可以先加入那件,再加入其他

b.使用附加输入 – 增加没有被提到的额外输入值,有关联但属于附加。例,要求能添加评论,测试人员可以额外对其他用户的评论进行登记评分

c.访问新的界面 – 增加相关的新操作

(2)删除步骤(化繁为简,尽量减少)

(3)替换步骤(先删后插)

(4)重复步骤(重复单独的操作,例查询)

(5)替换数据 – 理解应用程序连接和使用的数据源,确保其交互稳定

(6)替换环境 – 尽量接近用户场景

a.替换硬件

b.替换软件

c.替换版本

d.修改本地设置

7、通过漫游操作注入变化 – 漫游通常比场景操作产生更长的操作步骤(顺路)

(1)卖点测试法 – 可以假如新功能

(2)地标测试法

(3)极限测试法

(4)深巷测试法 – 可注入新功能

(5)强迫症测试法

(6)通宵测试法

(7)破坏测试法

(8)收藏夹测试法

(9)超模测试法

(10)配角测试法 – 最近邻的选择

(11)取消测试法

(12)混票测试法 – 从一个场景跳到另一个,从而把两个或更多场景结合为一个具有混合目的的场景

7、实践中的探索式测试

1、出租车测试法

要到达所需的屏幕、对话框或一些其他功能组件,用户通常有大量的路线可以选择

测试人员需要熟悉到达指定位置的每条可能的路径

例:使用多种方式打开某一功能

2、多元文化测试法 – 多语言测试

8、测试需培养的方向

1、明确目的

(1)决定测试什么 – 从不同的深度和顺序检测,列出特性的功用

(2)决定何时测试 – 明确每个缺陷应该在什么时候被发现

(3)决定如何测试 – 将缺陷类别和漫游方法/测试技术相联系,明确某些缺陷最适合的方法

2、降低重复性

(1)知道已经运行过哪些测试 – 变化测试目标、测试要点

(2)知道什么时候注入变异 – 通过改变技术调整测试用例

3、降低暂时性

结合实际 – 真实环境、真实数据,用户介入

4、将单调变有趣

花时间进行测试分类和测试策略,减少测试运行时间(枯燥部分)

5、解决健忘

(1)测试用例不是解决暂时记忆的最好方法

(2)将漫游方法映射到软件特性和缺陷上,留下相关产品记录(结合实际练习)

喜欢软件测试的小伙伴们,如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一 键三连哦!