单元测试等价于白箱测试吗?

  单元测试 = 白箱测试? 这是很多人的想法. 一听到白箱测试, 就认为他就是单元测试. 或者认为单元测试时, 就是要用白箱测试的方法来进行.

  事情是这样吗? 让我们继续看下去:

  当我们要测试这个程序时

  Stack push(Stack s, int key)

  你会怎么测试呢? 你可能会考虑以下几种状况

  (1) 空的 stack, 第一次 push

  (2) 不是空的 stack, 然后 push 东西

  (3) stack 是满的, push 个东西看会不会有问题

  (4) 不是空的 stack, 然后 push 一个字符

  (5) 不是空的 stack, 然后 push 一个指标

  你所做的大多是根据程序思考逻辑, 或者是根据输入的值域来做参考, 来建立测试个案.

  这些方式其实都是黑箱测试(用到了 use case testing 和 Equivalence Class Testing等方法, 可自行去网络上找详细介绍), 也就是不管程序内部如何被实作. 只根据行为和输入值域来开立测试.

  那真正的白箱测试会是怎么进行呢?

  基本上, 可以测试的状况有无限多种. 而白箱测试是要根据程序内容来决定要怎样挑最小可测试的集合.

  那程序内有甚么东西, 可以让我们来做挑选的判断呢? 一般常见的是根据程控逻辑. 例如: 是否经过所有的叙述(statement); 是否经过程序所有分支等等.

  如果以经过所有的叙述为例, 对于下面的程序

  01: Stack push(Stack s, int key)

  02: {

  03:     if(isFull(s)){

  04:        printf("Stack is full !!\n");

  05:     }else{

  06:         s.top = s.top + 1;

  07:         s.element[s.top] = key;

  08:         printf("Success push %d in the Stack\n", key);

  09:     }

  10:     return s;

  11: }

你会找出这组路径, 来当作最小需要测试的集合, 然后对它建立其相对应的测试个案

  path1: 01-02-03-05-06-07-08-09-10-11

  test case 1:

  push (s, 3)

  path2: 01-02-03-04-10-11

  test case 2:

  push (s, 3) (repeat 10 times, 如果 stack 大小是10 的话)

  push (s, 3)

  (当然你可以只用test case 2, 因为它涵盖了 test case 1 的状况)

  一般人通常不会先分析执行路径, 再找测试个案. 大多是根据一些准则, 找出测试个案就开始测试了. 所以一般单元测试是用黑箱测试方式在进行, 而非白箱测试.

  那为何大家会有错觉单元测试 = 白箱测试呢?

  那 是因为在进行白箱测试时, 对于一个大的系统要找出可执行路径, 会是一件很复杂的事情. 但是对于每个单元时, 这件事情变得比较容易, 比较有可能不藉由工具的辅助, 就能自己进行. 也就是说在单元测试时, 比较容易进行白箱测试. 可是不知怎么传的, 很多人就把这两个视为同义.

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-10-25 03:46:09

单元测试等价于白箱测试吗?的相关文章

iOS单元测试1

iOS单元测试1 iOS单元测试分为两种类型的测试: 应用测试.应用程序测试可以检查app的代码组件,比如计算机的算术运算的例子.你可以利用应用程序测试来确保你的UI空间控件保持原有位置,并且你的控件和控制器对象能够和对象模型正确地工作. 逻辑测试(库测试).逻辑测试可以检查独立代码的行为是否正确.利用逻辑测试,你可以将整个库的组件放在一起进行测试,通常测试对象是对象和方法. 性能测试:所谓性能测试,主要是评估一段代码运行的时间.(自己添加的,个人觉得应该也属于一类测试把).性能测试的格式:-

玩转Node.js单元测试

代码部署之前,进行一定的单元测试是十分必要的,这样能够有效并且持续保证代码质量.而实践表明,高质量的单元测试还可以帮助我们完善自己的代码.这篇博客将通过一些简单的测试案例,介绍几款Node.js测试模块: Mocha和Should,SuperTest.本文侧重于解释原理,各个模块的详细使用案例以后单独再聊. 为啥需要单元测试? 所谓单元测试,就是对某个函数或者API进行正确性验证.来看个简单的例子add1.js: function add(a, b) { return a + b; } 没错,我

Python单元测试:assertTrue是真值,assertFalse是假值

在这篇文章中,我们将介绍单元测试的布尔断言方法 assertTrue 和 assertFalse 与身份断言 assertIs 之间的区别. 定义 下面是目前单元测试模块文档中关于 assertTrue 和 assertFalse 的说明,代码进行了高亮: assertTrue(expr, msg=None) assertFalse(expr, msg=None) 测试该表达式是真值(或假值). 注:这等价于 bool(expr) is True 而不等价于 expr is True (后一种情

单元测试的四大具体效益

单元测试是高效的开发过程质量控制机制,帮助企业保证产品质量.降低成本.提高生产率.缩短开发周期.赢得市场先机,提升竞争力. 1.保证代码质量 仅依靠系统测试会 存在大量未覆盖的"死角",单元测试可以对各个代码单元彻底测试,保证代码质量.针对一个函数,单元测试可以覆盖输入数据的所有分类,做到不管输入什么数 据,函数本身的处理都符合设计,从而全面检测其功能逻辑,消灭可能隐藏的大量细小错误,这种测试效果是其他测试难于做到的.输入数据的"分类",称为"等 价类&q

Python 单元测试:assertTrue 是真值,assertFalse 是假值

在这篇文章中,我们将介绍单元测试的布尔断言方法 assertTrue 和 assertFalse 与身份断言 assertIs 之间的区别. 定义 下面是目前单元测试模块文档中关于 assertTrue 和 assertFalse 的说明,代码进行了高亮: assertTrue(expr, msg=None) assertFalse(expr, msg=None) 测试该表达式是真值(或假值). 注:这等价于 bool(expr) is True 而不等价于 expr is True (后一种情

JUnit + Mockito 单元测试(二)

JUnit 是单元测试框架.Mockito 与 JUnit 不同,并不是单元测试框架(这方面 JUnit 已经足够好了),它是用于生成模拟对象或者直接点说,就是"假对象"的工具.两者定位不同,所以一般通常的做法就是联合 JUnit + Mockito 来进行测试. 入门 首先是配置 Mock 对象,看看例子怎么写的. List mock = mock( List.class ); when( mock.get(0) ).thenReturn( 1 ); assertEquals( &q

在Python的Flask框架中实现单元测试的教程

  在Python的Flask框架中实现单元测试的教程,属于自动化部署的方面,可以给debug工作带来诸多便利,需要的朋友可以参考下 概要 在前面的章节里我们专注于在我们的小应用程序上一步步的添加功能上.到现在为止我们有了一个带有数据库的应用程序,可以注册用户,记录用户登陆退出日志以及查看修改配置文件. 在本节中,我们不为应用程序添加任何新功能,相反,我们要寻找一种方法来增加我们已写代码的稳定性,我们还将创建一个测试框架来帮助我们防止将来程序中出现的失败和回滚. 让我们来找bug 在上一章的结尾

写有价值的单元测试

这是写给开发同学系列文档中的一篇,主要讲单元测试. 写这个系列的原因是发现开发同学,尤其是偏业务的开发同学对于软件开发中的很多实践和理论理解的不够清楚.比如设计文档,代码评审,单元测试,集成测试和自动化测试,持续集成和持续发布这样一些耳熟能详的概念,说起来每个开发同学都听过,但很多人并没有深入考虑过为什么要引入这些实践,实践需要哪些手段,要达到什么目的,要坚持什么原则?所以这些实践落地的过程也是千差万别,效果往往也不甚理想. 通过这一系列文档,我会把我所了解的每个实践的来源.适用范围和价值用最简

追求代码质量: 对Ajax应用程序进行单元测试

使用 GWT 更轻松地测试异步应用程序 简介: 您可能从编写 Ajax 应用程序中获得了极大乐趣,但是对它们执行单 元测试却着实让人头痛. 在本文中,Andrew Glover 着手解决 Ajax 的弱点( 其中之一),即应对异步 Web 应用程序执行单元测试的固有挑战.幸运的是, 他发现在 Google Web Toolkit 的帮助下,解决这个特殊的代码质量问题要比预 想的容易. Ajax 在近期无疑是 Web 开发界最时髦的字眼之一 -- 与 Ajax 相关的工具.框架.书籍以及 Web