ruby - 截断 Riak 数据库

标签 ruby riak

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

有没有办法彻底截断 riak 数据库?在测试结束时在事务内部执行和回滚的方法怎么样?

目前我使用了一些这样的代码:

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

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

最佳答案

我认为每个面向测试的开发人员在使用 Riak 时都会遇到这种困境。正如 Christian 所提到的,Riak 中没有回滚的概念。并且没有您可以发出的单一“截断数据库”命令。

您有 3 种方法可用:

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

  2. 按照您上面的建议,在您的测试集群上循环遍历所有存储桶和键并删除它们。优点:易于理解和实现。缺点:也很慢(在每次测试之间运行)。

  3. 让每个测试自行清理。因此,如果您的测试创建了一个 User 对象,请确保在测试结束时对该对象发出 DELETE 命令。或者,在创建用户之前测试用户最初不是否存在。 (以加倍确保之前的测试已清除)。优点:易于理解和实现。快速(绝对比循环遍历每个测试之间的所有桶和键更快)。缺点:开发人员很容易忘记在每次插入后进行清理。

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

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

使用以随机顺序运行测试的测试框架。许多框架,如 Ruby 的 Minitest,开箱即用。这通常有助于捕获依赖于其他测试的测试,而这些测试很容易忘记清理

在测试运行后定期检查您的测试集群(通过列表桶),以确保没有留下任何东西。事实上,您可以在每个测试套件末尾以编程方式执行此操作(就像做一个遗愿 list 并确保它是空的一样简单)。

(这通常是一个很好的测试实践,但与 Riak 尤其相关)编写更少的访问数据库的测试。在单元测试(测试对象状态和行为而不影响数据库)和集成或功能测试(确实影响数据库)之间保持严格的划分。 Make sure there's a lot more of the former than the latter.换句话说——您不必通过每个单元测试来测试数据库是否正常工作。相信它(尽管很明显,在集成测试期间验证)。

例如,如果您将 Riak 与 Ruby on Rails 结合使用,并且正在测试您的模型,请不要调用 test_user.save!验证用户实例是否有效(就像我第一次开始时所做的那样)。您可以简单地测试 test_user.valid? ,并了解在实际使用过程中,对保存的调用将相应地工作(或失败)。考虑使用 Mockist-style testing ,它验证是否 save!实际上调用了函数,而不是实际保存到数据库然后读回。等等。

关于ruby - 截断 Riak 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20366695/

相关文章:

linux - 一切都已设置,但 riak 启动失败

java - Riak Java客户端编译失败

java - 我必须如何使用 Java API 来促进故障转移?

ruby-on-rails - 如何加速 Rails 5 上的 View 渲染?

ruby-on-rails - 如何在 erb 模板中呈现数组的最佳方式?

ruby-on-rails - 将散列更改为数组

ruby-on-rails - RefineryCMS I18n 翻译默认前端区域设置的问题

ruby-on-rails - 当前的 ruby​​ 和 rails 资源 (2010)

mongodb - riak 搜索 mongodb 索引之间的区别

php - Riak 搜索返回 null