5

我想在两个 Ruby 进程之间传递一个对象的实例。具体来说,我想将 Selenium WebDriver 的实例从一个进程传递到另一个进程。我想这样做的原因是因为 Ruby 创建这个对象需要很多时间,但我希望它被其他进程使用。

我在这里这里发现了一些似乎指向使用 DRb 的相关问题,但我一直无法找到任何有用的示例或示例代码。

我应该使用除 DRb 以外的工具吗?有没有人有类似的例子可以复制?

4

2 回答 2

5

看起来您将不得不使用 DRb,尽管似乎缺少它的文档。然而,这里有一篇有趣的文章。您可能还想考虑购买 Masatoshi Seki 的 The dRuby Book,以更好地了解如何有效地做到这一点。

如果您不考虑同时访问,而只是想将对象从一个进程发送到另一个进程,另一种调查方法是使用 YAML 序列化(即以 Ruby 可以读取的方式编码)对象(对于人类可读文件)或 Marshall(用于二进制编码文件)并使用管道发送。在另一个已被删除的答案中提到了这一点。

请注意,这些解决方案中的任何一个都需要大量修改 Selenium 代码,因为您要操作的对象既不支持复制,也不支持本地同时访问。

于 2013-08-09T11:33:00.123 回答
1

TL;博士

大多数队列或分布式进程都需要某种序列化才能正常工作。如果您想传递对象而不是消息,那么这将成为您解决问题的一个限制因素。

DRb

我不知道您是否可以编组WebDriver 对象。如果不能,那么 DRb 可能是分布式 Ruby 程序的一个不错的选择,因为它支持DRbObject对无法编组的事物的引用。DRb 文档中提供了一些示例。

硒线协议

根据您真正想要做的事情,可能值得仔细研究一下使用Remote WebDriver客户端/服务器的远程绑定,或 Selenium 的JSON Wire Protocol作为在进程之间传递对象的替代方案。

其他替代品:夹具、工厂、存根和模拟

这些是否适用于您的特定情况将很大程度上取决于您为什么要传递对象而不是简单地驱动远程服务器。如果主要是构建对象需要多长时间的问题,那么序列化/反序列化周期可能不一定在所有情况下都更快。

您可能想重新审视为什么您的对象创建速度如此之慢。如果为它收集和处理数据花费的时间太长,您可以使用某种测试夹具或工厂来调整该时间,或者使用较小的固定数据集,或者使用针对速度进行优化的预序列化对象.

您还可以考虑是否真的需要真实的数据或对象来进行测试。在许多情况下,您可以通过存根方法或创建模拟对象来大大加快测试速度,这些对象将返回集成测试所需的值,而无需执行昂贵的计算或长时间运行的操作。

在某些情况下,您需要驱动整个堆栈并对真实数据执行验收测试。即使这样,您也可以设计一组夹具数据,这些数据将花费更少的时间或内存来处理。这当然值得至少考虑。

于 2013-08-20T20:37:58.160 回答