测试通常刚开始时门槛很低,但是想要走到更高的地方还需要很多努力。是一个上山的过程。要求我们在参与每一个项目的时候,都要完成两部分的任务。第一部分的任务是保证当前的测试项目获得成功。第二部分的任务是学习应该做些什么以便使下一个测试项目更加容易。称作测试今天的项目,准备明天的项目。
要做到这点,需要关注三个方面,分别是重复,技术,漏洞。
重复,做一件事,绝对不要重复两次而不意识到或质疑这其实是一个问题。测试自动化是解决重复劳动的答案。
技术,在测试中找到每一个缺陷都说明我们的测试流程正在有效工作。应该从一次成功的测试中总结分析。保证成功的原因就是一系列的测试技术,测试工具,建议,可以提高我们工作的效率。
漏洞,需要拥有一种本身不含缺陷的缺陷查找技术。不断改进我们的流程,检查我们的流程。
测试之山爬到顶峰,必定是一个使用各种工具的高手,也是过去信息,分析信息的高手。上到顶峰后,就要下山了,下山的过程是帮助更多人的过程,要在测试上仔细观察,洞察先机,找到瓶颈并改进团队中所有其他人的工作方式。这样的人称为系统架构师。也是我想要成为的那种人。
软件测试的戒律
1使用大量输入反复锤炼程序
输入最终都可以归结成函数的参数,但是对于黑盒测试而言,可能无法看到参数。对界面而言,可能是各种输入的值,各种操作及它们的组合。对于服务而言,就是各种数值和状态的设置个变化。
2贪图别的应用程序,不要孤立的验证一个应用程序。
3清楚知道给定特定输入和环境组合的条件下,程序应有的行为。
4不要过分纠结一个只出现一次的问题
5将智能和自动化结合起来,就是模型的测试。测试模型
6利用开发人员的过错
开发人员可能一直犯同一类错误
7醉心于应用程序谋杀
一个问题背后可能隐藏着另一个问题,找到一个问题后,不要着急停下,要继续探索。
8不要抱怨发布日期,而是提前警告后果,这是我们应该担心的范围。
9可以关注代码。
向测试人员一样阅读源代码。找到错误处理代码和能为我们指明错误代码正在执行的对话框。花时间理解代码中写了哪些错误处理,哪些输入能触发他们,这样能帮助我们明确需要执行哪些测试。
强制程序出现错误信息,是执行错误处理代码最好的方法。需要理解应用程序如何回应错误的输入。
将忽略的缺陷找出来,看看为什么忽视了,缺陷是一种财富,教会我们什么地方做错了。
各种软件开发方法都是在教我们使用正确的工作方法,但是在软件行业可能还不太合适。
分析我们的缺陷,从一个缺陷开始,反推出一个有效的流程。具体如下:
收集那些没测试出来的问题,分析这些问题,该如何测试,才能避免这些问题。
既然不能理解如何正确开发软件,就让我们理解自己是如何做错的,然后停止那样做。作为结果的系统知识无法告诉我们应该如何开发软件,但是它可以告诉我们什么是不该做的。
帮助开发人员理解程序中出现的问题和原因,减少他们工作中犯的错误,使他们更好的工作。
软件测试的真正价值并不提现在代码中找出了多少缺陷,而是发现设计和编程人员解决问题方法上的局限,思路中的狭隘和技能方面的不足。
作者支持手工测试
认为人类虽然没法更快的测试,但是可以更聪明的测试。
真正复杂的软件缺陷需要结合系统自身的全局,所处的环境,用户使用历史等其他各方面才能找到,这些软件缺陷通常跨越了代码模块各自的界限。
困扰自动化测试的是上下文场景问题,也无法覆盖应用程序出错的大多数情况。要找出软件缺陷,避免它们跑到客户桌面上,唯一的方法就是创造出与客户所处环境一模一样的运行环境,在那里运行软件来重现软件出错时的数据和状态。
手工测试分为两种,一种是依据用例测试,一种是探索测试。探索测试中可以使用截屏工具和键盘记录工具。
工作的一部分是应该做好但是没做好的,就是将测试推入设计和开发流程,并且教育公司的其他人,软件质量意味着什么,怎么提高软件质量。
自由式探索式测试:没有任何规则,只是不停去做。更像是探索,而不是测试。
基于场景的探索式测试:开始点是用户故事或是文档化的端端的场景,是我们希望用户开始执行应用程序的地方。使用脚本记录用户的主要执行路径,测试任务是完成给出的场景。
基于策略的探索式测试:
基于反馈的探索式测试:
让设计者参与测试才是我们的未来
当测试和测试技术转移到开发流程的早期时,测试人员做的工作更类似于软件设计人员,确定开发流程中的测试需求,监测和衡量自动化测试的效用,审核已有的测试用例状态,把软件测试抽象到更高层次,并在开发周期的早期进行这一工作。使以设计为中心的测试成为可能。
代码一般分为基础结构代码和业务逻辑代码。手工测试能更高的测试业务逻辑,自动化测试擅长低级别的细节。选择什么类型的测试方式取决于期望找到什么样的软件缺陷。
针对每种功能建立用例库
测试用例由于可以重复使用,是软件测试中知识积累的基础
探索式测试具有的一个关键优势,就是鼓励测试人员一边测试一边计划,使用测试中得到的信息,影响自己进行测试的实际方式。
测试用例重用,需要按照特征层面写用例,比如日期功能,用户名密码验证功能。这样的用例更容易转换。当粒度足够小时,叫做测试原子,然后组合成分子,如果可以携带环境,将更好。
从每一轮的发布中学习新的知识。
研究已有的问题
预言家难题,是测试中最艰巨的问题,就是在运行一个测试用例时,如何才能知道被测试软件确实完成了它应该完成的任务,被测试软件是否给出了正确的结果,在运行过程中是否有副作用,这些都是目前自动化测试无法解决的问题。
让测试人员尽早的加入软件开发的流程中,了解设计,了解详细的功能,了解业务逻辑,才能更深入的测试。
测试的正确态度是从一开始就承认怎么做都是不够的,要把所有的事情按照优先级排序,从最重要的事情做起。根据软件的各种属性,将决策分为5部分,输入,状态,代码路径,用户数据,执行环境,这是8探索式测试人员测试时需要关注的。
用户输入
合法输入和非法输入:对于非法输入通常会有错误处理代码,这些需要测试。有三种处理错误的方式:输入筛选器,输入检查,使用异常。下面将讲述如何从测试的角度看待这三种方式。
输入筛选器
测试人员需要检查两点,第一,开发人员是否正确的实现了这个功能。比如开发把错误汁水认为是正确的了,或是相反。第二,是否可以绕过屏蔽器。
输入检查
仔细阅读每一条错误信息
异常处理代码
常规输入还是非常规输入
非常规输入是在特殊情况发生的,比如按错。在程序里测试所有特殊字符,比如ctrl shift alt esc与其他键的组合。还有与语言或者操作系统有关的保留词。找到相关的保留词,然后作为输入测试。
默认输入或用户提供的输入
看见开发人员设置的默认值后,首先要将这个值删除,留下空白,或者是对这个值附近的值进行测试。
使用输出来指导输入选择
先确定要什么输出,然后找到合适的输入。关注那些被保存起来的输出。当第一次输入后正确时,要进行第二次输入。
状态
软件接受到输入,并在内存存储后,软件状态就发生变化。下面要看看测试输入和状态变化时要考虑的主要因素。
使用状态信息来帮助寻找相关的输入?使用状态信息来辨识重要的输入序列?
代码路径
用户数据
运行环境,包括资源,比如注册表,还有其他模块,或应用程序
全局探索式测试法:用于考虑特性交互,数据流以及在应用程序的用户界面上如何选择不同的路径来完成某种实际的功能时的测试情况
探索测试人员在实际开始测试前,需要建立起这样一个全局目标,用于指导以后的测试过程。
探索式测试有一下几个目标:理解应用程序如何工作,他的接口看起来怎么样,实现了哪些功能,强迫软件展示其全部能力。找到缺陷。
漫游测试:根据测试意图而不是根据被测应用程序的结构关系来划分。软件测试人员应该探索应用程序的运行路径,以不同的顺序执行许多特性。
商业区测试类型:测试重要特性,知道测试人员如何对执行这些特性的软件代码路径进行测试
1、指南测试法:依据用户手册测试,也可以依据第三方或者转件的建议进行测试,或者是对竞争对手的软件提出的建议进行测试。
2、卖点测试法:测试人员应该观摩销售演示,观看销售录像并跟着销售人员一起拜访客户。按照产品演示的步骤自己来执行一遍,并看看有没有发生问题。测试过程中随时都应该从用户的角度的思考和提问。
3、地标测试法:通过前面两种方法,可以提前确定那些关键的软件特性,也就是这里的地标在选择完地标后,需要确定他们的前后顺序,然后从一个地标执行到另一个地标来探索应用程序,并创建一个地标覆盖图来标示工作的进展
4、极限测试法:采用的途径是向软件提出很多难以回答的问题
5、快递测试法:关注数据流向
6、深夜测试法:可以验证归档等功能
7、便利测试法:好比是要进行有计划的抽查。测试中不追求细节以免影响测试速度,而是检查那些明显的东西。通过选定一个目标,然后使用可以发现的最短路径来访问目标包含的所有对象。
历史区测试类型:
1、恶邻测试法:统计软件问题,看看是否都集中在某些模块上,要对缺陷临近的功能使用遍历法进行测试,发现更多的问题。
2、博物馆测试法:那些老代码或者接受重新修改,或者是没被改动就放到新环境中运行,很容易发生失效的情况。
3、上一版测试法:如果当前产品是对先前版本的更新,很重要的一点就是必须运行先前版本上支持的所有场景和测试用例。可以保证用户已经熟悉的功能在新产品上依然可以运行。
娱乐区测试类型
1、配角测试法:关注除了主线之外的其它特性。那些配角的近邻主要功能的特性,也很容易被人注意,所以也要给予足够的重视。
2、深巷测试法:是指最不可能被用到或是那些最不吸引用户的特性。
3、通宵测试法:
旅游区测试类型:
1、收藏家测试法:收集东西并努力做到能把东西都收集全。建议收集软件的输出,收集的越多越好。
2、长路径测试法
3、超模测试法:只测试界面,不测试特性。只关注表面的、外在的东西
4、测一送一测试法:测试时同时运行同一应用程序的多个拷贝的情况。
5、苏格兰酒吧测试法:深入软件,发现那些隐藏的功能
旅馆区测试类型
去测试一些经常被忽视的或者在测试计划中较少描述的次要及辅助功能
1、取消测试法:启动操作然后停止他
2、懒汉测试法:不给输入,测试默认值的情况
破旧区测试类型
1、破坏测试法:限制或者破坏软件使用的资源
2、反叛测试法:
查看应用程序可能给出的错误提示,然后尽量运行软件,让这些提示出现。看看会出现什么情况。
测试过程中不断总结,总结各个测试用例发现的问题,对测试方法进行排名,随着项目的深入,可以总结出那些测试方法更适合测试哪类问题,将这种知识总结整理成文档,在部门内部流传。测试的目的就是在这次测试中尽最大的努力,同时确保下次可以做的更好。
使用基于场景的探索式测试
通过场景操作引入变化