测试无涯,要把要做的事情分优先级
局部探索式测试定义:
局部探索式测试法是辅助测试人员在执行测试中即时做出决定,注重指导在测试中如何做抉择、应注意哪些测试细节的方法。
比如:如何决定文本框的输入值;如何理解前后两次输入值之间的关系;如何解释错误消息等
测试就是有所变,有所不变
可供选择的输入太多,组合太多,应该怎么办?
必须在测试时确定所有可能发生变化的因素,在要求我们选择某些变量和去掉其他(也就是不必要的)变量时,我们 必须做出明智的决定。
从而测试工作简化为在所有输入的全体集合中选择一个子集,然后在输入时使用选中的子集,最后通过推理认为是否这些输入就足够了。
一、用户输入
定义:输入是由应用程序外部引发的,并导致应用程序执行了某些代码。
分类:
- 原子输入
- 抽象输入:将相互关联的原子输入合并成一个抽象输入,也把原子们当成一个整体的概念来对待。
输入可以接收到的可能值太多,有必要把他抽象化。
举例:使用"某个长度"这样一个抽象输入来表示1~32768之间的任何一个原子输入长度值。
输入关联(注意点)
- 不同输入之间的相互影响:比如复选框,单独搜索A或B没问题,但组合搜索出现了问题
- 输入这些值时的先后顺序:比如a和b,就有aa,ab,ba,bb,有更多的输入,则顺序更多。所以,必须枚举出那些恰当的顺序。
1)合法输入和非法输入
开发人员喜欢编写正常功能代码,不喜欢编写错误处理代码,所以测试过程中应关注:
- 对于非法输入的屏蔽,检查是否实现了正常的功能,是否可以绕过屏蔽
- 在错误输入发生时,应用程序是否给出了合理的响应
- 当出现错误信息时,仔细阅读每一条错误信息,检查信息是否写错了,使用提示信息深挖:输入哪些值可以触发其他信息?哪些输入值实际应该导致错误但软件没报错?哪些输入值实际应该不报错但软件报错了?
- 错误信息,必须是指出非法值的根本原因及如何让它变成合法输入值。再进一步,继续使用刚才引发异常的输入数据或小修改,查看程序运行状态。
- 除了常规输入,还要考虑非常规输入,即特殊情况下进行的输入。比如单点触屏左右滑动,若多点触屏滑动,是否有异常呢?
2)默认输入或用户提供的输入?
测试重点①默认值实现了功能 ②去掉默认值,程序反应 ③把值改成默认值附近的值、其他值、或类型
使用输出来指导输入
- 从抽象角度,最高层的抽象是分为非法输出和合法输出
- 从输出结果来思考整个问题,测试人员首先确定他们希望程序产生什么样的输出结果,然后考虑所有的用户场景,看看如何去生成期待的结果。
二、软件状态
软件状态:在我们选择下一步使用哪些输入时,必须考虑从前使用过的那些输入所造成的的累积效应。输入导致内部变量的数值发生变化,内部变量所有可能的取值组成了软件的状态空间。
或者用于描述软件记住过去发生的所有输入和输出的一种方式。
比如,无论购物车放置哪些商品,都可以进行结账。这里存在累积效应,可以集中关注边界情况(比如空购物车)。
软件状态分类:
- 暂时的:当前运行中,被记住,程序终止时,该状态被忘却
- 长期保存的:比如存到数据库或文件中,程序将来可以再读这个值
如果同一个输入导致软件做出两种完全不同的反应,这说明这两种情况下软件的状态是完全不同的
输入和状态之间的关系很关键,建议关注以下两点:
- 两个或多个输入在某种程度是相关联的,就应该放在一起测
输入可以组合是测试的基本常识。比如用户可以使用优惠券来打折,但不能用于打折商品。输入和状态为:打折商品、折扣券、所有购买的商品 - 状态变化在某种方式上被累加起来,就必须考虑溢出
当一个输入导致状态信息被更新,紧接着再多次使用相同的输入会导致一连串的状态变化。比如购物车是否会装满?用于存放数据的列表会不会变的太大?
三、代码路径
一连串的代码语句构成了一个代码路径,起始于软件开始运行的语句,终止于一条特定的语句。所以测试人员必须明确知道程序有哪些分支,尽量覆盖所有分支
四、用户数据
尽量用真实数据,这里会包含测试人员不了解的很多相互关系和结构,有利于发现问题。
五、运行环境
即使我们可以测试随着用户输入、状态变迁、用户数据变化而变化的所有代码路径,但是当程序被安装到一个崭新的且它从来没见过的环境中,还可能会失败。这是因为环境本身就是一种数据源,所以测试人员在产品发布前必须尽量尝试各种各样的用户环境