读书笔记_探索式测试_局部探索式测试法

一、用户输入

1.基本知识

输入:由环境产生的一种刺激,该刺激导致被测试的应用程序有所响应。

原子输入和抽象输入:简单到不能再简单的是原子输入,由于数量过大,可以抽象。

如何从一堆原子输入中找到最佳的子集:输入之间会相互影响从而造成软件失效。分别输入没问题,组合使用有问题。输入值的先后顺序也会导致问题。同等的对待两个或两个以上的原子输入的方法称为等价类划分,如果两个输入都执行相同的代码路径,同时又都可以被完全放入目标数据结构内,在测试上就可以看做等价的。

所有的软件都会执行四个基本任务:接收数据,产生输出,存储数据和进行运算。

2.合法输入和非法输入

正向测试:让软件进行正常工作,输入合法输入。

逆向测试:让软件失效,输入非法输入。

开发人员针对非法输入会实现错误处理代码。有三种方式定义错误处理程序:输入筛选,输入检查,异常处理。

3.输入筛选器

输入筛选器用于防止非法的输入值被传递给应用软件的功能代码。输入筛选器不会产生错误信息,而是把非法输入排除在外,只把合法的输入值传给应用程序。所有的列表框和下拉框都是一种输入筛选器,提供合法输入选项。针对输入筛选器需要考虑:

  • 开发人员是否正确实现该功能?首先对合法输入和非法输入的区分不能有误,如果把非法输入值归为合法输入,会产生缺陷(大量bug诱因);而把合法输入归为非法输入,会引起用户不满和软件拒绝服务。
  • 是否可以绕过屏蔽器?如果有方法可以让输入值进入系统,或进入系统后可修改,那么屏蔽器就没用了(如直接修改html页)。

4.输入检查

输入检查属于应用程序代码的一部分,通常采用分支结构实现。接受一个输入值,如果输入合法,那么继续运行,否则产生一条错误消息并终止处理。输入检查和异常处理的区别在于代码的位置,当程序从外部接收到输入值后,一般紧接着就是输入检查的代码,显示的错误信息会非常精确。如果报错信息比较笼统,则是异常处理。

5.异常处理

异常处理把整个实例当成一个整体,检测其上发生的任何一个错误。错误处理代码通常位于程序结尾部分,或位于一个单独文件中。如果运行出错,或违规内存存取, 异常代码都会处理。异常处理代码可以处理各种各样的软件失效情况,不单局限于非法输入。对于异常处理给出的笼统的提示信息,建议反复测试同一段函数,继续使用引发异常的输入数据,或稍加修改,然后观察。

6.常规输入or非常规输入?

输入分为常规输入和非常规输入,一个常规输入表示没有特定的格式或含义,可以直接使用于被测软件。非常规输入只在特殊情况下发生。如Shift+C错按撑了Ctrl+C,因为后者有别的含义,可能引发缺陷。所有和Ctrl、Alt、Esc组合的字符都算特殊字符,建议测试这些字符。某些字体,在处理Unicode或某些多字节字符集时,如果没有被正确的本地化,就会引发软件失效。还有一些特殊字符与平台有关,每一个操作系统、编程语言、浏览器和运行时环境都有一些固定的保留字,具有特殊含义。如Windows的COM1、AUX等。如果输入框没有处理这些保留字,程序可能会挂起或崩溃。建议作为输入值来测试。

7.默认输入或用户提供的输入?

空白输入,不输入字符或给API传递NULL参数,需要软件在默认情况下运行。单元测试时常常忽视空输入。输入的非空校验应该根据空值字段来变化。除了空输入,还可以把默认值置空,或者尝试默认值附近的一些值。如数字±1,字符串就删前删后几个字符,或提供等长的不同字符。

8.使用输出来指导输入选择

  • 先明确预期软件会产生哪些反应,然后确定哪些输入会引发相应输出,在测试时使用这些值。
  • 先观察输出结果,然后修改输入,保证输出是重新计算的结果。
  • 当第一次运行输入时,很多内部的变量和数据结构刚刚初始化,输出结果第一次被生产。当输出结果被第二次生产时,很多变量的值还是上一次 运行设定的值。这意味着第二次测试的情况和第一次的完全不同。第一次测试的是软件处于一个未被初始化的状态时如何产生输出,而第二次测试的则是当软件处于 一个已被初始化的状态时如何产生输出。因此,用例至少运行两遍! 
  • 寻找被保存起来的输出结果,如果可变,尝试修改类型和大小,可以测试该值是否被重新生成。 

    二、状态

    1.软件状态的基本知识

    软件的一个状态就是状态空间中的一个点,它由所有内部数据结构的取值来唯一确定。

    2.如何测试软件状态

    应用程序和其运行环境进行交互和接收到的所有输入导致软件状态发生变化。软件状态保持了一个输入的历史记录,可以记住前一次用户使用软件时做了哪些事儿。因为软件状态的改变源于连续不断的输入,所以测试它就需要使用多个测试用例,并持续不断的运行软件、中止运行、再运行软件。过程中注意观察输入是如何影响系统运行的,可以注意到软件状态的变化。软件状态可以看成是描述软件记住过去发生的所有输入输出的一种方式。状态可以是临时的,也可以长期保存。这两种情况被称为数据辖域,检测软件的数据辖域是否正确实现也很重要。如果数据辖域有问题,可以导致安全隐患(只记住该记住的,如信用卡号不能记住)。很多临时或被长期保持的数据不能直接观测,只能通过对软件行为的影响来推测。如果同一个输入会导致软件做出两种不同的响应,则这两种情况下软件状态完全不同。两点建议:

    • 使用状态信息来帮助寻找相关的输入:多个输入相关联,应放在一起测。
    • 使用状态信息来辨识重要的文件序列:当一个输入导致状态信息更新,再多次使用同样输入会导致一连串的状态变化。如果累加状态变化,必须考虑溢出。

    三、代码路径

    一连串的代码语句构成了一个代码路径,起始于软件开始运行的语句,终止于一条特定的语句。测试人员必须明确知道程序有哪些分支,尽量覆盖所有分支。

    四、用户数据

    用真实的用户数据测,有利于发现缺陷。需注意:①备份数据,在副本上工作。②保护用户隐私数据。

    五、运行环境

    环境本身也是一种输入源,产品发布之前应尽量尝试各种用户环境。环境包括使用的操作系统和当前配置,还包括运行在同一系统上会和被测软件进行交互的一些其他应用程序,还包括可能影响被测的驱动、代码、文件、设置等,还包括网络情况、性能等。

    原文地址:https://www.cnblogs.com/TestFocus/p/3518108.html