关于测试驱动开发的哲学问题

2024-01-27

我一直对测试驱动开发很感兴趣,但当我在实际项目中尝试时,我永远无法坚持下去。当我尝试时,我不断出现几个哲学问题:

  1. 你如何应对巨大的变化?当涉及到测试单一功能(一些参数、结果值、少量​​副作用)时,TDD 是理所当然的。但是,当您需要彻底检修大型设备时该怎么办?从 SAX 解析库切换到 DOM 解析库?当您的代码处于中间状态时,如何保持测试-代码-重构周期?一旦你开始进行更改,你将得到一堆失败的测试,直到你完全完成大修(除非你维护某种同时使用 DOM 和 SAX 的杂种类,直到你完成转换,但这很奇怪) 。在这种情况下,小步测试代码重构周期会发生什么?在整个过程中,您将不再采取经过充分测试的小步骤。人们一定有某种方法来处理这个问题。
  2. 当使用模拟测试 GUI 或数据库代码时,您真正测试的是什么?模拟的构建是为了准确地返回您想要的答案,那么您如何知道您的代码将适用于现实世界的数据库?对于这种事情,自动化测试有什么好处呢?它在一定程度上提高了信心,但是a)它没有给你提供完整单元测试应有的相同水平的信心,b)在某种程度上,你不是只是简单地验证你的假设是否适用于你的代码而不是您的代码可以与 DB 或 GUI 一起使用吗?

谁能给我指出在大型项目中使用测试驱动开发的好案例研究?令人沮丧的是,我基本上只能找到单个类的 TDD 示例。

Thanks!


你如何应对巨大的变化?

根据需要尽可能小。

有时重构表面很大,但细节却微不足道。这些可以通过相当大的步骤来完成。花太多的精力去试图打破它们将是浪费。

我认为 XML 库的更改就属于这一类。您将 XML 放入并获取一些表示形式。只要您的表示没有改变(从表示状态的图形到事件流),库切换就很容易。

大多数时候重构并不是微不足道的,必须进行分解。问题是何时采取更大的步骤,何时采取更小的步骤。我的观察是,我不太擅长估计变革的影响。大多数软件都非常复杂,您可能认为它们的更改很容易管理,但随后整个细则必须再次工作。所以我确实从一些改变开始。但如果事情开始变得不可预测,我准备回滚一切。我想说这种情况发生在十分之一的重构中。但这会很难。您必须找出系统中未按预期运行的部分。现在必须将问题分解为多个较小的问题。我确实一次解决一个问题,并在完成后检查。 (多次迭代的恢复和分裂并不罕见。)

如果您更改代码中的 XML 解析器和表示形式,这肯定至少需要两次单独的重构。

模拟测试

您正在使用模拟对象测试对象/层之间的通信协议。

整个模拟方法可以被认为是一个通信模型,就像开放系统互连模型 http://en.wikipedia.org/wiki/OSI_model。当 X 层得到参数 x 的调用时,它将调用带有参数 a 和 b 的 Z 层。您的测试指定了此通信协议。

尽管模拟测试很有用,但使用它们测试尽可能少的功能。最好的选择是基于状态的测试:设置固定装置、调用被测系统、检查被测系统的状态和纯功能(如函数式编程)测试:用 x 调用返回 a。

尝试以大多数功能松散耦合的方式设计系统。有些功能必须通过模拟测试来测试(完全解耦的系统是没有用的)。

集成测试不是测试您的系统的选项。它们只能用于测试系统中可能因多个单元的集成而中断的方面。如果您尝试通过集成测试来测试您的系统,您将进入排列赌场。

所以你的 GUI 测试策略应该是明确的。 GUI 代码中无法单独测试的部分应使用模拟测试进行测试(按下此按钮时,将使用参数 y 调用服务 X)。

数据库有点把水搅浑了。您不能模拟数据库,除非您要重新实现您想要支持的每个数据库的行为。但这不是单元测试,因为您正在集成外部系统。我已经接受了这个概念问题,并将 DAO 和数据库视为一个不可分割的单元,可以使用基于状态的测试方法进行测试。 (遗憾的是,这个单元在 Oracle 日和 mysql 日时的行为有所不同。并且它可能会在中间中断并告诉您它无法与自己对话。)

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

关于测试驱动开发的哲学问题 的相关文章

  • 使用原始类型模拟案例类

    考虑以下类型结构 trait HasId T def id T case class Entity id Long extends HasId Long 比方说 我们想在一些测试中模拟实体类 val entityMock mock Enti
  • 如何检查水豚中的复选框?

    我正在使用 Rspec 和水豚 我怎样才能写一个步骤来检查checkbox 我试过了check按价值但它找不到我的checkbox 我不知道该怎么做 因为我实际上有相同的 ID 但值不同 这是代码
  • Symfony2 功能测试会话持久性

    我正在尝试在 Symfony 中进行一些功能测试 但目前我的会话遇到了问题 我执行了一段代码 它似乎有效 但容器的会话中没有存储任何内容 我有一个表格 您可以在其中设置数据 当您提交它时 它会检查值并将其存储在会话中 然后它重定向到另一个页
  • 如何对嵌套函数进行单元测试? [复制]

    这个问题在这里已经有答案了 您将如何对嵌套函数进行单元测试f1 在下面的例子中 def f def f1 return 1 return 2 或者需要测试的函数不应该嵌套吗 有一个类似的问题这个链接 https stackoverflow
  • save_and_open_page 已停止提供我的 CSS

    我的测试设置工作得很好 每当我打电话时 都能提供正确格式的 css 页面save and open page从测试中 然后 我设置了一些 javascript 测试 并对我的设置进行了一些更改 抱歉 我无法详细说明所有内容 我没有足够详细地
  • Moq - 如何对方法中引用的更改进行单元测试

    另一天 另一个问题 我的服务层有以下方法 public MatchViewData CreateMatch string user var matchViewData HasReachedMaxNumberOfMatchesLimit us
  • Akka.net 和单元测试

    我想使用 Akka net TestKit 编写单元测试 但我有一个问题 我有一个 SubscriptionService 类 它负责将消息传输给选定的参与者 public class SubscriptionService Receive
  • Cucumber Java 与 Spring Boot 集成 - Spring @Autowired 抛出 NullPointer 异常

    我正在为 Spring boot 应用程序编写 cucumber java 单元测试来测试每个功能 当我与 Spring Boot 集成时 Autowired 类抛出 NullPointer 异常 Spring Boot应用程序类 Spri
  • 如何使用 google test for C++ 来运行数据组合

    我有一个单元测试 需要针对 200 种可能的数据组合运行 生产实现在配置文件中有要测试的数据 我知道如何模拟这些值 我更喜欢为每个组合编写单独的测试用例 并使用某种方式循环数据 有没有使用 Google test for C 的直接方法 您
  • 工作流程系统中的单元/自动化测试

    您是否对像 K2 这样的复杂工作流程系统进行自动化测试 我们正在构建一个在 Sharepoint 2007 和 K2 之间进行广泛集成的系统 我什至无法想象从哪里开始自动化测试 因为工作流程涉及多个用户与 Sharepoint K2 工作流
  • 使用 Moq 和 EF 4.1 模拟工作单元

    我正在通过 Contoso 示例进行一些 TDD 实践 并且我用于检索学生的测试正在通过 我创建新学生的测试失败了 尽管实际代码有效 因为我相信 DBContext 没有被嘲笑 为了通过这个测试 我应该重构什么 测试失败 如下所示 Cont
  • JUnit 崩溃说方法应该是静态的,然后崩溃说它不应该?

    我正在尝试在 JUnit 中进行一个简单的示例测试 测试两件事 然后进行拆卸 import org junit public class TestFoobar Test public void testOneThing Code that
  • 模拟比存根更好吗?

    不久前我读到了模拟不是存根 http www martinfowler com articles mocksArentStubs htmlMartin Fowler 的文章 我必须承认我有点害怕外部依赖性增加的复杂性 所以我想问 单元测试时
  • BDD/TDD:依赖可以是一种行为吗?

    我被告知不要使用实施细节 依赖关系看起来像是一个实现细节 但我也可以将其表述为一种行为 示例 LinkList 依赖于存储引擎来存储其链接 例如 LinkStorageInterface 构造函数需要传递一个已实现的 LinkStorage
  • 如何在 RequireJS 中模拟单元测试的依赖关系?

    我有一个要测试的 AMD 模块 但我想模拟它的依赖项 而不是加载实际的依赖项 我正在使用 requirejs 我的模块的代码如下所示 define hurp durp function Hurp Durp return foo functi
  • 如何测试调用父类的受保护(不需要的)方法的方法?

    我陷入了一个非常奇怪的情况 我有一些需要测试的特定代码 这里是 public class A The real method of real class is so big that I just don t want to test it
  • 通过 jquery/javascript 在警报或确认对话框中单击“确定”?

    我正在考虑在backbone js 和jquery 中编写一些UI 测试 它们可能不是最好的方法 但这是我正在考虑的事情 通过纯代码自动化测试而无需记录和回放 使用这种方法唯一让我摸不着头脑的是 在某些 用例流程 执行的 中 会出现确认 警
  • 使用最小起订量模拟第 3 方回调事件

    我们一直在尝试为用 C 编写的工作类编写单元测试 该类使用 moq 模拟第三方 API 基于 COM 来动态创建模拟对象 NUnit 是我们的单元测试框架 这个第三方组件实现了几个接口 但还需要使用事件回调到我们的工作类 我们的计划是模拟这
  • 单元测试:创建“模拟”请求来模拟 MVC 页面请求

    如何为我的 asp net mvc 应用程序创建模拟请求以进行单元测试 我有什么选择 我在我的操作中使用 FormsCollection 因此我也可以模拟表单输入数据 您只需创建 FormCollection 的新实例并在其中添加数据即可
  • 如何获取 vuejs 组件单元测试中定义的“this”变量

    我正在尝试在 npm 脚本中使用 mocha webpack 来测试 vuejs 组件 我在测试中像这样嘲笑 vuex 商店 const vm new Vue template div div

随机推荐

  • Xcode,误删除.pch文件,可以恢复吗?

    据我了解 pch 文件负责预编译头文件 听起来像是可以重建或重新创建的东西 2个问题 Xcode 是否有类似于回收站的东西 可以撤消文件删除 有没有直接的方法来重建 pch 文件 对于 CocoaTouch iPhone 来说是 Prefi
  • IE8 CSS 浮动问题

    我确信这之前一定已经涵盖过 因为我确信我不是第一个这样做的人 但我找不到答案 我正在为一个创建阴影效果 div 使用重复的背景图像 在底部的两个角 我使用 9x5 像素的小图像 我将它们左右浮动 在 Firefox 和 Safari 中它们
  • 在工具栏右侧添加自定义视图

    我正在努力实现这一目标 计时器toolbar红色背景 I am trying to add customView in toolbar It always end s up being on extreme left just beside
  • Android重复资源错误

    我的项目编译得很好 直到我删除了一些 png 可绘制对象 并通过导航到将它们替换为矢量可绘制对象新增 gt 矢量资源 我现在得到了重复资源错误 这是我的 res 文件夹 以下是 Gradle 控制台中的错误消息 Execution fail
  • Environment.MachineName 被裁剪为 15 个字符 [重复]

    这个问题在这里已经有答案了 NET System Environment MachineName 中有一个属性 它读取由于与 Windows 98 兼容而被裁剪为 15 个字符的计算机名称 我如何获得完整 未裁剪 的姓名 我建议使用inte
  • MySQL存储引擎的困境

    我想在我的应用程序中使用两个 MySQL 数据库功能 第一个是全文搜索和交易 现在 这里的困境是我无法在一个存储引擎中获得此功能 我要么使用 MyIsam 具有全文搜索功能 要么使用 InnoDB 支持 TRANSACTION 功能 我不能
  • 能否让Unity始终不抛出Synchronization LockException?

    Unity 依赖注入容器存在一个众所周知的问题 即 SynchronizedLifetimeManager 通常会导致 Monitor Exit 方法抛出 SynchronizationLockException 然后该异常会被捕获并忽略
  • LINQ 查询的返回类型是什么?

    Is it IEnumerable
  • NetStream http 视频无法在 IOS 设备上播放

    我正在尝试在 iPad 上播放视频 我的代码如下 public function init RTMP void videoURL http rest iphone high mp4 vid new Video nc new NetConne
  • 如何将 Flutter 与 Genymotion 连接?

    我在使用 Genymotion 在 Android 模拟器上运行 Flutter 应用程序时遇到问题 启动模拟器后 我尝试过 flutter run 但没有成功 控制台显示 没有连接的设备 那么如何将 flutter 与 Genymotio
  • WPF UserControl 设计时间大小

    在 WPF 中创建 UserControl 时 我发现给它一些任意的高度和宽度值很方便 以便我可以在 Visual Studio 设计器中查看我的更改 但是 当我运行该控件时 我希望未定义高度和宽度 以便控件将展开以填充我放置它的任何容器
  • Google.com 和其他流量大的网站可以使用 Google 的 PSI API 获得“快速”排名吗?

    谷歌改变了它的PSI https developers google com speed pagespeed insights 的定义快速排名FCP低于 1000 毫秒从 90 到 75 来自 PSI 文档 为什么v4和v5中的FCP值不同
  • MRE 和 MDK 安装程序之间的区别

    关于Mono Mac安装程序 有MRE安装程序和MDK安装程序 http www go mono com mono downloads download html http www go mono com mono downloads do
  • 如何在python中读取json对象[重复]

    这个问题在这里已经有答案了 我有名为 panamaleaks50k json 的 json 文件 我想从 json 文件获取 text 字段 但它显示以下错误 JSON 对象必须是 str bytes 或 bytearray 而不是 Tex
  • Angular 2通过插值为ngClass添加值

    假设我在数组中有一些对象 让我们称该数组为 items 例如 title Title value true 我使用 ngFor 来显示它们 如下所示 h1 item title h1 现在假设我想根据 item value 是 true 还
  • Flutter无法运行,get_navigation & 主题错误

    我实际上正在尝试运行我的应用程序 但我遇到了这个错误 Running flutter pub get in riverpod stacked app Launching lib main dart on sdk gphone x86 arm
  • 如果 npm 测试失败,npm posttest 不会触发

    有没有办法在测试失败时触发 npm 的后测试 如果 package json 包含 scripts pretest echo pretest test some failed test or error posttest echo post
  • 如何使用cascade =“all,delete-orphan”制作hibernate集合的副本

    我正在尝试复制一个休眠实体 A 如下所示 A a A session get A class id session evict a a setId null session save a 然而这不起作用 我得到以下异常 org hibern
  • 条件表连接

    我的雄辩模型中有以下范围 我想为其添加两个条件 我需要帮助才能做到这一点 public function scopeImages query query gt join images as i function join join gt o
  • 关于测试驱动开发的哲学问题

    我一直对测试驱动开发很感兴趣 但当我在实际项目中尝试时 我永远无法坚持下去 当我尝试时 我不断出现几个哲学问题 你如何应对巨大的变化 当涉及到测试单一功能 一些参数 结果值 少量 副作用 时 TDD 是理所当然的 但是 当您需要彻底检修大型