更改数据库模式和单元测试

2024-02-29

在我们开始之前,我知道有相当多的人认为访问数据库的测试不是“单元测试”。也许“集成测试”是一个更好的名字。无论哪种方式,开发人员都会测试数据库。

为了启用单元测试,我有一个开发人员本地数据库,我会在每次测试开始时清除该数据库并填充一组已知的数据dbUnit http://www.dbunit.org/。这一切都运行得很好,直到测试使用的表以某种方式发生更改并且我必须手动更新所有 XML 数据集。这是一种痛苦。我认为其他人一定也遇到了同样的问题,并希望找到一个很好的解决方案。那么,对于需要填充数据库的测试,您使用什么以及如何处理表定义的更改? (当我使用 Java 时,我对利用不同技术的解决方案持开放态度。)

EDIT:澄清一点。我有一个人为的测试,例如:

void testLoadRevision() {
    database.clear(); // Clears every table dbUnit knows about.
    database.load("load/trevision.xml", "load/tissue.xml");
    SomeDatabaseThingie subject = new SomeDatabaseThingie(databaseProvider);
    Revision actual = subject.load();
    assert(actual, expected);
}

其中我有两个表 - tRevision 和 tIssue。加载的修订版本使用 tIssue 中的少量数据。后来 tissue 获得了修订版不关心的新字段。由于新字段“不为空”并且没有合理的默认值,因此该测试将失败,因为 tIssue.xml 将无效。

通过像这样的小更改,编辑组织并不太难。但是,当 XML 文件的数量随着每个流程而开始激增时,工作量就变得很大。

Cheers,
    mlk


嗯,在我看来,这是一个将现有的东西结合起来的问题。

上面描述的场景:

  1. 编写数据库迁移
  2. 应用数据库迁移(手动或在测试运行开始时自动)
  3. 观察您的测试由于违反约束(不为空)而中断

您可以扩展它,使您成为一个执行以下操作的小程序:

  1. 使用 DbUnit XML 填充数据库
  2. 应用数据库迁移
  3. 将数据库内容提取到 DbUnit XML(也可以选择 DTD)中(请参阅 DbUnit 主页 -> DbUnit 常见问题解答 -> 如何从数据库中提取平面 XML 数据集?)
  4. 将更新的 DbUnit XML(和 DTD)检查到源代码管理中。

对于申请迁移,我衷心推荐Flyway http://flywaydb.org。它支持 Sql(带有占位符替换)和基于 Java 的迁移。然后,您可以使用 Maven 插件或以编程方式使用 API 应用迁移。后者非常适合这种情况。

完整的工作流程就变成了:

  1. 编写您的数据库迁移
  2. 执行 DbUnitXmlDtdUpdater 程序
  3. 观察您的单元测试是否通过

快乐的时光,

Axel

免责声明:我是 Flyway 的开发人员之一。

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

更改数据库模式和单元测试 的相关文章

  • 带有 Android 支持库 v7 的 Maven Android 插件

    我使用 maven android plugin 构建我的 android 应用程序 它依赖于 android 支持库 v4 和 v7 由于我没有找到如何从developer android com下载整个sdk 因此我无法使用maven
  • 将SQL数据引入jquery availabletag

    我正在尝试制作自动完成文本框 但如何将 SQL 数据包含到 jquery 可用标记并循环它 我无法根据以下代码执行该功能 任何帮助 将不胜感激 谢谢 这是我的预期输出 预期结果演示 http jsfiddle net VvETA 71 jq
  • 埃拉托色尼筛法 - 实现返回一些非质数值?

    我用 Java 实现了埃拉托斯特尼筛法 通过伪代码 public static void sieveofEratosthenes int n boolean numArray numArray new boolean n for int i
  • 从 MS Access 中提取 OLE 对象(Word 文档)

    我有一个 Microsoft Access 数据库 其中包含一个包含 Microsoft Word 文档的 OLE 对象字段 我试图找到代码来检索保存在 OLE 对象中的文件 以便用户可以从我的 JavaFx 应用程序中的按钮下载它 但没有
  • Logback:SizeAndTimeBasedRollingPolicy 不遵守totalSizeCap

    我正在尝试以一种方式管理我的日志记录 一旦达到总累积大小限制或达到最大历史记录限制 我最旧的存档日志文件就会被删除 当使用SizeAndTimeBasedRollingPolicy在 Logback 1 1 7 中 滚动文件追加器将继续创建
  • 您建议使用哪种压缩(GZIP 是最流行的)servlet 过滤器?

    我正在寻找一个用于大容量网络应用程序的 GZIP servlet 过滤器 我不想使用容器特定的选项 要求 能够压缩响应负载 XML Faster 已在大批量应用的生产中得到验证 应适当设置适当内容编码 跨容器移植 可选择解压缩请求 谢谢 我
  • Android 中 localTime 和 localDate 的替代类有哪些? [复制]

    这个问题在这里已经有答案了 我想使用从 android API 获得的长值 该值将日期返回为长值 表示为自纪元以来的毫秒数 我需要使用像 isBefore plusDays isAfter 这样的方法 Cursor managedCurso
  • 如何在java Spring Boot中实现通用服务类?

    我有许多具有重复代码的服务 我想知道如何实现通用服务 以便我的所有服务都可以扩展它 服务接口示例 重复代码 Service public interface IUserService List
  • 为自定义驱动程序创建 GraphicsDevice

    我正在开发一个在嵌入式系统中使用 Java 的项目 我有用于屏幕和触摸输入的驱动程序 以及用于文本输入的虚拟键盘 我的屏幕驱动程序有一个Graphics2D您可以绘制的对象和repaint Rectangle 更新方法 类似地 触摸驱动器能
  • 如何检测图像是否像素化

    之前有人在 SO 上提出过这样的问题 在Python中检测像素化图像 https stackoverflow com questions 12942365 detecting a pixelated image in python还有关于q
  • Android蓝牙java.io.IOException:bt套接字已关闭,读取返回:-1

    我正在尝试编写一个代码 仅连接到运行 Android 5 0 KitKat 的设备上的 目前 唯一配对的设备 无论我尝试了多少方法 我仍然会收到此错误 这是我尝试过的最后一个代码 它似乎完成了我看到人们报告为成功的所有事情 有人能指出我做错
  • 如何使用正则表达式验证 1-99 范围?

    我需要验证一些用户输入 以确保输入的数字在 1 99 范围内 含 这些必须是整数 Integer 值 允许前面加 0 但可选 有效值 1 01 10 99 09 无效值 0 007 100 10 5 010 到目前为止 我已经制定了以下正则
  • 从休眠乐观锁定异常中恢复

    我有一个这样的方法 Transactional propagation Propagation REQUIRES NEW public void doSomeWork Entity entity dao loadEntity do some
  • 在 Java 中通过 XSLT 分解 XML

    我需要转换具有嵌套 分层 表单结构的大型 XML 文件
  • 如何删除日期对象的亚秒部分

    当 SQL 数据类型为时间戳时 java util Date 存储为 2010 09 03 15 33 22 246 如何在存储记录之前将亚秒设置为零 例如 在本例中为 246 最简单的方法是这样的 long time date getTi
  • 在 Clojure 中解压缩 zlib 流

    我有一个二进制文件 其内容由zlib compress在Python上 有没有一种简单的方法可以在Clojure中打开和解压缩它 import zlib import json with open data json zlib wb as
  • JAVA中遍历JSON数据

    我是 JSON 新手 我使用 HTTPUrlConnections 并在 JAVA 程序中获得一些响应 响应数据将类似于 data id 1 userId 1 name ABC modified 2014 12 04 created 201
  • 如何从 Ant 启动聚合 jetty-server JAR?

    背景 免责声明 I have veryJava 经验很少 我们之前在 Ant 构建期间使用了 Jetty 6 的包装版本来处理按需静态内容 JS CSS 图像 HTML 因此我们可以使用 PhantomJS 针对 HTTP 托管环境运行单元
  • Hadoop NoSuchMethodError apache.commons.cli

    我在用着hadoop 2 7 2我用 IntelliJ 做了一个 MapReduce 工作 在我的工作中 我正在使用apache commons cli 1 3 1我把库放在罐子里 当我在 Hadoop 集群上使用 MapReduceJob
  • Java 的 PriorityQueue 与最小堆有何不同?

    他们为什么命名PriorityQueue如果你不能插入优先级 它看起来与堆非常相似 有什么区别吗 如果没有区别那为什么叫它PriorityQueue而不是堆 默认的PriorityQueue是用Min Heap实现的 即栈顶元素是堆中最小的

随机推荐

  • DNS 在 PHP 中不工作(但一般情况下可以)

    以下脚本 返回 DNS 记录列表 但最终在 file get contents 上失败 尽管 phpinfo 说 allow url fopen On On allow url include Off 出现以下错误 PHP 消息 PHP 警
  • 从 Numpy 中的多个切片中选择

    说我们有 a np ones 3 3 3 and slices 0 1 slice None 0 slice None 0 slice None 1 0 有没有一种简单的方法来选择 更改值a from slices 例如 我想分配0 to
  • 在 JSF 中向 selectOneMenu 添加“未选择任何内容”选项的最佳方法

    我想知道允许用户在 selectOneMenu 中不选择任何内容的最佳或最简单的方法是什么 我的示例 我有一个注册用户列表 管理员应该能够按某些条件过滤显示的用户列表 这些标准 例如用户类型 员工 客户 可以通过 selectOneMenu
  • Twitter bootstrap .popover 不工作

    我正在尝试让 Twitter Bootstrap 的 popover 工作 并且我几乎复制了我网站上的代码 但它告诉我 Object object object 在检查元素上没有方法 popover 我在 bootstrap tooltip
  • 根据另一列中的值创建新的指标列

    我有一些数据看起来像这样 import pandas as pd fruits apple pear peach df pd DataFrame col1 i want an apple i hate pears please buy a
  • PHP Doctrine 初学者:Doctrine\ORM\Tools\Setup 未找到

    我是教义的初学者 我刚刚安装了 pear 主义 2 3 3 并想测试它 为了测试教义 我写了一个名为 person 的类 Entity class person Id Column type integer GeneratedValue p
  • Scala:用于未来理解的 ExecutionContext

    当我做一个future 或应用类似的方法onSuccess and map 我可以为它们指定 ExecutionContext 例如 val f future code executionContext f map someFunction
  • 防止 pandoc 将 $ 转换为 mediawiki

    我正在使用 pandoc 将 markdown 文件转换为 mediawiki 表 文件内容mtcars md c1 c2 7 P A A 8 AB B 9 P A C 然后我就这样做了 我使用的是 Ubuntu 64 位和 pandoc
  • 在 Objective-C/cocoa 中抛出异常

    在 Objective C cocoa 中抛出异常的最佳方法是什么 I use NSException raise format 如下 NSException raise Invalid foo value format foo of d
  • 为什么我的 SVG 在 Polymer 组件内由 D3 渲染,没有样式?

    这里有一个Plunker我的问题的草图 http plnkr co 7hW5Rp71Qy1IwptZx4i6 相关代码 包含 Polymer 模板及其调用
  • Kendo UI 网格在调用读取后未填充

    好吧 我还有另一个 我确信我又错过了一些简单的东西 使用 json 结果集填充 Kendo 网格 加载是通过从剑道下拉列表控件中进行选择来触发的 我可以看到数据从我的 webapi 返回并转换为 json 结果 但数据未显示在网格中 我错过
  • 避免以编程方式启动使用创建的上下文的 HiveThriftServer2

    在 Spark 2 0 0 中 我们尝试使用 ThriftServer 从 Spark 临时表中查询数据 首先 我们创建了启用了 Hive 支持的 SparkSession 目前 我们使用 sqlContext 启动 ThriftServe
  • 轨道模型和独特的组合

    我有一个 Rails 应用程序 其中有一个名为friendrequests 它看起来像这样 user1 id integer user2 id integer hasaccepted boolean 我正在创建一个添加好友的选项 但好友请求
  • C++派生类型的自动工厂注册

    像我之前的许多人一样 我正在尝试让我的派生类型自动向我的工厂注册 我通读了很多问题 并试图专注于我在那里没有找到的问题 除了自动注册之外 一切都运行良好 我的目标 automatically register any derived cla
  • PHP语言规范中“[”怎么会是运算符呢?

    On the http php net manual en language operators precedence php http php net manual en language operators precedence php
  • 不带 @XMLRootElement 的 JAXB 部分解组元素

    我正在使用部分解组的例子JAXB 但我无法解组不在根级别的 XML 元素 因为它们没有 XmlRootElement 标记 在我的示例中 我尝试读取shipTo Element而不是purchaseOrder Element 通常我会使用
  • 将日期附加到使用 Sweave 生成​​的 PDF

    我通过 Sweave 生成 每日报告 我想在 PDF 名称中附加当前日期 格式为 YYYYMMDD 我使用以下代码来生成文件 rnwfile lt system file Sweave Margin Rnw package utils Sw
  • 如何在 Django 中记录成功和失败的登录和注销尝试?

    我想在 Django 中记录所有用户登录和注销尝试 该记录应显示所有登录 注销用户的历史记录 IP 地址和登录 注销时间 The django admin log表似乎只记录其他模型的ADD DELETE CHANGE活动 而不是用户访问的
  • 简单来说,什么是工厂?

    什么是工厂 我为什么要使用工厂 你熟悉吗JDBC https docs oracle com javase tutorial jdbc basics index html 这是一个完整的 抽象 工厂 这是一个很好的现实世界例子 Factor
  • 更改数据库模式和单元测试

    在我们开始之前 我知道有相当多的人认为访问数据库的测试不是 单元测试 也许 集成测试 是一个更好的名字 无论哪种方式 开发人员都会测试数据库 为了启用单元测试 我有一个开发人员本地数据库 我会在每次测试开始时清除该数据库并填充一组已知的数据