TDD:为什么让应用程序代码知道它正在测试而不是运行可能是错误的?

2023-12-14

In 这个线程,布莱恩(唯一的回答者)说“你的代码应该以与测试无关的方式编写”

单个评论说“你的代码绝对不应该在全局“我正在测试标志”上分支。”。

但都没有给出理由,我会really喜欢听一些关于此事的理性想法。进入给定的应用程序类并设置一个布尔值来表示“这是一个测试,而不是运行”将非常容易(特别是考虑到许多测试对应用程序类具有包私有访问权限)。

我发现自己费尽心思(注入模拟私有字段等)来实现的各种事情都可以变得更容易完成。

同样明显的是,如果你采取得太过分,可能会造成灾难性的结果......但作为软件测试库中众多工具之一,为什么这个概念会受到如此多的谴责呢?

对米克助记符的回答:

如果您实际上在方法中间创建一个新的类实例并将其分配给私有字段,那么这可能会有所帮助的一个简单示例:私有字段模拟在这种情况下不会有帮助,因为您正在替换私有字段场地。但实际上创建一个真实的对象可能会非常昂贵:您可能希望在测试时将其替换为轻量级版本。

事实上,我昨天遇到了这种情况......我的解决方案是创建一个名为 createXXX() 的新包私有方法......这样我就可以模拟它。但这又违背了“你不应该仅仅为了适合你的测试而创建方法”的格言!


想想大众汽车的大丑闻。在测试中与在生产负载下表现不同的系统并未经过真正的测试。那就是:确实如此two系统、生产系统和测试系统——其中唯一经过测试的是测试系统。生产系统不同,未经过测试。您在两个系统之间引入的每个行为差异都是一个测试漏洞。

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

TDD:为什么让应用程序代码知道它正在测试而不是运行可能是错误的? 的相关文章

随机推荐

  • 查找丢失的序列间隙 mysql [重复]

    这个问题在这里已经有答案了 可能的重复 如何在SQL中查找组内序列中的缺失值 我的列的值如下 MAC00006300 MAC00006301 MAC00006302 MAC00006305 LED00006002 LED00006008 A
  • 使用 Thread.sleep() 限制 Libgdx 游戏中的 FPS 不起作用

    我正在使用 libgdx 为 android 开发一个小游戏 并希望将 fps 限制为 30 以节省电池 问题是它不起作用 fps 只是从 60 下降到 56 这是代码部分 位于渲染部分的末尾 System out print nFPS G
  • 如何在 android 中的 Imageview 上制作正弦波?

    我想创建与此类似的图像 可以用XML来完成吗 如果没有 我将如何缩放这样形状的图像 是的 这是可能的 你可以使用vactor drawable for it
  • 更改 Xcode 中的工作目录

    我设法使用 cmake G Xcode 在 Xcode 中运行我的 C 项目 现在我想调试它 因为它提供了很好的 gdb 前端 但是我需要更改执行 gdb 的工作目录 否则它将无法工作 它需要从相对于工作目录路径的文件中读取一些数据 我能做
  • asp.net 母版页以什么顺序执行

    我在我的项目中使用母版页 我想知道母版页和网页的页面加载顺序以及脚本的执行顺序 母版页子控件初始化 首先初始化母版页中包含的所有服务器控件 内容页子控件初始化 初始化内容页中包含的所有服务器控件 母版页初始化 母版页本身被初始化 内容页初始
  • 如何在 OSGi (Apache Felix) 中处理不同的日志记录解决方案

    在 OSGi 中 日志记录前端和实际输出之间是分离的 因此 通过使用日志服务 这并不意味着例如将任何内容写入控制台 这就是一个日志读取服务为 负责 在我当前的运行时 我正在添加org apache felix log它带来了一个 LogRe
  • 是否有 VS Code API 函数可以返回所有打开的文本编辑器及其视图列?

    I got a 功能要求为了我的扩展保存和恢复选项卡为了实现它 我需要能够获得所有 编辑器组 中所有打开的文本编辑器的列表 在 API 1 46 中 可以获得所有可见文本编辑器的列表 每组只有一个文本编辑器 和所有打开的文本文档的列表 与使
  • 为什么Windows服务不调用OnStart方法?

    我创建了一个 Windows 服务应用程序 其中包含OnStart方法 该方法将从中读取路径应用程序配置文件 创建一个对象 然后服务写入该对象的重写ToString 方法到一个文件StreamWriter 当我使用 手动启动此服务 时 这是
  • php三元运算符格式化

    这有效
  • C / C++ 中的关键字重新定义

    我可以在 C 中使用 define 重新定义关键字吗 我在 C 标准中发现了这一点 ISO IEC 14882 1998 和 ISO IEC 14882 2003 17 4 3 1 1 宏名称 lib macro names 2 包含标题的
  • Xaml 中的动态列绑定

    这是之前帖子的后续问题 here 我有一些 标题 信息存储为 Dictionary
  • 每秒更改图片框中的图像 C#

    我正在创建一个 WinForm 应用程序 它用网络摄像头拍摄一个人的照片 现在正在尝试创建倒计时效果 我有 4 张图像想要循环浏览 但事实证明这很难完成 我使用了秒计时器 但所发生的只是应用程序有点滞后 然后显示最后一张图像 有谁知道我如何
  • SetBounds 和 SetBoundsCore 有什么区别

    在 WinForms 中 您可以使用以下命令设置控件的边界SetBounds 或者如果您已经创建了用户控件 则可以覆盖SetBoundsCore 我想知道 他们的做法相同还是有什么不同 首先SetBounds不是虚拟的 因此如果您需要在设置
  • VSCode 仅导航回本地到当前文件?

    VSCode 中是否有一个选项可以限制 向后导航 这样它只会带您返回光标在当前文件中最后一个位置 这是当前的行为 在文件A上 打开方法foo 在文件A上 打开方法栏 关于文件B 打开方法baz 在文件A上 打开方法bor 如果我在 bor
  • 通过匹配键组合两个不相等的数组

    我想将下面的两个数组合并为一个 更具体地说 我想将第二个数组的内容添加到第一个数组中的匹配键 最终数组中的键应该具有两个数组的匹配键的内容 Array 123456789 404045862944400 gt 192 123456789 4
  • Chef apt_repository 开始失败并出现 SSL 验证错误

    从过去 2 天开始 我们开始看到与 apt repository 资源相关的 Chef 执行失败 厨师 客户执行也遇到了类似的失败 主厨独奏版本 12 19 36 操作系统 Ubuntu 14 中的 Ubuntu v18 请参阅 Chef
  • JavaScript 会成为一种“正确的”基于类的语言吗? [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 我指的是 MDN 关于 JavaScript 的 未来保留字 的文章 用于新的严格模式 https developer mozilla org en US docs Web JavaScr
  • 有人可以告诉我如何用循环替换以下 javascript 代码吗?

    dataBase 0 valueline d3 svg line x function d return x d Date y function d return y d dataBase 0 columnline dataBase 1 v
  • 如何使用 IAccessible 在 Firefox 中访问文档的 HTML

    我可以使用以下代码从 Firefox 窗口获取 IAccessible 对象 Guid guid new Guid 618736E0 3C3D 11CF 810C 00AA00389B71 object obj null int ret A
  • TDD:为什么让应用程序代码知道它正在测试而不是运行可能是错误的?

    In 这个线程 布莱恩 唯一的回答者 说 你的代码应该以与测试无关的方式编写 单个评论说 你的代码绝对不应该在全局 我正在测试标志 上分支 但都没有给出理由 我会really喜欢听一些关于此事的理性想法 进入给定的应用程序类并设置一个布尔值