• 0
  • 0
分享
  • 黑盒测试 vs 白盒测试——软件测试圈
  • quinn 2022-12-08 14:35:01 字数 2453 阅读 992 收藏 0

测试是一个很古老的话题,几乎有了开发就有了测试。但是随着 DevOps 和敏捷的风潮之后,测试到底应该谁来做、需不需要独立的测试人员、测试到底应该关注什么,反而越来越模糊。至少在最近的几次周会和评审会上,发现大家在这些方面还是有很多的不明确和分歧。本文试图对说清楚白盒黑盒测试的区别,并对测试的分工和实施路径进行准确的阐述。

首先,我们先回到测试的目的上。软件测试的目的,和制造业测试的目的是一样的,就是验证交付物的质量。在制造业上,如果是无损的,可以对每件成本做测试;如果是有损的,采用抽样。对于软件来说,没有啥有损无损的区别,因为代码是可以无限复制的。同时,部署在不同机器的代码理论上也不会有什么太大的区别,可能环境因素会造成一定的差异。这里只需要在启动的时候加入轻量的自检流程即可。

软件的测试,主要还是集中在功能的验证上。在开发、集成、验收、发布阶段,都可能有不同角色参与的,视角不同的验收工作。

我们要验证交付物的质量,验证软件的功能是否正确,有两种方式去保证:白盒测试和黑盒测试。这两者的区别,我们可以拿买手机来举个例子。所谓的白盒测试,是我了解手机的各个组成,MPU 多少、GPU 多少、内存多少、屏幕分辨率多少、摄像头参数多少、基带芯片参数、操作系统是啥等等,然后一个个按照我自己要求的参数去做验证。黑盒,就是我对这些具体的内部结构和配置参数都不了解,我只知道我要拿手机来做什么,比如我要能用啥啥啥功能,玩什么游戏要到怎么一个流畅度、拍照片要达到什么效果,然后我拿这些功能一个个去试,符合要求的就是我要的。

软件测试也一样,白盒测试,就是按照我的设计说明书,按照包、类、方法、逻辑一层层往下拆解,验证实现是否符合设计的要求。所以白盒测试是在验证设计,不是验证功能。只做完白盒测试,有可能是一个设计优秀、运行稳定、性能良好、bug 很少但是没有用的垃圾。

而黑盒测试,是在验证功能。我不管你内部是怎么实现的,我也不管你内部的代码是不是写得优美,不管你的表结构设计是关系型的还是就一个大 json,甚至我不管你是 for 循环三次还是拆开来写了三次一样的代码,我只管功能是否被正确实现(特定的输入是否有符合预期的输出、用户交互是否符合产品设计、响应速度是否符合要求、用户使用上是否有障碍)。

举个具体的例子。比如我有一个下单功能,用户在界面上输入信息,确认后存储到数据库,然后回显到界面上,后续用户可以根据 orderId 反查询。

对于黑盒,我只下一个单,看一下回显,根据 orderId 查询一次,如果都符合设计要求,同时在性能和交互上也 ok,那就过了。

对于白盒,我的验证方式是将创建、查询拆开验证的。创建的时候需要验证输入的信息是否争取存储到数据库中,回显到时候需要验证对应 orderId 的 DB 数据是否正确被映射成对用户的输出。同时需要验证 orderId 不存在的情况是否正常的被处理。

比如我写代码的时候写了一个 bug:将 order 中的金额和数量两个字段落库的时候落反了,金额存在了数量里,数量存在了金额字段;查询的时候也是反着查的。这个时候,功能没有问题,黑盒测试是 pass 的。但是对于白盒测试,这个不符合设计,需要被定义成 bug。

白盒和黑盒测试是相辅相承的关系。如果要保证软件的质量,理论上其实只需要黑盒测试——保证交付物满足产品设计和用户的需求(包括功能和非功能)即可。但是,由于软件的复杂性,如果直接进行黑盒测试,往往失败的概率极大,而且也不容易定位问题所在。所以,按照分而治之的方式,先保证各个部分的质量,最后再来看整体产品的质量。而各部分的质量,首先需要满足设计的要求。而这个,采用白盒测试的方式比较更高效。所以,白盒测试满足各组件满足设计要求,最后再采用黑盒测试验收产品的整体交付质量。要保证大型软件交付的质量,白盒和黑盒测试缺一不可。

明白了黑盒和白盒测试的区别,我们也就明白了测试分工的原则。白盒测试是在验证设计和实现,还是属于开发的范畴,所以白盒测试应该由开发来完成。大部分的白盒测试,都是通过单元测试来 cover 的,平时也会构建 CI 来反复的验证。对于系统和系统之间的交互,基于服务契约解耦并通过契约测试来 cover:《契约测试的三种模式》。

而对于黑盒测试,这个是在验证产品的功能,最终需要是产品来做验证,如果是交互相关的可以由 UED 来验证。同时对于一些特殊的验证,比如性能、错误处理等,可以由专业的测试人员来负责。

在产品和 UED 验收之前,为了提升效率,可以增加一个端到端功能验证阶段,验收产品功能是否可以完整的跑起来、性能和稳定性如何。这个产品预验证阶段,可以交由独立的测试团队完成。

总之,我们可以将测试做如下划分:

  • 白盒/单元测试:测试模块内的代码逻辑,开发负责。

  • 白盒/契约测试:测试模块间的集成,开发负责。

  • 黑盒/产品预验证:测试产品的功能连通性、性能、稳定性,测试负责。

  • 黑盒/产品验收:测试产品的功能,产品负责。

  • 黑盒/交互测试:测试用户交互体验,UED/产品负责。

  • 安全测试:这个比较特殊,类似蓝军的攻击,专门的团队负责。

  • 压力测试:专门团队负责。

基于上述的测试分工,我们也可以明确各类测试的实施路径:

  • 单元测试和契约测试:在设计的时候进行测试分析,在编码阶段进行测试执行(编写用例)。

  • 产品预验证:在产品阶段进行测试分析,在交付前进行测试执行。

  • 产品验收、交互测试:在产品阶段进行测试分析,在交付前(交付给外部)或者交付后(交付后有验证阶段的)进行测试执行。

  • 其他包括安全测试、压测等,可以按需进行。

最后,在人员构成上,由于开发需要负责设计编码和白盒测试,产品(包括 UED)需要负责产品设计和验收,测试负责产品预验证和稳定性保障。所以三部分人员的比例建议为 6:2:1。大头在开发,产品需要配齐,测试共享。


作者:agnostic

原文链接:https://xie.infoq.cn/article/8ec79e9224fdad8ea5c5b38da

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

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 1.并发测试最近小屌丝一直在埋头苦练性能的知(zi)识(shi)~。很是努力。但是,小屌丝的最近遇到的问题,可是挺棘手的,例如:小屌丝:鱼哥,你说这性能测试,是不是就是并发测试?小鱼: 性能测试和并发测试,是两个概念,且并发测试不等同于性能测试。小屌丝:鱼哥,那你说,性能测试是不是包含并发测试?小鱼:吐血ing… 性能测试只是并发测试的一个小类而已小屌丝:哦,那性能测试…小鱼:住嘴!! 你别问,我怂~我给你详细的讲什么是并发测试,以及从我实际的项目中 给你解析常见的并发问题!小屌丝:挖草,这次赚大发了 !小屌丝:鱼哥,请开始你的表演!!1.1并发测试的定义1.并发测试的定义中,最主要的有两点①...
            1 0 1849
            分享
          •   一、写在前面的话  作为编程从业人员,单元测试早已不是生僻的、不为人知、不受重视的概念。  但是与此同时,实际情况下,除了开源SDK基本上会标配单元测试外,在真正的项目开发中,单元测试的实践程度低之又低。  这里面的原因非常非常多,笔者听到的最多的不写单元测试的原因就是 —— 没时间!  但是没时间是否能和'可有可无'画等号?是否能和'不重要'画等号?  也就是说,假设给到足够充足的时间,是否单元测试就能够顺利实施?覆盖率就能达到100%?  笔者后面会针对这些问题阐述笔者自己的理解。  二、不考虑时间的情况下,到底有没有必要搞单元测试?  假设有这样一个场...
            0 0 966
            分享
          •   这段时间公司项目急缺人手,面了不少人,竟然没有一个满意的。一开始瞄准的就是中高级的水准,也没指望来技术大牛,提供的薪资在15-25K,面试的人很多,但结果让人失望。  从简历上来说都是3-4年工作经验,但面试中,不会工具方法和编程框架,基本功的技术很多也不熟练,多数人多年的工作经验仅仅是业务年限堆起来的,技术能力达不到公司需求,对于框架自动化测试会的也不多,都停留接口测试的基础方法层面上,自动化深入的问题更是一问一个没,对于前沿的主流技术也毫无关注。  而这些人的薪资要求却是都接近20K,并且在谈论过程中自视甚高,特别有一个给我留了很深印象,简历写着3年经验,做的都是小程序的展示项目,面试...
            0 1 959
            分享
          •   1、引言  在撸码过程中,99.1%的大佬,都不敢说自己的撸出来的代码,是不需要debug的。换句话说,码农在撸码过程中,最痛苦的,莫过于撸出来的代码,为了能避坑,小鱼也是在撸码过程中,总结的一点避坑方法,请各位大佬笑纳。  2、避坑内容总结  2.1无法定位到元素  遇到问题:  找不到元素,脚本报“NoSuchElementException:Unable to find element”,或"定位到了,不能操作,点击无效。  解决方法:  1)查看自己的“属性值”是否写正确  2)元素的标签不唯一,默认找到第一个  3)向上查看,元素是否在frame或iframe框架中  ...
            0 0 1346
            分享
          •   你知道成功的关键是什么吗?我想你会说努力工作。嗯,这只是部分正确。作为软件测试人员工作了很长时间,我可以说测试人员和开发人员之间的协作对于成功极为重要。测试人员和开发人员之间的沟通不畅会进一步影响 Web 应用程序的发布日期。如今,大多数公司都采用敏捷框架来消除工作环境中的孤岛。但是,即使这种方法打破了许多部门壁垒,协作也可能不是最强的。  当开发人员和测试人员协作时,他们能够更好地沟通。适当的沟通有助于确保两个团队更好地了解需求,从而加快项目交付速度。但是公司如何实现这一目标?测试人员如何与开发人员有效协作?这正是我们将在本文中解决的问题。那么,让我们开始吧!  根据我的观察,QA 和开...
            0 0 670
            分享
      • 51testing软件测试圈微信