繁体   English   中英

JUnit测试数据库失败?

[英]JUnit Test a Database Failure?

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

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

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

  1. 使用ProcessBuilder类构造并启动进程,存储返回的Process对象。
  2. 开始插入记录。
  3. 在某些时候destroy()过程。

请记住以前关于该测试的非确定性的评论。

我遇到了SQLite团队 ,他们也在模拟故障策略中作为自动化测试套件的一部分。

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

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

使用刚刚整个过程的线程怎么样? 例如:

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

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

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

我。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM