单元测试的详细程度[关闭]

2023-12-04

我想开始讨论您在单元测试中涵盖的细节。

您是否测试由多种方法组成的主要功能,通过一次测试同时执行一项任务? 或者您甚至可以测试自动属性?

因为,例如,我认为编写仅测试以下内容的测试没有什么价值:

   public Email
   {
      set
      {
         if(Regex.Match(/*....*/))
             email = value;
      }
      get
      {
        return email;
      }
   }

因为它真的很清楚,但这只是浪费时间。 通常,当我进行单元测试时,我会测试整个任务 - 就像这个例子一样 - 整个注册过程。

我问这个问题是因为,目前我正在阅读吉米·尼尔森(Jimmy Nilsson)撰写的《应用领域驱动设计和模式》一书,他在书中指出,他正在通过专门的测试来测试如此小的细节。

这样的覆盖程度是否属于过度使用?


测试不仅仅是为了测试您编写的内容是否有效。测试还可以测试您编写的内容是否仍然有效。就像很多年后和许多开发人员一样。您认为非常简单的类将来可能会变得更加复杂。

例如,假设它开始时没有过滤器。只是一个简单的获取/设置。为什么要测试这个?后来其他一些开发人员添加了正则表达式过滤器,但它出现了错误。然后突然间课程被破坏了,但它未经测试,所以没有人知道。这表明调用堆栈上层存在神秘故障,现在需要更多时间进行调试。可能比编写一些测试所需的时间还要多。

然后,在未来,有人会尝试变得聪明并优化你的代码。或者重新格式化它,正则表达式往往会写成不可读的,并且通常可以进行一些清理。这对于微妙的破坏来说已经成熟了。小型有针对性的单元测试会发现这一点。

在上面的示例中,正则表达式可能是为了过滤看起来像电子邮件地址的内容。这需要检查正则表达式是否正常工作,否则您的电子邮件类将停止接受电子邮件。或者它开始胡言乱语。也许您的正则表达式没有涵盖有效的电子邮件地址,一旦您发现它就值得测试。最终,有人会用实际的解析器替换你的正则表达式。也许有效,也许无效。一个好的测试将有一个有效和无效电子邮件地址的简单列表,您可以在发现极端情况时轻松添加到该列表。

测试还可以让您测试您的界面并发现漏洞。当您输入电子邮件地址以外的内容时会发生什么?没错,什么也没有。 Email.set 默默地丢弃输入。进来的是垃圾,什么也没有出去,这是非常不礼貌的。也许它应该抛出异常。当您尝试测试它时,这一点很快就会变得清晰,因为有必要测试该集合是否有效。

测试还可以揭示不灵活性以及无法覆盖或定制的事物。在您的示例中,直接测试正则表达式过滤器会很方便,而不必每次都实例化一个对象。这是因为过滤器是最复杂的部分,并且在经过尽可能少的层时更容易测试和调试。通过将其放入Email.is_email_address您现在可以直接测试它。作为副作用,它也可以在子类中被覆盖。这很方便,因为大多数人都会进行电子邮件验证WRONG因为电子邮件讨厌生活!

最后,您希望您的测试是解耦的。在不受额外复杂性影响的情况下测试一件事,这样您就可以清楚地看到问题的根源。您的 Email 类非常适合进行简单、解耦的单元测试。

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

单元测试的详细程度[关闭] 的相关文章

随机推荐

  • Google Drive api:范围“drive.file”和“drive.readonly”的复制错误

    我的问题是 如果您只有范围 drive file 和 drive readonly 是否无法使用 google Drive api 将文件从驱动器中的一个文件夹复制到驱动器中的另一个文件夹 使用 API 浏览器进行测试 https deve
  • PhoneGap:如何获取 appView 的 id 并将其传递?

    对于PhoneGap应用程序 正如说明所述 我已经替换了setContentView 与super loadUrl file android asset www index html 下一行是appView addJavascriptInt
  • 如何将数组的前一个字符串与下一个字符串连接起来?

    我很难理解这个问题 但假设有一个包含这些元素的数组 apple banana pear kiwi orange 我想将此数组转移到 apple apple banana apple banana pear apple banana pear
  • 如何在java上进行mysqldump?

    我在 mySQL 中创建了数据库 并使用 mysqldump 将其导出到文件中 有没有办法让我的 JAVA 程序连接到 mysql 并使用我保存在文件中的结构创建一个空数据库 前提是上述数据库尚未存在于服务器中 谢谢你 尝试类似的方法 Ru
  • 如何嵌套 PHP 代码块

    这段代码被破坏了 因为我正在嵌套 php 代码块 执行此操作的正确方法是什么 gt
  • 在 Meteor 中,我如何在客户端知道服务器端操作何时完成?

    我知道 Meteor 对数据库进行客户端缓存 以获得更好的有效性能 在客户端Meteor方法调用中 有没有办法知道什么时候服务器端数据库操作actually完成 或者如果它实际上失败了 当完整的远程过程调用完成时 我是否可以挂钩一些事件来获
  • 使用 AWS ECS Fargate 进行水平和垂直自动扩展

    我这里有一个具体的用例 我需要自动扩展在 ECS Fargate 上运行的分布式 Web 应用程序 问题是所有节点都需要在内存中保存相同的数据 因此增加节点数量无助于缓解内存压力 因此 只有水平扩展 添加节点 和垂直扩展 增加节点内存 才能
  • LinkedIn inShare 插件共享计数器返回零

    我有一个 WordPress 博客 http bloculus com 我使用 Super Socializer 插件来分享我的帖子 最近 我发现我失去了所有 LinkedIn 分享计数 在每个帖子中 它都回到了 0 我联系了插件作者 我们
  • 使用 CSS 制作脉动环动画

    我想要一个从中心开始的扩展半径div而不是从左上角开始div 想象一下按钮有一个向外的脉动轮廓 那脉动的轮廓应该从中间开始div然后出去 请参阅此处的示例 https jsbin com dinehoqaro edit html css 输
  • IcmpSendEcho2 失败并显示 WSA_QOS_ADMISSION_FAILURE 和 ERROR_NOACCESS

    我有一个应用程序可以 ping 一堆服务器 它运行了好几天 但突然会出现以下两种类型之一的许多故障 WSA QOS ADMISSION FAILURE 11010 由于缺乏资源而发生 QoS 错误 or ERROR NOACCESS 998
  • 在matlab中绘制一个包含许多子图的大图

    我必须打印一张大海报 其中包含数字矩阵 让 MATLAB 排列它们对我来说非常实用 不幸的是 子图是为了适应特定的图形尺寸而显示的 因此很小且扭曲 我不想适应人物尺寸 而是想适应海报的纸张尺寸 我尝试过set gcf Position 并且
  • Delphi 皮肤库

    我想知道最适合您的 Delphi 应用程序皮肤库是什么 我正在寻找 WinXP Windows Vista Windows 7 兼容性 这样应用程序就不会因为皮肤而崩溃或工作异常 我尝试过主题引擎 但它在 Windows Vista 中运行
  • 使用 SSE 的矩阵向量和矩阵矩阵乘法

    我需要编写矩阵 向量和矩阵 矩阵乘法函数 但我无法理解 SSE 命令 矩阵和向量的维数始终是 4 的倍数 我设法编写了向量 向量乘法函数 如下所示 void vector multiplication SSE float m float n
  • 如何获取 Node.js 目录中存在的所有文件的名称列表?

    我正在尝试使用 Node js 获取目录中存在的所有文件的名称列表 我想要的输出是文件名数组 我怎样才能做到这一点 您可以使用fs readdir or fs readdirSync方法 fs包含在 Node js 核心中 因此无需安装任何
  • 类似于 git status 的命令(或脚本)显示自上次 git svn dcommit 以来的所有本地提交?

    这个 python 脚本是迄今为止我想出的最好的脚本 我只是将它组合在一起 在粗略的前几次使用中 似乎表现得正确 但我忍不住觉得有一种更简单的方法可以做到这一点 甚至是内置的东西 尽管我已经搜索了一遍 谢谢您的帮助 usr bin env
  • 如何将值传递到系统调用 XV6

    我正在尝试创建一个系统调用 该系统调用将增加添加到 cpu 结构中的数字 但是我相信系统调用必须是空的 那么我如何在调用它时传递一个值 增量数 3 Xv6 有自己的函数 用于将参数从用户空间传递到内核空间 系统调用 您可以使用 argint
  • 查询仅从字符串中获取数字

    我有这样的数据 string 1 003Preliminary Examination Plan string 2 Coordination005 string 3 Balance1000sheet 我期望的输出是 string 1 003
  • 如何以编程方式实例化和应用指​​令?

    我知道在 ng2 中我们有ComponentFactoryResolver可以解决我们可以应用到的工厂ViewContainerRef 但是 指令有类似的东西吗 一种实例化它们并将它们应用到组件的投影内容的方法 不 不能动态添加或删除指令
  • android SDK 中缺少 platform-tools\aapt.exe 目录

    我正在尝试使用 Eclipse 在 Android SDK 上运行 hello world 我正在一步一步地遵循本教程 http developer android com resources tutorials hello world h
  • 单元测试的详细程度[关闭]

    Closed 这个问题是基于意见的 目前不接受答案 我想开始讨论您在单元测试中涵盖的细节 您是否测试由多种方法组成的主要功能 通过一次测试同时执行一项任务 或者您甚至可以测试自动属性 因为 例如 我认为编写仅测试以下内容的测试没有什么价值