在我们开始之前我知道一个公平的几个人考虑的测试,击中数据库不是"单元的测试".也许"的集成试验"将是一个更好的名称。无论哪种方式开发人员的测试,击中数据库。

启用单元试验我有个开发本地数据库,其中我明确和填充有一个知道的集的数据在每次试验开始使用 dbUnit.这所有的作品以及足够的直到一个表中使用的测试的变化在一些方式和我必须手动更新所有XML数据集。这是一个痛苦。我想其他人必须有打同样的问题,并希望找到一个漂亮整洁的解决方法。因此,对于测试需要填充数据库使用什么和如何处理表中的定义改变吗?(而我的使用Java我打开解决利用不同的技术。)

编辑: 要澄清一点。我有预谋的试验,如:

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和组织。一个装修订使用的少量数据从组织。后来,在组织获得一个新的领域,修订不关心。作为新的领域是"not null"没有合理的默认这种测试它就会失败的tIssue.xml 将是无效的。

有小小的变化,这样它是不是太难编辑的组织。但是,当数量的XML文件开始的气球,每个流程就变成一个大的工作量。

干杯,
mlk

有帮助吗?

解决方案

嗯,我认为,这是一个问题相结合的什么是已经存在。

在上述情况:

  1. 写一个数据库迁移
  2. 申请的移徙数据库(手动或自动开始试运行)
  3. 看你的测试打破由于违反约束(not null)

你可以延长这样你一个小的程序,并如下:

  1. 填充数据库,与DbUnit XML
  2. 应用该数据库迁移
  3. 提取内容的数据库在地在你的DbUnit XML(和任选的,也DTD)(见DbUnit主页->DbUnit常问问题->如何提取平XML数据集,从我的数据库?)
  4. 检查你的更新DbUnit XML(和DTD)入来源的控制。

施加的移徙,我衷心地推荐 迁徙路线.它支持这两个Sql(与占位的替换)和基于Java的迁移。然后你可以应用移民使用家插件或编程方式使用。后者适合这种情况下是完美的。

所完成的工作流程,然后变为:

  1. 写你的数据库迁移
  2. 执行你的DbUnitXmlDtdUpdater程序
  3. 看你的单元测试通过

快乐的日子,

阿克塞尔

免责声明:我一的迁徙路线的开发。

其他提示

我认为这个问题的答案有两个阶段:

<强>只有一种模式的权威定义

有应该只有一个什么样的数据库看起来像定义。在正常情况下,我希望有一个SQL DDL脚本,用于指定数据库中的模式。

作为应用程序使用,并且该单元测试应该使用的数据库模式的相同的权威的定义它的基于测试运行之前定义应创建数据库和测试运行之后再次完全除去它

这是说,工装可以站出来与模式同步的,你将需要手动更新的工具生成的东西。例如,我使用的.NET是自动生成基于数据库的架构类实体框架。当我更改架构,我需要手动告诉我的工具来更新这些类。这是一个痛苦,但我不知道有任何出路的,除非该工具支持自动化。

<强>每个测试应空数据开始

每个测试应无任何数据的数据库开始。每个测试应该填充的只有的,它需要执行测试,当它完成后,应再次清理数据库中的数据。

目前什么你正在做听起来像通常称之为夹具反模式,在那里你尝试预加载的一组数据,作为广泛代表一组场景成为可能。然而,这使得它很难进行测试互斥条件,也可能导致测试相互依赖,如果你在一些测试中修改这个预加载的数据。

这是很好的优秀图书的xUnit测试模式的解释。

我的DbUnit的XML平面文件同样的问题在数据库架构演变这确实需要数据的变化(甚至是东西那么简单,除了强制性的列)。

跑出来不同步

在转换使用一些手工编写的脚本是一个选项,所有的XML文件,我仍然认为这个问题应在不同的抽象层次更类似于一个处理实时数据的方式来解决:进化DB设计

数据库迁移工具已经了解三角洲脚本,所以有一种DbUnit的适配器将是巨大的。

如果发现以下博客条目涵盖了问题: http://blog.liquibase.org/ 2007/06 /单元测试最数据库存取layer.html

  

要解决保持测试数据的定义从同步中获得与模式的问题,你需要与你的数据库一起建立您的测试数据,因此将它最初创建后作了数据库重构修改。 [..]通过包括与数据库的修改测试数据,数据会自动以同样的方式生产数据会跟上。使用这种技术在每方法数据集也具有执行更好的优点,因为数据仅插入一次,...

,但增加了自己:

  

但它有你需要处理所有的测试数据,任何方法要在一个地方的缺点。

...这又是不可能的更复杂的情况我想。他接着说:

  

要促进这个技术,我建立的执行上下文的想法变成LiquiBase,所以你可以标记测试数据的变化,并仅在您运行单元测试环境中应用它们。到目前为止,我已经满意的结果。当有数据库架构和代码的作用期待或之间的差异的测试失败时,有我的SQL的错误,我还没有因数据库重构丢失任何测试。

下面的链接:www.liquibase.org/manual/contexts但它不是我想要的,至少,虽然我会被罚款与我TESTDATA暴露一个数据库迁移工具,我还是喜欢把它很近了数据库测试

思想的人?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top