JUnit测试数据库失败?

时间:2010-01-22 18:15:03

标签: java unit-testing junit process

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

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

4 个答案:

答案 0 :(得分:1)

我不认为这种测试是单元测试,但你可能会做这样的事情。

  1. 使用ProcessBuilder类构造并启动进程,存储返回的Process对象。
  2. 开始插入记录。
  3. 在某个时刻destroy()过程。
  4. 请记住以前关于此测试的非确定性的评论。

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

答案 1 :(得分:0)

这种行为非常适合交易。如果您的代码要启动事务,那么当事务因流程死亡而中止时,数据库将知道如何保持数据一致。你可能会在这里重新发明轮子。每日WTF就是我们如何欺骗自己reinventing the wheel的一个很好的例子。

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

答案 2 :(得分:0)

如何只使用整个过程的线程?例如:

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

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

答案 3 :(得分:0)

我不认为这适合UNIT测试。 在单元测试中,你想测试一小段代码,例如你的健全代码, 可能有一个模拟DB。或只调用部分代码。 你所指的是一个可能值得做的更复杂的测试 但作为单元测试的一部分,不一定值得自动化和反复运行 你可能经常运行(在建造或夜间或任何时候)。 添加这种测试也可能会减慢您的单元测试速度并强制执行 对单元测试可以运行的环境的限制。 我建议编写较小的单元测试,并分别对整个测试进行测试。

我。