困惑:单元测试该在什么时候写?

2023-11-15

原文:http://www.codinghorror.com/blog/2005/04/good-test-bad-test.html

作者: Jeff Atwood


很多年以来,用于随机测试(ad-hoc test)的工具我都是自己开发的。但在最近的一个项目中,我终于采用了NUnit和TestRunner来做正式的单元测试。下面是我编写的第一个单元测试,看起来很简单,而且轻轻松松就通过了:

<TestFixture()>_

PublicClass UnitTests

 

  Private _TargetString As String

  Private _TargetData As Encryption.Data

 

  <TestFixtureSetUp()> _

  Public Sub Setup()

    _TargetString = "an enigma wrapped ina mystery slathered in secret sauce"

    _TargetData = NewEncryption.Data(_TargetString)

  End Sub

 

  <Test(),Category("Symmetric")> _

  Public Sub MyTest()

    Dim s As New Encryption.Symmetric(Encryption.Symmetric.Providers.DES)

    Dim encryptedData As Encryption.Data

    Dim decryptedData As Encryption.Data

 

    encryptedData = s.Encrypt(_TargetData)

    decryptedData = s.Decrypt(encryptedData)

   

    Assert.AreEqual(_TargetString, decryptedData.ToString)

  End Sub

 

EndClass

 

这个测试系统真是太棒了,因为我一眼就能看出这块代码在测什么,以及它是如何工作的。这不禁让人感叹:简单就是美!于是,实现单元测试的框架已经不成问题。问题在于,要决定测什么,以及如何去测。或者再把问题理论化一点:怎样才算是好的测试?

单元测试的价值是毋庸置疑的!跟大多数开发人员所做的测试比起来,即使是最最基本的单元测试(就像上面给出的例子那样),也是巨大的进步。也就是说,大部分开发人员根本就不做测试!他们只是随意输入一些数据,然后点几个按钮。如果在这个过程中没有发现尚未处理的异常,他们就觉得代码已经够好了,可以交付给测试团队了……

单元测试的真正价值在于,它迫使你停下来,为测试思量一番。跟漫无计划的随机测试比起来,单元测试让你为你刚刚写下的代码思考一连串艰难但又不得不考虑的问题:

  • 我该怎样测试这块代码?
  • 我该执行何种测试?
  • 通常的情况是怎样的?
  • 可能碰到的异常情况有哪些?
  • 我有多少外部依赖关系?
  • 我可能会碰到哪些系统故障?

单元测试并不会保证软件最终能正确工作。我觉得抱有那种期望也是不合理的。但编写单元测试确实保证了开发人员想过了那些相当棘手的测试问题,哪怕他们只是粗略地想了一下。不用怀疑,只要做了单元测试,我们就已经在正确的方向上前进了一步。

关于单元测试,我也确实有一些其他的纠结。比如,如何在单元测试与大规模的代码重构之间找到平衡——在我做过的所有项目中,在开发的早期阶段大都要进行重构。其实,Unicode Andy也有同样的纠结:

在单元测试方面,我当前遇到的主要问题是,当我修改设计的时候,就会有一大堆测试通不过。这意味着,我要么少写一点测试,要么尽量少做大的设计修改。但两者都是不理想的。

为了避免这个问题,我只能退而求其次——测试晚一点再介入——但这又跟新潮的“测试驱动开发”模式背道而驰。编写单元测试是必要的,积极地重构代码也是必要的。你是如何来平衡的呢?先写测试的方式可以减少代码重构的负担吗?或者在设计稳固之后再增加单元测试?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

困惑:单元测试该在什么时候写? 的相关文章

随机推荐

  • 微信小程序(一):微信小程序与服务器的简单链接

    生活无趣且不易 一起找点乐子吧 欢迎评论 和文章无关的东西也没关系 关于小程序的有些问题 我搜索不到太有价值的东西 可能是我对关键字的理解不好 在这里我总结下遇到各种问题 可能看来会比较可笑 但对新手来说也许会有些帮助 我会尽量去注重具体的
  • 微众银行DSS部署单机-普通版

    DSS 普通版部署 我的服务器 我的配置 vim conf config sh vim conf db sh QA 我的服务器 centos 7 0 8C16G 100G机械硬盘 我的配置 bashrc文件内容 JDK export JAV
  • 基本稳压电路

    经过整流后的电源具有较大的电压纹波 单靠调节滤波电容不能明显改善输出电源纹波特性 因此需要采用稳压电路来减小输出电源的纹波 若直将稳压管接至负载输出 则稳压管的工作特性受负载影响较大 甚至会出现不能正常工作的情况 采用下图所示的稳压电路则能
  • 9种小程序赚钱方法!看懂的人已经在行动了

    小程序自上线以来 市面上出现了越来越多与小程序相关的行业 针对目前市面上已出现的小程序商业形式 微趋道今天整理出了以下9种小程序盈利模式分享给大家 微趋道 就是小程序 纯小程序创业 自小程序上线以来 不断有创业者加入到小程序创业中 小程序相
  • 【软件测试 #1】策略练习题

    软件测试策略习题 1 单选 根据软件需求规格说明书 在开发环境下对已经集成的软件进行的测试是 A 集成测试 B 单元测试 C 系统测试 D 验收测试 正确答案 C 2 单选 集成测试对系统内部的交互以及集成后系统功能检验了哪一种质量特性 A
  • 基本的图算法

    基本的图算法主要是两个方面 图的表示和图的搜索 我们主要通过邻接链表和邻接矩阵对图进行表示 但是在图算法更重要的是图的搜索 图的搜索指的是系统化的跟随图中的边来访问图中的每个节点 我们可以通过图的搜索算法发现图的结构 或者换个方面想图的算法
  • 这是一篇新样式**就是一些有特殊含义的字符,

    新的东西1所谓所谓特殊字符 就是一些有特殊含义的字符 如上面说的 runoo b 中的 简单的说就是表示任何字符串的意思 如果要查找字符串中的 符号 则需要对 进行转义 即在其前加一个 runo ob 匹配字符串 runoob 许多元字符要
  • 国内敏捷项目管理软件-Leangoo领歌敏捷看板工具

    Leangoo领歌是一款专业的敏捷开发管理工具 提供端到端敏捷研发管理解决方案 涵盖敏捷需求管理 任务协同 进展跟踪 统计度量等 Leangoo领歌上手快 实施成本低 可帮助企业快速落地敏捷 提质增效 缩短周期 加速创新 Leangoo领歌
  • matlab RANSAC拟合二维圆(详细过程版)

    RANSAC 一 算法原理 1 算法流程 二 代码实现 三 结果展示 四 测试数据 一 算法原理 1 算法流程 从数据集中随机选择三个点 使用这些点来计算圆心和半径 对于每个数据点 计算其到估计的圆的距离 如果距离小于给定的阈值 则将该点视
  • 给windows设置定时任务并运行py脚本

    想要每天定时执行py脚本 可以试试windows自带的 第一步 找到控制面板 系统和安全 管理工具 计划任务 第二步 创建基本任务 第三步 给任务取个名字 第四步 根据需求选择执行频率 第五步 设置时间和触发频率 第六步 启动程序 第七步
  • Ubantu下Linux动态IP和静态IP配置方法

    Ubantu Linux动态Ip和静态Ip配置方法 一 动态Ip配置 二 网络配置文件 1 进入网络配置文件 2 静态Ip和动态Ip的修改 3 修改inerfaces文件后需要进入DNS文件添加域名Ip 三 重启网络 让其配置生效 四 使用
  • 【自学C++】C++转义字符

    C 转义字符 C 转义字符教程 在编程中有一些字符是打不出来的 比如换行 提示音 下一个制表位等等 于是程序语言的开发者就设计了转义序列 escape sequence 这种东西用来表达这些字符 所谓转义 可以理解为 采用某些方式暂时取消该
  • Openstack CLI命令管理私有云主机实战(附OpenStack实验环境)

    1 Openstack CLI 命令行管理入门 查看nova云主机 nova list ERROR CommandError You must provide a username or user ID via os username os
  • “华为杯”研究生数学建模竞赛2004年-【华为杯】D题:研究生录取问题的双向选择策略(附一等奖获奖论文)

    赛题描述 根据素质教育和培养高素质合格人才的要求 目前各学校都对硕士研究生的录取方法进行改革 即在录取的过程中改变了以往根据考试成绩定终身的做法 加大了复试的作用 一般是根据初试的成绩 在达到国家和学校分数线的学生中从高分到低分排序 按1
  • 读《洞穴奇案》——从虐猫到禁食狗肉,自然法真的存在吗?

    这是读 洞穴奇案 的第四篇心得体会 本篇的题目一下子就包含了两个热点话题 高校学生虐猫案 和 立法禁止吃狗肉 这两个事件不得不说是争议不断的 从理性和感性的角度出发得出的结论不一而足 如果此人像探险者一样并没有邪恶的意图 而我们判他有罪 判
  • 什么是U-Boot以及如何下载U-Boot源码

    参考 什么是U Boot以及如何下载U Boot源码 作者 一只青木呀 发布时间 2020 10 20 11 05 59 网址 https blog csdn net weixin 45309916 article details 1091
  • 谷歌地图api訪问失败

    在非外网情况下 我们调用谷歌api会出现载入不到地图的现象 此时能够换一下域名试试或许就好了 比方我自己訪问api时时这样写的 https maps googleapis com maps api js key sensor true 此时
  • Java中Iterator和Iterable的区别

    iterator为Java中的迭代器对象 是能够对List这样的集合进行迭代遍历的底层依赖 iterable接口里定义了返回iterator的方法 相当于对iterator的封装 同时实现了iterable接口的类可以支持forEach循环
  • 多合一网络分析平台Matomo

    什么是 Matomo Matomo 以前称为 Piwik 是领先的开源分析平台 可以让您轻松地从访问者那里获得您想要的信息 例如查看您的网站访问者来自何处 正在查看哪些页面 单击了哪些链接以及其他各种有用的信息 写 Umami 时 网友 J
  • 困惑:单元测试该在什么时候写?

    原文 http www codinghorror com blog 2005 04 good test bad test html 作者 Jeff Atwood 很多年以来 用于随机测试 ad hoc test 的工具我都是自己开发的 但在