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

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(使用前将#替换为@)

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

  • 使用 Spring 时实例化对象,用于测试与生产

    使用 Spring 时 应该使用 Spring 配置 xml 来实例化生产对象 并在测试时直接实例化对象 这样的理解是否正确 Eg MyMain java package org world hello import org springf
  • 使用 RSpec 进行 Rails 片段缓存测试

    我觉得这是一个没有太多记录的主题 至少我在这里找到最佳实践时遇到了很多麻烦 我使用 cache key 在视图中进行片段缓存 tbody employees each do employee cache employee do tr emp
  • 为什么带有隐式转换运算符的自定义结构上的 Assert.AreEqual 失败?

    我创建了一个自定义结构来表示金额 它基本上是一个包装器decimal 它有一个隐式转换运算符将其转换回decimal 在我的单元测试中 我断言 Amount 等于原始十进制值 但测试失败 TestMethod public void Amo
  • 与 White 的集成测试[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 有人有白色框架的经验吗 www co
  • Selenium Web 驱动程序如何知道新窗口何时打开,然后恢复执行

    我在使用 Selenium Web 驱动程序自动化 Web 应用程序时遇到问题 该网页有一个按钮 单击该按钮会打开一个新窗口 当我使用以下代码时 它会抛出OpenQA Selenium NoSuchWindowException No wi
  • 指定自定义应用程序上下文

    我们正在将一些数据服务从使用 jersey spring 的 Jersey 1 x 迁移到使用 jersey spring3 的 Jersey 2 x 我们有一些继承自 JerseyTest 的测试类 其中一些类使用 web xml 文件中
  • 运行连接到 Django 测试数据库的 Celery Worker

    背景 我正在开发一个项目 该项目使用 Celery 来安排将在未来某个时间运行的任务 这些任务推动最终状态机的状态向前发展 这是一个例子 未来的提醒计划在 2 天内发送给用户 当该计划任务运行时 会发送一封电子邮件 并且 FSM 会前进到下
  • 从单元测试调用时,Application.Current 为 null

    我有一个尝试从单元测试中调用的方法 该方法在现实生活中将从后台线程运行 它使用一些代码来启动 UI 线程的调用更新 使用Application Current Dispatcher BeginInvoke However Applicati
  • XCTestExpectation 错误:API 违规 - 多次调用 -[XCTestExpectation fill]

    我在 Xcode 6 Beta 5 中使用 XCTestExpectations 进行异步测试 我的所有异步测试每次运行时都会单独通过 但是 当我尝试运行整个套件时 某些测试未通过 并且应用程序崩溃了 我得到的错误是说API violati
  • RSpec 与 Shoulda?

    我是单元测试场景的新手 我现在只使用单元测试大约两个月了 当我在 Ruby 中进行单元测试时 我目前遵循 TDD 风格并使用 Test Unit TestCase 我还阅读了 RSpec 以及它如何遵循 BDD 方法 我还读过关于 Shou
  • 使用mockito对DAO层进行单元测试

    我正在尝试使用 Mockito 对我的 Spring Hibernate 项目进行单元测试 以下是我的 DAO 类的实现 Repository public class EmployeeDAOImpl implements Employee
  • 如何在不支持“PrivateObject”的.Net Core应用程序中对私有方法进行单元测试

    我的应用程序是一个 NET Core应用 我有一个public如下所示的方法 它有两个私有方法 public bool CallService JObject requestJsonObj out Status status bool pr
  • 如何找到可能直接或间接调用给定方法的所有单元测试? (。网)

    如何找到可能直接或间接调用给定方法的所有单元测试 当我改变方法时 我希望知道要运行的最佳测试 必须有一个工具可以做到这一点 由于我们有很多接口 所以我对所有在实现接口的类上至少有一个路径 var 植入方法时调用接口上的方法的单元测试感兴趣
  • 在不使用魔术字符串的情况下将参数传递给 FakeItEasy-mock?

    我一直在使用Moq http code google com p moq 为了满足我过去几年的嘲笑需求 但看了之后假装简单 http code google com p fakeiteasy 我想尝试一下 我经常想测试是否使用正确的参数调用
  • 模拟 ngrx/store

    这是关于 Angular 2 官方版本的 我知道单元测试在 beta RC 和正式版本之间发生了巨大的变化 当 ngrx store 用作构造函数中的参数时 在单元测试中模拟 ngrx store 的好方法是什么 这并不像嘲笑服务那么简单
  • iPhone 操作系统测试最佳实践

    不久前 iPhone 的开发还相当简单 只有几个操作系统版本 甚至更少的设备 然而现在 有 2 个主要操作系统版本和 5 种不同的设备需要考虑 作为一家即将发布多个应用程序的公司 测试已成为越来越重要的问题 测试所有组合的最佳方法是什么 我
  • 在 React 中使用 setTimeout() 并测试它

    我意识到我一直在使用setTimeout 在我的项目中 也许 比我应该做的更多 我进行了快速研究并浏览了 Github 上的一些开源 React 项目 并决定我应该询问一下 I use setTimeout主要是为了更改类名或添加样式以对
  • 如何从控制台 exe 禁用 nunit 中的卷影复制

    我在加载时遇到问题Nunit测试 dll 测试 dll 使用其他一些 exe 在构建时复制了一些目录和文件 我在通话时收到了该错误test dll来自 nunitconsole exe System IO DirectoryNotFound
  • 在 Cypress 中提取部分文本

    我是 Cypress 的新手 我需要从我的应用程序中提取文本的动态部分 div Hello World greeting number 9123 div 在此示例中 我需要从 div 中提取 9123 以便稍后在测试中使用 知道我应该怎么做
  • 如何为 Inquirer.js 编写单元测试?

    我想知道如何为 npm 包编写单元测试询问者 js https github com SBoudrias Inquirer js 这是一个让CLI打包更容易的工具 我读过了这个帖子 https glebbahmutov com blog u

随机推荐

  • 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 是理所当然的 但是 当您需要彻底检修大型