1

我有一个现有的 Grails/MongoDB 应用程序,我正在向其中添加一些自动化测试。我希望针对 Mongo 集合中的一组特定数据执行这些测试。我希望测试能够破坏数据(如果幸运的话,结果可预测),然后能够快速删除并重新创建/重新加载数据库,以便我可以再次运行测试。

由于我打算将此种子测试数据基于我们生产系统中的真实数据,因此我希望能够从 JSON/BSON 格式加载数据,我可以从 Mongo shell 中的查询或其他东西中检索这些数据相似的。

基本上我不想写一百行代码,如下所示: new Record(name: 'John Doe', age: '25', favoriteColor: 'blue').save()

除了每个属性有 30 个之外,始终确保满足约束条件并且数据是真实的。这就是我想使用生产数据的原因。

我也不想求助于运行 mongorestore 的生成 exec 来加载和重新加载真实数据,因为这需要在测试者的机器上运行额外的软件。

有没有更好的办法?也许以某种方式将原始 JSON 解组为我可以使用 Grails MongoDB GORM 或 GMongo 执行的东西,或者直接调用 Java MongoDB 驱动程序?

4

2 回答 2

0

您可以使用com.mongodb.util.JSON类将 JSON 数据直接转换为 DBObject。看一下这个例子,它演示了如何使用 Java 驱动程序来做到这一点。
这篇 MongoDB博客文章展示了如何使用 GORM 和 Groovy 驱动程序来做到这一点。

于 2013-03-21T18:57:17.200 回答
0

您是否需要将测试数据存储在可传输的文件中,或者您是否始终可以访问它可以存在的 mongodb 实例?例如,假设您有一个测试 mongodb 服务器,并且您可以依赖于在运行测试时访问它。

在这种情况下,最简单的解决方案是将测试数据保存在您在每次测试运行之前克隆的集合中。然后,测试可以根据需要随意破坏克隆的集合,而不会丢失任何实际数据。

如果您需要将测试数据保存在文件中(例如,因为您想将其存储在代码存储库中),那么您需要找到一种易于从 BSON 序列化/反序列化的格式。JSON 似乎是一个显而易见的选择,尤其是因为正如上面@drorb 所说,mongodb 已经有工具可以为您做到这一点。

然后,您只需要编写一个脚本来将现有集合的内容转储到 JSON 文件中,然后编写另一个脚本来加载一组 JSON 文件并将它们存储在一个集合中 - 每个可能不超过几行。

我建议将每个对象存储在单独的 JSON 文件中,而不是使用包含所有测试数据的大文件。尽管我很喜欢 JSON,但它不适合流式传输,并且您必须将整个集合存储在内存中,然后才能开始将其转储到 mongodb 中。如果您的测试数据足够大,它可能会开始导致内存问题。

于 2013-03-21T22:38:38.923 回答