草庐IT

【软件测试学习笔记】黑盒测试方法及案例

小怡同学. 2023-04-12 原文

文章目录


一、黑盒测试基本概念

1.数据驱动测试,基于规格说明的测试。
2.从用户观点和需求出发进行测试。
3.不考虑程序内部逻辑结构和内部特性。

二、黑盒测试的主要目的

1.检查是否有不确定或者遗漏的功能。
2.界面是否有错误。
3.在接口上,输入能否正确的接受,能否输出正确的结果。
4.是否有数据结构错误。
5.性能上是否满足要求。
6.初始化或终止性错误。
7.数据库的访进访出是否正常。

三、优缺点

优点

1.不用了解程序内部的代码以及实现。
2.与软件的内部实现无关。
3.从用户角度出发,很容易知道用户会用到哪些功能和问题。
4.基于软件开发文档。

缺点

1.代码覆盖率低。
2.自动化测试复用性低。

四、黑盒测试的策略

1.在任何情况下都必须采用边界值分析法,这种方法设计出来的测试用例对发现程序的错误非常有用的。
2.必要时采用等价类划分法补充测试用例。
3.对照程序逻辑,检查已经设计的测试用例的逻辑覆盖程度,如果没有达到要求的覆盖标准,则应当补充更多的测试用例。
4.如果程序功能说明中含有输入条件的组合情况,则应该一开始就选择因果图。
5.对于业务流程清晰的系统,可以利用场景法贯穿整个测试案例过程,在案例中综合试验各种测试方法。

五、黑盒测试方法

等价类划分

分类

  • 有效等价类:对程序规格说明来说,是合理的、有意义的输入数据构成的集合;检验程序是否实现了规格说明预先规定的功能和性能。
  • 无效等价类:对软件规格说明来说,没有意义、不合理的输入数据集合;检验程序功能和性能的实现是否有不合规格说明要求的地方。

划分方法

  • 按区间划分。
  • 按数值划分。
  • 按数值集合划分。
  • 按限制条件或规划划分。
  • 按处理方式划分。

原则

  • 输入条件规定的取值范围或值的个数,一个有效等价类,两个无效等价类。
  • 一组数有N个值,并且程序都要进行处理,N个有效等价类,1个无效等价类。
  • 规定输入数据必须遵守规则的情况下,一个有效等价类,无数个无效等价类。
  • 输入条件规定了输入值和集合或规定了“必须如何”,一个有效等价类,一个无效等价类。
  • 确定已划分的等价类中各元素在程序处理中的方式不同,等价类进一步划分为更小的等价类。

等价类划分案例

输入三个整数 a 、 b 、 c 分别作为三边的边长构成三角形。通过程序判定所构成的三角形的类型,当此三角形为一般三角形、等腰三角形及等边三角形时,分别作计算 …
① 输入条件的要求:
(1)整数、(2)3个数、(3)非零、(4)正数、(5)两边之和大于第三边、(6)等腰、(7)等边。
② 假设1、2、3、4都满足
5不满足 非三角形
5满足,三边不相等 一般三角形
5满足,两边相等,等腰三角形
5满足,三边相等,等边三角形

边界值分析法

是对于输入或输出的边界值进行测试。

原则

  • 如果输入条件规定了值的个数,则用最大个数、最小个数、比最小个数小1的数,比最大个数大1的数为测试数据。
  • 如果输入条件规定了值的范围,则应取刚达到这个范围边界的值,以及刚刚超过这个范围边界的值作为测试输入数据。
  • 如果程序中使用了一个内部数据结构,则应当选择这个内部数据结构的边界上的值作为测试用例。
  • 如果程序的规格说明给出的输入和输出域是有序集合,则应选取集合的第一个元素和最后一个元素作为测试用例。
  • 分析程序规格说明,找出其他可能的边界条件。

边界值分析法案例

注册功能的手机号注册应该是11位数字。
使用边界值设计测试用例
输入10位数字
输入11位数字
输入12位数字

因果图法

表示输入条件和输出动作之间的因果关系
描述多种输入条件组合
与判定表结合使用,最终生成的是判断表

四种因果关系

  • 恒等:若c1是1,则e1也是1;否则e1为0。
  • 非:若c1是1,则e1是0;否则e1是1。
  • 或:若c1或c2或c3是1,则e1是1;否则e1为0。“或”可有任意个输入。
  • 与:若c1和c2都是1,则e1为1;否则e1为0。“与”也可有任意个输入。

五种约束

输入条件的约束

  • E约束(异):a和b两个输入条件中至多有一个可能为1,即a和b不能同时为1。
  • I约束(或):a、b和c三个输入条件中至少有一个必须是1,即 a、b 和c不能同时为0。
  • O约束(唯一):a和b两个输入条件必须有一个,且仅有1个为1。
  • R约束(要求):a,b两个输入条件,a是1时,b必须是1,即不可能a是1时b是0。

输出条件的约束

  • M约束(强制):若结果a是1,则结果b强制为0。

因果图法设计测试用例的步骤

1.分析软件规格说明描述中, 明确哪些是原因(即输入条件或输入条件的等价类)和哪些是结果(即输出条件),并给每个原因和结果赋予一个标识符。
2.分析软件规格说明描述中的语义,找出原因与结果之间,,原因与原因之间对应的关系,根据这些关系,画出因果图。
3.由于语法或环境限制, 有些原因与原因之间,原因与结果之间的组合情况不可能出现,为表明这些特殊情况, 在因果图上用一些记号表明约束或限制条件。
4.把因果图转换为判定表。
5.把判定表的每一列拿出来作为测试依据,完成测试用例设计。

因果图法案例

第一列字符必须是A或B,第二列字符必须是一个数字,在此情况下进行文件的修改,但如果第一列字符不正确,则给出信息L;如果第二列字符不是数字,则给出信息M。
① 分析原因和结果
原因:
1 第一列字符是A
2 第一列字符是B
3 第二列字符是一数字。
结果:
21 修改文件
22 给出信息L
23 给出信息M
② 画出因果图

③ 根据因果图建立判定表

判定表驱动测试

判定表的组成

  • 条件桩:列出了问题的所有条件,列出条件的次序没有约束。
  • 动作桩:列出问题规定可能采取的操作,这些操作的排列顺序无关紧要。
  • 条件项:列出针对它左列条件的取值,在所有可能情况下的真假值。
  • 动作项:列出在条件项的各种取值情况下应该采取的动作。

判定表的建立步骤

1.确定规则的个数。假如有n个条件,每个条件有两个取值(0,1),故2的n次方种规则。
2.列出所有的条件桩和动作桩。
3.填入条件项的取值。
4.填入动作项的取值,得到初始判定表。
5.简化,合并相似规则(相同动作)。

判定表驱动测试实例

例子:打印机是否能打印出来正确的内容,有多个因素影响,包括驱动程序、纸张、墨粉等。(为了简化问题,不考虑中途断电、卡纸等因素的影响)
① 列出条件桩和动作桩
条件桩:
驱动程序是否正确
是否有纸张
是否有墨粉
动作桩:
正确打印内容
提示驱动程序不对
提示没有纸张
提示没有墨粉

② 生成判定表

③ 优化判定表
如果动作结果一样,对于某些因素取“1”或“0”没有影响可以合并。

场景法

场景法的应用是基于对软件业务(需求)的深入理解(业务层面),基于等价类划分(技术层面)。

场景法目的

测试软件的主要业务流程,主要功能的正确性和主要的异常处理能力。

场景法核心

基本流(正确流)
模拟用户正确的操作流程。
目的:验证软件的业务流程和主要功能。
备选流(错误流)
模拟用户错误的操作流程
目的:验证软件的错误处理能力。

场景法基本设计步骤

1、根据说明,描述出程序的基本流及各项备选流。
2、根据基本流和各备选流生成不同的场景 。
3、对每一个场景生成相应的测试用例。

场景法实例

使用场景法分析程序:ATM取款

1、根据需求,找到基本流和备选流(找出正确的操作流程和可能出错的环节)
(1)基本流—正确取款
①插入银行卡:客户将银行卡插入ATM机的读卡器
②验证银行卡:ATM机从银行卡的词条中读取账号代码,并检查它是否属于可以接收的银行卡
③输入密码:ATM机要求输入密码
④验证密码:验证该密码是否正确
⑤进入ATM机主界面:ATM显示在本机中可用的各种选项
⑥取款并选择金额:客户选择“取款”,并选择取款金额
⑦ATM机验证:ATM机进行验证账户余额是否满足以及总取款金额是否满足要求,验证ATM机内现金是否够用
⑧更新账户余额、出钞:验证成功,更新账户余额,输出现金,提示用户收取现金
⑨返回主界面
(2)备选流—出错环节
①银行卡错误
②密码错误
③密码3次错误
④卡内余额不足
⑤超出当日可取
⑥ATM余额不足
2、根据基本流和备选流列出场景


3、根据场景编写用例
预设条件:
一张无效银行卡
一张银行卡:账户12345678901234密码123456
账户余额4000 当日限额20000
ATM机余额10000

账户余额40000 当日限额20000
ATM机余额50000

账户余额40000当日限额20000
ATM机余额10000

功能图法(灰盒测试)

是黑盒、白盒混合用例的设计方法

功能图法组成

状态迁移图
逻辑功能模型

功能图基本设计步骤

1、明确状态节点。 分析被测对象的测试特性及需求规格说明书,明确被测对象的状态节点数量及相互迁移关系。
2、绘制状态迁移图。 利用圆圈表示状态节点,有向箭头表示状态间的迁移关系,根据需要在箭头旁边标识迁移条件。可以利用绘图软件绘制状态迁移图。
3、绘制状态迁移树。 根据状态迁移图,按照广度优先和深度优先搜索绘制状态迁移树。首先确定起始节点和终止节点,在绘制时,当路径上遇到终止节点时,不再扩展,遇到已经出现的节点也停止扩展。
4、抽取测试路径设计用例。 根据绘制好的状态迁移树,提取测试路径,从左到右,横向抽取,每条路径构成一条测试规则,然后再利用等价类和边界值等测试用例设计方法设计具体的测试用例。

功能图实例

实例:一个编辑文本的软件中有可以改变字体颜色的功能,其中可选的颜色共有黑、红、蓝三种颜色。
1、明确状态节点
该功能有三种状态:黑、红、蓝
2、绘制状态迁移图

3、绘制状态迁移树
假设起始状态是红色

4、抽取测试路径设计用例
导出规则

编写测试用例

错误推测法

基于以往的经验和直觉,参照以往软件系统出现的错误,推测程序中所有可能存在的各种缺陷和错误。

正交试验设计法

通过正交试验理论来指导测试用例的选取

正交试验设计法基本设计步骤

1.提取功能说明:构造因子–状态表。
2.加权筛选,生成因素分析表。对因子与状态的选择可按其重要程度分别加权.可根据各个因子及状态的作用大小,出现频率的大小以及测试的需要,确定权值的大小。
3.利用正交表构造测试数据集。利用正交实验设计方法设计测试用例,比使用等价类划分,边界值分析,因果图等方法有以下优点:节省测试工作工时;可控制生成的测试用例数量;测试用例具有一定的覆盖率。

正交试验设计法案例

例题:PPT打印需求

功能描述如下:
打印范围:全部、当前幻灯片、给定范围
打印内容:幻灯片、讲义、备注页、大纲视图
打印颜色/灰度:颜色、灰度、黑白
打印效果:幻灯片加框和幻灯片不加框两种方式

1.选择正交表
4因数4水平


2.生成表

整理生成表

正交表的构成

行数(Runs):正交表中的行的个数,即试验的次数,也是通过正交实验法设计的测试用例的个数。
因素数(Factors):正交表中列的个数,即要测试的功能点。
水平数(Levels):任何单个因素能够取得的值的最大个数,即要测试功能点的输入值。

正交表的类别

可分为:单一水平正交表 和 混合水平正交表。

  • 单一水平正交表:各列水平数相同的正交表称为等水平正交表。比如:L9 (3* * 4) -->(附:括号里意思为3的4次方,下同。)、L2 7(3 * * 13) 称为3水平正交表。 L4 (2* * 3)、L8 (2* * 7) 称为2水平正交表。单一水平正交表可以用 Ln(m* * k) 表示,n是行数,m是水平数,k是因数。比如上边需求示例:可以理解为4因数(字体,字符样式,颜色,字号),3水平(意思是每个因数里都有三个选项,比如:字体里有 仿宋、楷体、华文彩云 3个选择)。一般情况下,我们可以直接确定m和k,n 可以根据水平数和因数计算行数,公式为:n=k*(m-1)+1。
  • 混合水平正交表:各列水平数不完全相同的正交表称为混合水平正交表。比如:L8 (4 * * 1 2 * * 4)–>(附:括号里意思为4的1次方 和 2的4次方。意思为表中共有8行,有一列的水平为4,有4列的水平为2。)。混合水平正交表可以用 Ln(m1 * * k1 m2 * * k2) 表示。一般情况下,我们可以直接确定m和k,n 可以根据水平数和因数计算行数,公式为:n=k1*(m1-1)+k2*(m2-1)+k3*(m3-1)…+ kx*(mx-1) + 1。

如何选取合适的正交表

假如我们确定有3因数2水平,计算n=3*(2-1)+1=4,应该表示为 L4(2 * * 3),那么我们看看有木有和这个正好相等的正交表,如果有,那么把变量值复制进去这个表中,如果没有,按照如下方法选取:

  1. 水平数相等,因数相等时,取行数刚好比自定义正交表略大的。
  2. 水平数相等,因数不相等时,取行数刚好比自定义正交表略大的,因数刚好比自定义正交表略大的。比如:自定义为: L7(3 * * 3), 我们选取为 L9(3 * * 4), 套用之后,最后一列因素去掉。
  3. 水平数不相等时,即:混合正交表。

有关【软件测试学习笔记】黑盒测试方法及案例的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  3. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  4. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  5. ruby - Facter::Util::Uptime:Module 的未定义方法 get_uptime (NoMethodError) - 2

    我正在尝试设置一个puppet节点,但ruby​​gems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由ruby​​gems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby

  6. Ruby 方法() 方法 - 2

    我想了解Ruby方法methods()是如何工作的。我尝试使用“ruby方法”在Google上搜索,但这不是我需要的。我也看过ruby​​-doc.org,但我没有找到这种方法。你能详细解释一下它是如何工作的或者给我一个链接吗?更新我用methods()方法做了实验,得到了这样的结果:'labrat'代码classFirstdeffirst_instance_mymethodenddefself.first_class_mymethodendendclassSecond使用类#returnsavailablemethodslistforclassandancestorsputsSeco

  7. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

  8. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  9. ruby - Highline 询问方法不会使用同一行 - 2

    设置:狂欢ruby1.9.2高线(1.6.13)描述:我已经相当习惯在其他一些项目中使用highline,但已经有几个月没有使用它了。现在,在Ruby1.9.2上全新安装时,它似乎不允许在同一行回答提示。所以以前我会看到类似的东西:require"highline/import"ask"Whatisyourfavoritecolor?"并得到:Whatisyourfavoritecolor?|现在我看到类似的东西:Whatisyourfavoritecolor?|竖线(|)符号是我的终端光标。知道为什么会发生这种变化吗? 最佳答案

  10. ruby - Ruby 的 Hash 在比较键时使用哪种相等性测试? - 2

    我有一个围绕一些对象的包装类,我想将这些对象用作散列中的键。包装对象和解包装对象应映射到相同的键。一个简单的例子是这样的:classAattr_reader:xdefinitialize(inner)@inner=innerenddefx;@inner.x;enddef==(other)@inner.x==other.xendenda=A.new(o)#oisjustanyobjectthatallowso.xb=A.new(o)h={a=>5}ph[a]#5ph[b]#nil,shouldbe5ph[o]#nil,shouldbe5我试过==、===、eq?并散列所有无济于事。

随机推荐