从头开始一个 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 项目 的相关文章

  • CMake - 作为构建过程的一部分运行测试并将标准输出捕获到文件

    我们有几个单元测试 我们希望将其作为构建过程的一部分运行 为了实现这一目标 我有一个帮助程序脚本 它创建一个运行测试的自定义命令 如果成功 则创建一个文件 test name passed 然后我添加一个自定义目标 test name ru
  • 测试项目和配置文件

    我的 Visual Studio 2008 解决方案中有这种设置 一个使用库 Lib1 需要 app config 文件中的一些配置条目 的 WCF 服务项目 WCFService 我有一个单元测试项目 MSTest 其中包含与 Lib1
  • 如何在 Angular 单元测试中创建假 NgForm 对象?

    我有一个带有如下模板的组件 Template
  • 使用 IQueryable 进行单元测试代码

    我被要求为某些功能编写一些单元测试 但坦率地说 我不太确定这样做的必要性或有用性对于这个特殊的一段代码 我绝不试图质疑单元测试的必要性或有用性 所讨论的代码非常简单并且被大量使用 基本上它是 Skip 和 Take 扩展方法的包装 在我看来
  • 如何在单元测试中比较列表

    这个测试怎么会失败呢 TestMethod public void Get Code var expected new List
  • PHP 启动:运行单元测试时无法加载动态库

    当我尝试运行单元测试时 出现此错误 PHP 警告 PHP 启动 无法加载动态库 bz2 尝试过 xampp php ext bz2 找不到指定的模块 xampp php ext php bz2 dll 找不到指定的模块 在未知的第 0 行
  • 如何测试包含自定义表单控件的组件?

    我有一个这样的组件 Component selector app custom form control templateUrl
  • 用于 Kotlin 中单元测试的 BuildConfigField 模拟

    我正在尝试尽可能多地涵盖Kotlin Android 库我遇到了有关自定义 BuildConfig 变量的问题 更广为人知的是buildConfigField 我想模拟这个变量来测试两者true and false values 从 Gra
  • Grails - 如何对 addTo* 进行单元测试

    是否可以在 Grails 中对 addTo 函数进行单元测试 感谢您的帮助 文档第 9 1 节中说 http grails org doc latest guide 9 20Testing html 9 1 20Unit 20Testing
  • 我的单元测试 ReSharper 装订线图标未显示

    我已经安装了 ReSharper 4 1 和 Gallio 3 0 5 但没有获得单元测试的装订线图标 测试似乎在测试资源管理器中运行良好 但代码中的测试旁边没有图标 可能是什么原因造成的 我之前安装了 MbUnit 2 4 ReSharp
  • 如何检查带有通配符的模拟调用?

    我正在编写单元测试 并且想要检查具有函数对象的调用 如下所示 call u mock u foobar
  • 测试 Python 脚本

    如何使用 doctest unittest nose 等测试框架测试 Python 脚本的 STDOUT 输出 例如 假设运行我的脚本 todo py list 应该返回 取出垃圾 我读过有人将脚本的 STDOUT 打印部分与生成要打印的输
  • 寻找网站测试自动化的方法

    我们开发定制调查网站 我正在寻找一种方法来自动化这些网站的模式测试 调查通常包含许多复杂的规则和分支 这些规则和分支也会根据项目的响应方式而触发 所有调查在发布给客户之前都经过严格测试 此测试需要大量的手动工作 我想了解一些可以通过回答问题
  • 使用 JUnit 时,有没有办法验证测试方法中是否调用了 try/catch 指令的 Catch 部分?

    例如 如果我想测试以下课程 public class SomeClass public void someMethod try Some code where comething could go wrong catch Exception
  • 有条件地忽略 JUnit 4 中的测试

    好的 所以 Ignore注释适合标记不应运行的测试用例 但是 有时我想忽略基于运行时信息的测试 例如 如果我有一个并发测试 需要在具有一定数量核心的计算机上运行 如果这个测试在单处理器机器上运行 我认为仅仅通过测试是不正确的 因为它还没有运
  • 运行使用wiremock存根的多个测试用例时“选择器循环等待选择”

    我在用着wiremock http wiremock org 用于模拟网络服务 我使用它来提供对我们正在测试的某些单元的服务访问 所以基本上我们有多个junit测试 它们使用来自wiremock的存根 但是 当我们一次运行多个测试 假设运行
  • Python 是否有首选的 BDD 风格单元测试框架?

    我想知道是否有任何 BDD 风格的 描述它 Python 单元测试框架可以维护并准备好投入生产 我已经发现describe https pypi python org pypi describe 0 1 2 但似乎没有维护 也没有文档 我也
  • 在业力测试中按类名获取两个div(Angular 4.0)

    我有这样的看法 div div class header title Example title 1 div div div div class header title Example title 2 div div 在我的业力测试中 我
  • 使用内存中的单元测试 .ToListAsync()

    下面是由于内存数据库集不支持 ToListAsync 而在 ShouldNotThrow 上失败的测试 我没有方便的确切措辞 但你明白了 如果它很重要 我正在尝试模拟实体框架版本提供的数据库集 6 1 3 TestFixture publi
  • 序列化对象以进行单元测试

    假设在单元测试中我需要一个对象 其中所有 50 个字段都设置了一些值 我不想手动设置所有这些字段 因为这需要时间而且很烦人 不知何故 我需要获得一个实例 其中所有字段都由一些非空值初始化 我有一个想法 如果我要调试一些代码 在某个时候我会得

随机推荐

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

    这个问题和这个不一样另一个 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 的单元测试 但我没有找到任何答案 我从哪里开始 我和团队已经完成了几个项目 在这些项目中 我们对代码采用了单元测试 但先编码 然后单元测试 在开发过程的某个阶段 先编写测试然后编写代码变得很自然