Ruby 截断Riak数据库

Ruby 截断Riak数据库,ruby,riak,Ruby,Riak,我正在编写一段使用Riak DB的代码,希望在每次测试开始时将数据库重置为已知状态 有没有办法干净地截断riak数据库?如何在事务内部执行并在测试结束时回滚 目前我使用的代码如下: riak.buckets.each do |bucket| bucket.keys.each do |key| bucket.delete(key) end end 但我认为在每次测试开始时这样做会非常慢。因为Riak中没有事务或回滚的概念,所以这是不可能的。不过,内存后端通常用于测试,因为它支持B

我正在编写一段使用Riak DB的代码,希望在每次测试开始时将数据库重置为已知状态

有没有办法干净地截断riak数据库?如何在事务内部执行并在测试结束时回滚

目前我使用的代码如下:

riak.buckets.each do |bucket|
  bucket.keys.each do |key|
    bucket.delete(key)
  end
end

但我认为在每次测试开始时这样做会非常慢。

因为Riak中没有事务或回滚的概念,所以这是不可能的。不过,内存后端通常用于测试,因为它支持Bitcask(自动过期)和LevelDB(二级索引)的功能。每当需要清除数据库时,只需重新启动节点


如果在测试时使用Bitcask或LevelDB,清除数据库的最有效方法是关闭节点并删除数据目录。

因为Riak中没有事务或回滚的概念,所以这是不可能的。不过,内存后端通常用于测试,因为它支持Bitcask(自动过期)和LevelDB(二级索引)的功能。每当需要清除数据库时,只需重新启动节点


如果在测试时使用Bitcask或LevelDB,清除数据库的最有效方法是关闭节点并删除数据目录。

这里几乎没有可能的答案

  • 您是否正在测试通过使用Riak的键查询Riak来持久化数据?如果是这样,您可以设置测试服务器。文档,比如它,就在这里
  • 您正在测试通过二级索引的访问吗?若然,原因为何?你不信任Riak或Ruby驱动程序吗
  • 在任何情况下,您的测试都不应该耦合到数据存储。它会减慢速度
  • 如果您坚持,并且TestServer不适合您,那么为每个测试运行设置一个新的bucket。每个bucket都有它自己的名称空间,所以它几乎是一尘不染的。按照上面Christian的回答,定期停止节点并清除数据目录

  • 这里几乎没有可能的答案

  • 您是否正在测试通过使用Riak的键查询Riak来持久化数据?如果是这样,您可以设置测试服务器。文档,比如它,就在这里
  • 您正在测试通过二级索引的访问吗?若然,原因为何?你不信任Riak或Ruby驱动程序吗
  • 在任何情况下,您的测试都不应该耦合到数据存储。它会减慢速度
  • 如果您坚持,并且TestServer不适合您,那么为每个测试运行设置一个新的bucket。每个bucket都有它自己的名称空间,所以它几乎是一尘不染的。按照上面Christian的回答,定期停止节点并清除数据目录

  • 我认为每个面向测试的开发人员在使用Riak时都会面临这个困境。正如Christian提到的,Riak中没有回滚的概念。并且没有一个“truncatedatabase”命令可以发出

    您可以使用3种方法:

  • 清除测试集群上的所有数据。这本质上意味着发出shell命令(假设测试服务器与测试套件运行在同一台机器上)。如果您使用的是内存后端,这意味着在每次测试之间发出
    riak restart
    。对于其他后端,您必须停止节点并删除整个数据目录,然后再次启动:
    riak stop&&rm-rf/data/*&&riak start
    。优点:在每次测试之间清除群集数据。缺点:这很慢(当您考虑关闭和重新启动时间时),并且从测试套件中发出shell命令通常很尴尬。(旁注:虽然在每次测试之间执行可能比较慢,但在每次运行整个测试套件之前,您当然可以随意清除数据目录。)

  • 按照上面的建议,在测试集群上遍历所有bucket和key并删除它们。优点:易于理解和实施。缺点:也很慢(在每次测试之间运行)

  • 每次测试后都要进行清理。因此,如果测试创建了用户对象,请确保在测试结束时为该对象发出删除命令。或者,在创建一个用户之前,测试该用户最初是否不存在。(双重确保先前的测试已清理)。优点:易于理解和实施。快速(绝对比在每次测试之间循环通过所有存储桶和键要快)。缺点:开发人员很容易忘记在每次插入后清理

  • 在讨论了这些方法之后,我决定使用#3(通常在每次运行测试套件之前,结合擦除测试服务器数据目录)

    关于减轻“每次测试后手动清理”方法缺点的一些想法:

    使用以随机顺序运行测试的测试框架。许多框架,比如Ruby的Minitest,都是开箱即用的。这通常有助于捕获依赖于其他测试的测试,而忽略了清理

    在测试运行之后,定期检查测试集群(通过列表bucket),以确保没有剩余内容。事实上,您可以在每个测试套件结束时以编程方式执行此操作(简单到执行一个存储桶列表并确保其为空)

    (这通常是一种很好的测试实践,但与Riak特别相关)编写更少的命中数据库的测试。在单元测试(测试对象状态和行为而不影响数据库)和集成或功能测试(确实影响数据库)之间保持严格的划分。换句话说,您不必通过每个单元测试来测试数据库是否工作。信任它(尽管很明显,在集成测试期间要进行验证)

    例如,如果您将Riak与Ruby on Rails一起使用,并且您正在测试您的模型,那么不要调用
    test\u user.save