• 12
  • 12
分享
  • 打开测试黑盒,从代码角度编写测试用例!——软件测试圈
  • 曼倩诙谐 2020-12-16 09:39:33 字数 2273 阅读 1222 收藏 12

  黑盒测试仅关注输入和输出,将程序看成一个黑盒子。在不遗漏需求的情况下,打开这个黑盒子,从代码实现的角度进行分析,可以更好的理解测试用例,帮助我们完善测试用例设计,更好地提升测试效果。

  本文从一元多项式的加法和乘法运算程序进行系统阐述,以期阐明作者思路。

  程序功能描述:设计程序分别求两个一元多项式的乘积与和。

  (1)Input :输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数,数字间以空格分隔

  (2)Output:输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。零多项式应输出 0,0

  (3)举例:

。0.png

  执行加法运算后的结果:

0.png

  (4)程序输入及预期输出

  Input:

  3 9 12 15 8 3 2

  4 26 19 -4 8 -13 6 82 0

  Output:

  234 31 390 27 78 21 -36 20 -117 18 -60 16 -195 14 738 12 -12 10 1191 8 246 2

  26 19 9 12 11 8 -13 6 3 2 82 0

  一、程序框架思考

  (1)数据结构使用链表:链表较数组灵活、但较容易出错,因此比较适合在本文举例:

1.png

  (2)程序架构如下:

2.png

  i. 通过Creat( ) 函数构建链表,存储数据

  ii. 通过multiple( ) 函数执行乘法运算并返回结果

  iii. 通过add( ) 函数执行加法运算并返回结果

  iv. 通过PrintLink( ) 函数打印结果

  结合程序功能,从实现难度来看,multiple( ) 可能更容易出错。各子函数的具体实现在此不表,后面会结合测试点进行详细的阐述。

  二、测试验证

  1. 临界测试:录入 空多项式 运行程序,可以看到输出数据发生了混乱。

 3.png

  分析:通过排查代码发现,由于没有考虑 空指针场景(头指针的Next指向为NULL),指针指向了未知内存空间,导致数据异常。另外需要说明,空指针也会引发段错误 segmentation fault,这是我们在测试过程中、特别是项目初期较多遇到的情况:指针为空引发程序崩溃。

  解决方法:增加头指针的Next为NULL的判定和处理。

4.png

  2. 等价类测试

  I. add( ) 

  对于加法函数,它需要考虑三种基本情况:两个一元多项式进行比较,i.前者系数大于后者 ii.前者系数等于后者 iii.前者系数小于后者。If语句的三个分支对应了三个等价类测试点。

5.png

  相较 i , iii 两种情况,问题容易出现在 ii 两者系数相等:这里需要考虑一个较特殊的场景,当相加后的系数为0时,相关数据不记录,同时需要通过free( ) 函数释放对应的内存空间。

  因此在设计对应的测试用例时,需要考虑系数相加为0的场景,在判定输出的同时,同步关注内存占用情况。

6.png

  II. multiple( )

  乘法函数较加法函数复杂一些,需要通过两层while循环 、 insert() 子函数完成功能实现:

7.png

  两层while循环模拟 两个一元多项式相乘的步骤,insert( ) 将产生的结果插入到结果链表中。因此需要同步关注insert( )子函数。没有在multiple( )中直接实现insert功能,是程序编写的基本规则:避免代码冗余、增加灵活性。Insert( )部分代码如下:

8.png

  我们可以看到,这里的测试点类似于add( )函数,也需要考虑三种情况:指数大于、指数小于、指数相等。其中 指数相等的情况,会触发系数相加操作,当结果为0时,需要通过free( )函数进行内存释放。

9.png

  因此在设计测试用例时,需要进行全面考虑,不要遗漏系数相加为0的场景,同步关注内存占用。

  3. 关于循环

  分支和循环是程序代码中最常见的两个场景,从灰盒测试角度,分支对应于测试设计中的等价类划分,循环可以对应边界值。

  程序可能会在分支或循环处发生异常,比如没有正常退出循环,严重情况会导致程序崩溃,程序进入死循环。

  举个栗子

  描述:执行连接操作,人为使Sender进程异常,Receiver会执行反复重连尝试,点击 连接取消 按钮,但是Receiver仍然继续执行重连。

  分析:点击取消按钮后,并没有终止循环,取消操作存在代码缺失,导致循环未正常终止。

  三、一点思考

  由于测试的入门门槛较低,测试工程师更需要做好自身技能储备,提升竞争力,作者建议从如下几个方面进行提升:

  1. 凡事多思考,多考虑为什么?尝试弄清楚背后的原因

  2. 软件版本没有测试出严重故障,并不代表没有严重故障,可能是没有在实验环境暴露或存在测试疏漏。因此还是要多思考、多使用,以期充分暴露产品缺陷。

  3. 增加自动化意识:凡是重复的操作都可以尝试通过自动化代替。我们可以从windows bat , Linux sh脚本处一点点做起:积沙成塔。但是要考虑性价比,从长期考虑,如果自动化的时间成本远远大于手动成本,那就维持手动。

  4. 从代码层面进行提升,至少熟练掌握一门编程语言(如C++),同时对数据结构有比较深入的理解。在工作之余,培养刷题的习惯:可以在牛客网、PTA、OpenJudge等网站进行编程实操,认真分析Not Accepted原因 及 编程网站的测试用例,反推出自己编程时的漏洞,据此完善自己的逻辑思维能力,强化测试用例编写时的逻辑性和全面性。



作者:Ron   

来源:51Testing软件测试网原创

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   概述:在前端自动化中,元素定位少不了,尤其是使用Jquery方法的元素定位。本文主要讲述如何使用Jquery选择器进行元素定位。  基本选择器  简要介绍  Jquery选择器中使用最多的选择器,它由元素id、class、元素名、多个元素符组成。功能表如下表1所示:表1 Jquery基本选择器功能表  实践举例  以百度页面举例,说明基本选择器定位元素的方法。图1 百度首页  id定位方法  由图1可知,“百度一下“的前端代码为<input type="submit" value="百度一下" id="su" class=&...
            13 13 2361
            分享
          •   前言  不管怎样,面试或者被面试和简历有着理不清的关系,面试官要通过简历了解面试者的基本信息、过往经历等。  面试者希望通过简历把自己最好的一面体现给面试官,所以在这场博弈中,作为面试者,需要掌握一定的技巧,写出一个高质量的简历,才能抓住面试官的眼光。  假如你是网上发出简历,你的简历必然会经过 HR 的筛选,一张简历 HR 可能也就花费 10 秒钟看一下,然后 HR 就会决定你这一关是 Fail 还是 Pass。  假如你是内推,如果你的简历没有什么优势的话,就算是内推你的人再用心,也无能为力。  一份好的简历  一份好的简历,可以给人的第一印象大大提升,那么我们如何准备一份高质量的简历...
            0 0 633
            分享
          • 1.前言网上有许多关于单元测试的好处,这里我就不去说了。我写单元测试的理由很简单粗暴,就是图一个方便。试想一下这个场景:我们在写一个新功能,每写一部分,我们就安装到手机上查看一下,这个过程中你要点击到对应的页面,做对应的操作,最后才能反馈给你结果。如果达到了预期效果,那么恭喜你。可是一旦这次失败了,是不是又要重复这一过程?是不是感到很麻烦?很费时间?如果你想早点写完下班,那么你就需要掌握单元测试。因为它能大大的缩短你自我验证的时间。2.准备工作我们新建一个项目,模板代码会默认在build文件中添加JUnit的依赖,而单元测试代码是放在src/test/java下面的,如下图:用鼠标右键点击测试...
            13 13 1267
            分享
          • 1.概述软件测试是指在规定的条件下对程序进行操作,以发现程序错误,衡量软件质量,并对其是否能满足设计要求进行评估的过程。测试案例作为测试执行的依据在软件测试工程中发挥着重要的作用。本文从测试案例的设计意义出发,剖析了测试案例的设计策略、原则和分类,帮助测试人员在进行测试案例设计时,找到案例的设计方向和方法。2.什么是测试案例设计测试案例的设计简单说的就是设计一个测试场景,通过这个测试场景中的输入、执行条件和输出,来判断应用系统是否存在系统缺陷和不足;即通过执行测试案例,来判断系统是否能够正常运行并且达到程序所设计的执行结果。根据测试案例的性质划分,测试案例在设计上可以分为正向测试案例和反向测试...
            0 3 8894
            分享
          • 在 Vue 3 的 Composition API 中,采用了 setup() 作为组件的入口函数。在结合了 TypeScript 的情况下,传统的 Vue.extend 等定义方法无法对此类组件给出正确的参数类型推断,这就需要引入 defineComponent() 组件包装函数,其在 rfc 文档中的说明为:https://composition-api.vuejs.org/api.html#setup interface Data {   [key: string]: unknown }   interface&nbs...
            0 0 1050
            分享
      • 51testing软件测试圈微信