在使用最终一致的数据存储(如MongoDB)时编写测试用例的最佳实践是什么?

我当前的设置是Mongodb,其中3节点的Master/Slave/Slave设置将slave-ok设置为true。这意味着主节点用于只读,而两个从节点用于只读。

数据在从站上保持一致所需的时间相对较短,并且取决于操作和数据大小。例如,大约3毫秒用于删除操作,大约200毫秒用于批量插入1000个对象。

我的目标是测试Dao上的操作。它们可能是诸如getById,delete,insert之类的简单变量,也可能是诸如findByExample之类的复杂变量。我需要验证它们是否可以正常工作,并在一定的超时限制范围内最终保持一致。

这是我当前测试删除操作的内容,例如:

  @Test
  public void deleteTest() throws InstantiationException,
              IllegalAccessException {
        MyObject obj = new MyObject();
        obj.setName("test object");
        obj.save(obj);
        MyObject found = dao.findById(obj.getId());
        logger.info ("before: " + found);
        Assert.assertEquals(obj, found);

        dao.delete(obj.getId());
        MyObject deleted = null;
        long start = System.nanoTime();
        do {
              //TBD: need to add escape condition/timeout, else may be infinite loop....
              deleted = dao.findById(obj.getId());
              logger.info ("While: " + deleted);
        } while (deleted!=null);
        logger.info("It took " + ((System.nanoTime()-start)/1000000.00) + " ms for delete to be consistent");
        Assert.assertEquals(null, d1);
  }

最佳答案

我想到了一些想法

  • 在生产中,如果您准备好从属服务器,则永远不会知道您是否正在获取最新数据。这就是MongoDB中读取从站的权衡。我的经验是,在正常工作条件下,从属设备是最新的。如果必须获取最新数据,请查询主数据。
  • 我肯定会开始使用mms来跟踪您的副本滞后。这将告诉您奴隶有多远,这样您就可以感觉到数据可用的速度有多快
  • 至于原始测试问题,这取决于您的目标。无论是副本还是独立副本,您的DAO都应该能够读取和写入相同的内容。您只需要确保您的应用程序了解它查询的数据可能不是最新数据。
  • 10-07 19:02
    查看更多