2010-01-22 205 views
5

我正在尝试创建一个模拟系统故障以确保Oracle Berkeley DB XML数据库完整性的测试。在插入操作过程中,当前正在经历数据丢失,所以我想设置一个测试,开始插入任意数量的文档,并沿途解决这个过程(类似于电源线上的某个人)。在进程死亡后,我想生成一个新进程并打开数据库以确保它正常打开。JUnit测试数据库失败?

单元测试是Maven构建中的众多测试之一,并且此测试必须在Linux和Windows XP环境中运行。我目前的思考过程是为这两个操作系统制定一个脚本,因为我可以使用该脚本来终止该进程并在其位置启动一个新脚本。我有其他选择吗?我可以使用JUnit创建单独的进程空间/ VM吗?

+0

你想测试数据库?或者你想测试你的代码使用该数据库? – 2010-01-22 18:20:49

+0

我想要它来测试我的代码,因为有问题的数据库被嵌入。系统故障期间的数据损坏是非事务性Berkeley DB XML(我们必须使用)的已知问题 - 我在包装代码中实施了一些理智检查以减轻损坏。 – toddk 2010-01-22 18:37:44

+8

然后,你会想编写单元测试来证明你的理智检查完成他们应该做的事情。您可以编写数据库接口模拟并模拟各种故障,以便确定行为。根本问题是证明你实施的完整性检查实际上可以防止你描述的腐败。我不会在单元测试中做到这一点,除非在每次测试运行时失败都是可重现的。如果他们不是,我会把这个测试当作一个性能/稳定性测试来代替。 – ShabbyDoo 2010-01-23 02:26:37

回答

1

我不会考虑这种测试单元测试,但你可能可以做这样的事情。

  1. 使用ProcessBuilder类构造和启动过程,存储返回的过程对象。
  2. 开始插入记录。
  3. 在某个点destroy()的过程。

请记住先前对此测试的非确定性性质的评论。

我遇到了SQLite team also doing a simulated failure strategy作为其自动化测试套件的一部分。

0

这种类型的行为非常适合交易。如果您的代码要开始一个事务,那么数据库就会知道在事务由于进程死亡而中止时如何保持数据一致。你可能会在这里重新发明轮子。每日跆拳道有一个很好的例子,我们如何欺骗自己reinventing the wheel

仔细看看你的第一个修订版,并对自己说“手套”。

+4

你正在向合唱团传道。我被告知我们不能使用数据库的事务版本......所以我想我需要问“为什么不?”在进一步深入之前。 – toddk 2010-01-26 17:16:17

0

怎样才能使用整个过程的线程insead?例如:

  • 您可以创建一个后台工作线程并为其提供一些工作负载。
  • 然后在主测试的线程中等待一个毫秒的随机数。然后杀死线程。
  • 然后,也许你想等待缓存的数据保存(或不是,取决于你测试的)
  • 然后运行你的理智。如果投掷,测试将会失败,因为您需要!
  • 在这里你完成了。

我宁愿将上述测试称为集成测试。无论如何,它会做你需要的。 运行会多次测试每次运行的不同数据损坏情况。

0

我不认为这适合于UNIT测试。 单元测试你想测试一小段代码,例如你的理智代码, 可能带有一个模拟数据库。或者只调用部分代码。 你所指的是一个更复杂的测试,可能值得做 ,但不一定值得作为单元测试 的一部分重复自动运行和重复运行,你大概经常运行(在构建或每晚或每当)。 添加这种测试也可能会减慢你的单元测试,并会对你的单元测试可以运行的环境施加限制 我建议编写更小的单元测试,并将整个测试单独测试在一起。

我。