从头开始一个 TDD 项目

2024-04-21

我读了很多关于 TDD 的问答和关于 SO 的单元测试,但我没有找到任何答案:我从哪里开始?

我和团队已经完成了几个项目,在这些项目中,我们对代码采用了单元测试……但先编码,然后单元测试。在开发过程的某个阶段,先编写测试然后编写代码变得很自然,这使我们采用了更 TDD 的风格。

现在我们想要迈出下一步,尝试从头开始使用 TDD 开始一个新项目。问题来了……从哪里开始呢?当我根本没有代码时,我要编写的第一个测试是什么?

比方说,为了有一个可以思考的背景,我必须开发一个以文档为中心的互联网应用程序,有一些工作流程和......其他东西。 但让我们从头开始:首先,我想创建一个简单的页面,列出存储在数据库表中的所有文档(元数据)(很简单,呃?)。 我要写的第一个测试是什么?假设我正在使用 Hibernate 访问数据库...我会测试假想方法 getAllDocuments() 吗?但是我应该使用模拟对象来替代 Hibernate 吗?那么我在测试什么?

我在这里有点困惑...而且 getAlDocuments() 可能永远不会成为一种生产方法...所有文档集合都将按某些内容进行排序和过滤...这有意义吗? 任何建议将不胜感激

Edited:

阅读您的答案后(以及类似的帖子http://programmers.stackexchange.com http://programmers.stackexchange.com)我对 TDD 有更好的看法,但我仍然有疑问。

我一直认为 TDD 是首先进行单元测试……从未考虑过端到端测试。 但我要问:TDD 说你必须编写一个测试并看到编译错误;然后你创建类和方法,但测试失败;然后你实现该方法并让测试通过。在测试失败之前你不能编写代码;在所有测试通过之前,您不能编写另一个测试。我在这儿吗?

如何进行端到端测试作为我的第一次测试?我应该在所有层中编写所有代码,以使测试通过。但是然后我将拥有一堆类和方法,所有这些类和方法都通过我的端到端测试进行了测试(我不应该称之为集成测试吗?)。这意味着我不再需要单元测试,因为我已经有一个涵盖我的代码的测试。我无法编写已经通过的测试,这违背了 TDD 实践。

请帮助我理解这进一步的步骤


TDD 不是关于单元测试 - TDD 是关于通过测试驱动您的开发和架构 - 通过您需要的任何类型的自动化测试。你明白重点了吗?

您正在开始一个新项目,并且可能有一组功能。对于要实现的功能,您应该有一些接受标准。这些标准可以定义您的顶级测试。让我们从端到端测试(有时这可能非常困难,因为它涉及尚不存在的 UI)或针对这些验收标准的集成测试开始。一旦测试失败,您将继续实现与大型测试相关的功能,但每个功能都将通过集成或单元测试再次驱动。如果所有顶级测试都通过,则该功能已完成。

如果您跳过大型测试(端到端、集成),您将开发一组经过良好测试的单元,这些单元在集成在一起时将无法工作,或者由于单元测试定义的本地范围,您的架构将不会很好。集成和端到端测试为您提供了全球范围。

书中用大型示例(Java)对此进行了描述以测试为指导不断发展面向对象的软件 http://www.growing-object-oriented-software.com/.

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

从头开始一个 TDD 项目 的相关文章

  • 如何在不使用 Mock 的情况下对 Python 方法进行存根

    我是一名 C 开发人员 正在转向一些 Python 领域 所以我还不知道自己在做什么 我读到你并不真正需要 Python 的依赖注入 有人告诉我 您可以在代码中实例化对象并让它们按照您想要的方式运行 但是 您可以将这些对象上的方法指向我在测
  • NUnit 测试运行顺序

    默认情况下 nunit 测试按字母顺序运行 有谁知道有什么方法可以设置执行顺序吗 是否存在这样的属性 我只是想指出 虽然大多数受访者认为这些是单元测试 但问题并没有具体说明它们是 nUnit 是一个很棒的工具 可用于各种测试情况 我可以看到
  • Perl 构建、单元测试、代码覆盖率:一个完整​​的工作示例

    我找到的关于 Perl 构建过程 单元测试和代码覆盖率的大多数 Stackoverflow 答案都只是将我指向 CPAN 那里的文档 指向 CPAN 模块绝对没有任何问题 因为完整的文档应该位于此处 不过 在很多情况下 我很难找到完整的工作
  • 模拟 RSpec 单元测试中的竞争条件

    我们有一个异步任务 它对对象执行可能需要长时间运行的计算 然后结果缓存在对象上 为了防止多个任务重复相同的工作 我们添加了带有原子 SQL 更新的锁定 UPDATE objects SET locked 1 WHERE id 1234 AN
  • 使用 PHPUnit 测试受保护方法的最佳实践

    我发现有关的讨论你测试私有方法吗 https stackoverflow com questions 105007 do you test private method内容丰富 我决定 在某些类中 我想要受保护的方法 但要测试它们 其中一些
  • 使用 NSURLSession 进行单元测试

    我想为使用共享的方法编写单元测试NSURLSession 特别是 NSURLSessionDataTask下载数据 基本上 我希望目标方法能够接收模拟响应 数据 而不需要互联网连接 模拟这些组件的不太不显眼的方式是什么 我正在考虑填充NSU
  • Python 单元测试 Google Bigquery

    我在对以下代码块进行单元测试时遇到问题 from google cloud import bigquery from google oauth2 import service account def run query query gcp
  • 构造函数上的分支未涵盖

    我正在使用 Jasmine 创建单元测试 我对所涵盖的分支有疑问 有谁知道为什么代码部分显示分支没有被覆盖 如下所示 这是单元测试 describe MyComponent gt let component MyComponent let
  • Android:如何测试自定义视图?

    Android 中有多种单元测试方法 测试我编写的自定义视图的最佳方法是什么 我目前正在将其作为仪器测试用例活动的一部分进行测试 但我宁愿只测试孤立的视图 对于缺乏以视图为中心的测试用例实现的一个简单解决方案是在包含视图的测试项目中创建一个
  • 单元测试定位服务

    我有一个位置跟踪服务 正在尝试对其进行单元测试 我正在尝试使用 locationManager addTestProvider 和 setTestProviderLocation 方法来实现此目的 但是 我似乎无法通过提供程序获取任何位置并
  • grailsGrails 单元测试中的应用程序访问

    我正在尝试为使用 grailsApplication config 进行一些设置的服务编写单元测试 看来在我的单元测试中 服务实例无法访问其设置的配置文件 空指针 而当我运行 run app 时它可以访问该设置 我如何配置服务以在单元测试中
  • 如何获取Azure DevOps Pipelines中变量的单元测试结果?

    我在 Azure DevOps 中有一个构建管道 并且正在使用 NET Core 任务来应用单元测试 我需要获取变量中单元测试的结果 例如 如果有 10 个测试用例 其中两个失败 我需要得到如下信息 failedTestCases 2 su
  • 是否有用于运行测试组的 JUnit TestRunner?

    我目前正在使用 JUnit 4 并且需要将我的测试分为可以以任意组合有选择地运行的组 我知道 TestNG 具有注释测试以将它们分配到组的功能 但我现在无法迁移到 TestNG 看来这可以通过一些自定义注释和自定义 JUnit TestRu
  • 在unittest.main()之后执行命令

    我从另一个 Python 脚本调用以下脚本 测试 py 日志文件 它应该运行测试并将结果保存在日志文件中 但由于某种原因 之后的命令unittest main testRunner runner 没有被执行 我什至不确定文件写入后是否会关闭
  • Grails 控制器单元测试不会将页面渲染到response.text

    我的环境配置 Java 1 7u51 Grails 2 3 7 我试图断言response text在控制器测试中但它总是带 发生了什么 这是我的用户控制器 class UserController def index flash erro
  • 已删除的测试仍保留在 Xcode 测试导航器中

    我最近从我的项目中删除了一些旧的测试类并删除了这些文件 正如预期的那样 文件被移至垃圾箱并在 git 中显示为已删除 不幸的是 它们定义的测试类和测试用例继续出现在测试导航器中 我尝试过常见的方法 例如清理和重建 以及退出并重新打开 Xco
  • 使用 Minitest 测试自定义验证器

    我有多个带有电子邮件验证的模型 因此 我将验证提取到自定义验证器中 我按照以下教程做到了这一点导轨指南 http guides rubyonrails org active record validations html custom va
  • 如何运行传递给模拟方法的 lambda 函数?

    我想知道是否可以运行作为参数传递给模拟函数的 lambda 函数 并在调用模拟方法时运行它 我正在使用 Mockk 我想象代码是这样的 class DataManager fun submit lambda Int gt Unit val
  • 使用 Retrofit2 和 Mockito 或 Robolectric 进行 Android 单元测试

    我可以测试 Retrofit2beta4 的真实响应吗 我需要 Mockito 或 Robolectic 吗 我的项目中没有活动 它将是一个库 我需要测试服务器是否正确响应 现在我有这样的代码并卡住了 Mock ApiManager api
  • 单元测试时 Android Studio 2.0 中测试状态终止且没有任何失败消息

    Issue 我昨天在 Ubuntu 上从 1 5 升级到了 Android Studio 2 0 当我在 Android Studio 2 0 中进行单元测试时 即使所有测试都已通过 它也会显示 终止测试 状态 有时它只显示部分测试通过 我

随机推荐

  • 提高谷歌地图绘制长路径的性能

    这个问题和这个不一样另一个 https stackoverflow com questions 7503848 improving google maps performance因此 我观察到原生谷歌地图应用程序在地图上绘制很长的距离 当缩
  • PyQt QtWebKit loadFinished 未调用

    我有这个脚本 当它准备好时我想用它做更多的事情 from PyQt4 import QtCore QtGui QtWebKit class WebViewCreator def init self self view QtWebKit QW
  • 为什么 JavaScript 换行符在 HTML 中不起作用?

    我有以下内容 你们可能都知道 n不起作用 我必须使用 br 反而 如果我链接到外部 它也不起作用 js文件 这是我的问题 为什么不 n work 为什么 br 甚至工作 脚本标签内的所有内容难道不应该是严格的 JavaScript 而不是
  • openaigym env.P,AttributeError“TimeLimit”对象没有属性“P”

    我目前正在阅读 Sudharsan Ravichandiran 的 Python 强化学习实践 在我遇到的第一个示例中 遇到了以下 AttributeError AttributeError TimeLimit object has no
  • 将文本+图标组合成一个自动换行的小部件

    我正在尝试为我的应用程序创建一个帮助页面 我想简单地写 按 ICON 刷新分数 或在设置抽屉中启用自动刷新 其中 ICON 是 Icons refresh 如果屏幕不适合 则将整个内容自动换行 如果都是文本 我会简单地将其包装在灵活的小部件
  • 如何修复这个损坏文件的 PHP 下载脚本?

    我有一个强制下载脚本 可以在 PDF 和纯文本中产生良好的结果 并且在 ZIP 存档中半正常 它们在 Windows 中工作 而不是在 Linux 中工作 但是 应用程序文件和图像都失败 这些构成了我必须处理的绝大多数文件 正如我在此处看到
  • Django ORM 能否以与后端无关的可靠方式存储无符号 64 位整数(又名 ulong64 或 uint64)?

    我见过的所有文档都暗示你might能够做到这一点 但没有任何官方 w r t ulong64 uint64 字段 在这个领域有一些现成的选项看起来很有前途 BigIntegerField 几乎 但签名 PositiveIntegerFiel
  • Bootstrap4使卡头高度相同

    以 Bootstrap 4 的定价模板为例 假设我有不同文本长度的卡片标题 因此在某些屏幕分辨率下 卡片标题的高度会变得不同 我想确保它们始终具有相同的高度 div class container div class card deck m
  • ERROR 发送和传输仅适用于应付地址类型的对象,不适用于地址

    function finalizeRequest uint index public restricted Request storage request requests index require request approvalCou
  • HTML/ CSS:A href 超出链接图像 - 如何避免?

    我将三个 HTML 元素排成一行使用内联块 https stackoverflow com questions 13290085 basic html place images in one row with same distance f
  • php的password_hash和password_verify看了一遍还是不行

    UPDATE所以这是一个令人尴尬的愚蠢承认 但问题是我存储在数据库中的哈希值是 密码 的哈希值包括引号 我写的查询没有问题 问题出在椅子和键盘之间 所以这是一个经常被问到的问题 我查遍了 stackoverflow 和 google 试图找
  • Delphi - 检测我的应用程序是否打开了模式对话框

    我有一个 Delphi 2006 应用程序 当检测到错误情况时 它会弹出模式警报对话框 由于对错误条件的检查是在空闲处理程序中完成的 因此如果恰好显示了另一个模式对话框 则该对话框可能会在另一个模式对话框的顶部弹出 这可能会导致用户感到困惑
  • 从 PostgreSQL 数据库检索评论

    我正在 Postgres 数据库上运行一个项目 需要检索数据库中列的注释以用作表标题等 我已经看到有几个内置函数 pg 描述 http www postgresql org docs 9 1 static catalog pg descri
  • ruby/rails:扩展或包含其他模块

    我将模块分开 以便它们更易于阅读和搜索 lib features running rb walking rb features rb 他们有 lib features running rb module Features Running e
  • 奇怪的Java时区日期转换问题

    我想转换ms since 1970 timestamp到带有时区的日期 德国 这里有两种有效的代码变体 至少 我记得使用过它并且它有效 import java text SimpleDateFormat import java util C
  • jQuery异步函数调用,无AJAX请求

    这看起来很愚蠢 但我找不到如何使用 jQuery 进行不涉及某些服务器端请求的异步函数调用 我有一个缓慢的函数 它会遍历大量 DOM 元素 并且我希望浏览器在该函数运行时不会冻结 我想在调用慢速函数之前显示一个小指示器 然后当慢速函数返回时
  • excel+powerpoint 如何决定重新缩放粘贴为图像的范围?

    我注意到 当您复制 Excel 中的范围 复制为图片 如屏幕所示 并将其粘贴到 PowerPoint 中时 生成的图像不会 100 缩放为原始图像 右键单击图像 转到格式设置并转到尺寸以查看比例信息 此外 这种缩放比例在不同的计算机上有所不
  • 如何使用 C API 创建 datetime64 对象的 Numpy 数组?

    我需要从 C C 代码创建 numpy datetime64 对象的数组 正如你所看到的NPY LONGLONG and NPY VOID我做到了 我需要做同样的事情NPY DATETIME type PyObject arr1 PyArr
  • 在 Javascript/jQuery 中从数组中删除多个元素

    我有两个数组 第一个数组包含一些值 而第二个数组包含应从第一个数组中删除的值的索引 例如 var valuesArr new Array v1 v2 v3 v4 v5 var removeValFromIndex new Array 0 2
  • 从头开始一个 TDD 项目

    我读了很多关于 TDD 的问答和关于 SO 的单元测试 但我没有找到任何答案 我从哪里开始 我和团队已经完成了几个项目 在这些项目中 我们对代码采用了单元测试 但先编码 然后单元测试 在开发过程的某个阶段 先编写测试然后编写代码变得很自然