10

你在 Rails 应用程序上的 Selenium 测试中使用了哪些数据?你从固定装置加载吗?使用现有的开发数据库?使用单独的(非夹具)数据库?

我在这里考虑我的选择。我有一个带有大型 Selenium 测试套件的 Rails 应用程序,该套件在 Selenium Grid 的修改版本上运行。现在,该过程的一部分是在测试套件运行之前加载大量的固定装置。这是很多数据。其中大部分是报告从我们的生产数据库导出的信息。当我最初设置它时,我将数据从 Oracle 导出到 yaml。

现在一些报告表中的模式发生了变化,所以我当然必须重新生成夹具数据。它太多了,不值得手动编辑文件。但是对于每个小的模式更改都必须重新生成似乎效率低下 - 更不用说这是另一个需要记住的步骤。有没有更好的办法?

编辑:我最初打算在每次测试之前加载固定装置并在每次测试之后卸载它们,就像常规的 Rails 测试一样。但由于此报告数据,加载灯具大约需要 15 分钟。有 200 多个测试,套件每 12 小时运行一次。我不能弯曲时空队长!

编辑2:我也同意拥有这么多固定装置是一种难闻的气味。不过,我不确定如何减少它,因为报告汇总了大量数据,而硒测试的大部分价值在于它们测试了报告。

即使它是一小组数据,但是……它仍然是另一个与架构更改保持协调的数据集。(我们为单元、功能和 [Rails] 集成测试提供了一个单独的、较小的集合。)

这让我回到了我最初的问题——除了手工操作或记住每次都重新生成它们之外,还有其他选择吗?

4

3 回答 3

5

如果可以的话,最好的办法是拥有一个系统,在该系统中,每个 Selenium 测试都获得它自己的数据状态(即:删除并重新创建数据库表,重新插入引导数据,并清除缓存)。这说起来容易做起来难,通常只有在项目从一开始就计划好的情况下才有可能。

下一个最好的事情是为每个测试套件/运行提供一致的数据库状态。这不是那么好,因为现在很有可能某些测试将取决于先前运行的测试的成功,这使得识别真正的失败与假阴性变得更加困难。

IMO 最坏的情况是使用静态数据库,其中每次测试运行都会改变日期。这几乎总是会导致问题,并且通常是“项目气味”。以“正确方式”(同样,IMO)执行此操作的关键是对任何状态/模式更改保持警惕,并将其作为自动化测试/构建过程的一部分进行捕获。

Rails 已经在 Migrations 中做得很好,所以好好利用它们吧!在不了解您的情况的情况下,我通常会质疑是否需要针对完整数据库的快照运行 Selenium 测试。大多数数据库可以(或应该)被精简到小于 1MB 以进行自动化测试,从而使自动化模式迁移和数据重置更加高效。

我唯一一次看到为 Selenium 测试使用大量数据库的“有效”原因是当数据库本身包含大量“逻辑数据”时,其中的数据会影响应用程序流(想想:数据驱动的 UI)。

于 2009-03-13T21:03:17.697 回答
3

我想你在这里问了两个相互交织的问题,所以如果我要分解它:

  • 您希望快速将测试数据输入和输出您的数据库,而夹具并没有为您做这件事。
  • 您已经被架构更改所困扰,并且您希望确保无论您做什么都不需要以“摆弄测试数据......仍然”为主题的八次迭代:)

您在这里有几个替代方案,我在下面进行了讨论。因为您提到了 Oracle,所以我在这里使用 Oracle 技术,但对于其他数据库平台(例如 Postgresql)也是如此:

  1. 调用 PL/SQL 脚本来生成数据的 Rake 测试,讨厌的可怕的邪恶想法,除非没有其他选择,否则不要这样做。我在一个需要加载数十亿行以进行某些基础架构架构测试的项目上做到了这一点。我仍然为它生闷气。
  2. 将您的数据库转换为转储格式。对于快速二进制转储,请查看 exp/imp 和数据泵实用程序。这将允许您快速设置和拆卸数据库。当然,在我从事的一个 Rails 项目中,我们使用 rake 任务来 exp/imp 一个数据库,该数据库在一分钟内拥有大约 30 万条记录。还要检查 SQL Loader,它是逻辑转储实用程序,因为它的逻辑速度较慢,并且需要您拥有控制脚本来帮助 SQL Loader 理解转储。但是,逻辑转储的好处是您可以在它们上运行转换脚本以将数据转换为最新格式。遗憾的是,所有这些工具都像固定装置一样对模式的变化非常敏感。
  3. 使用诸如机械师工厂女孩之类的插件来更好地生成数据。您仍然会受到使用 ActiveRecord 设置数据库的惩罚,但这些假对象生成器将帮助您与迁移保持密切联系,并且比固定装置更容易维护。
  4. 结合方法 2 和 3。这里发生的情况是您使用 Machinst 生成一些测试数据。您将该测试数据导出到转储,然后在每次测试运行期间重新加载转储。当架构更改时,更新机械师配置并重新导出。

希望有帮助。

于 2009-03-15T03:38:02.693 回答
1

我目前在一个项目中使用了一个巨大的 Selenium 测试套件——实际上,它就是为 Selenium Grid 编写的——我们的测试使用少量的参考数据(尽管我们不使用 Rails YAML 固定装置)和对象工厂用于特定测试所需的一次性数据。

或者,在我参与的许多 ThoughtWorks Rails 项目中,我们编写了包含许多预提交挂钩的签入脚本——例如,在允许提交之前运行测试。您可能会考虑尝试的一件事是编写(或定制)一个类似的签入脚本,该脚本将检查架构更改并根据需要重新加载参考数据。

参见例如 Paul Gross在 Github 上的rake commit tasks 。

于 2009-03-13T19:38:23.890 回答