在 mongodb 中设置假数据进行测试
Posted
技术标签:
【中文标题】在 mongodb 中设置假数据进行测试【英文标题】:setting up fake data in mongodb for testing 【发布时间】:2015-08-16 01:47:31 【问题描述】:我们有一个项目,我们需要在其中创建一个假数据库和假数据以进行功能测试。最初,我们从一个脚本开始,该脚本使用 mongoose 创建实体、初始化它们并保存它们。
var StudentA = new Student();
StudentA.name = "Bob";
StudentA.surname = "Marley";
StudentA.save();
随着应用程序的增长和文档之间关系的增加,这个脚本已经变得一团糟。现在,它对我们在应用程序开发上的投入时间构成了瓶颈。
问题是,有没有更好的方法呢?例如一个以更结构化的方式用数据填充数据库的库?还是我们应该像 csv 文件一样解析文件,然后将其推送到 mongo?
问题是针对 mongodb 的,但它可以推广到需要填充假数据的任何类型的 NO-SQL 数据库。 (使用类似 SQL 的 RDBMS 语法更简单)
【问题讨论】:
【参考方案1】:您不需要安装 npm 工具或库来生成假数据,只是在项目中添加了额外的不需要的任务。只需使用 Mockaroo 之类的在线工具,导出为 json 并按上述方法导入 Mongo DB。
Mockaroo
可能会节省一个小时的时间。
【讨论】:
【参考方案2】:可以在此处找到更多示例以及文档 API。请在左上角的下拉菜单中选择合适的版本。
https://docs.mongodb.com/v3.6/reference/program/mongoimport/#examples
【讨论】:
【参考方案3】:我同意上述解决方案并认为最好的方法是:
-
使用库工具生成虚假信息。
将虚假信息转换为 json 文件。
使用 mongoimport 将其上传到 mongo。
我发现有一些库可以让你免费生成假数据,比如 Faker.js(如果你熟悉 node.js 和 js)或者你可以在这里使用免费的 Java 版本的 Faker :https://github.com/blocoio/faker
我还在这里找到了一个付费解决方案:https://www.mockaroo.com/,但不知道为什么有人愿意为此付费,因为生成虚假数据相当容易 - 这是一个分步指南。
将faker java库和json编写器导入你的项目(我用的是gradle所以这里是gradle代码):
repositories
maven url 'https://jitpack.io'
dependencies
compile 'com.github.blocoio:faker:1.0.1'
compile 'com.googlecode.json-simple:json-simple:1.1.1'
使用以下java代码生成任意数量的假对象,这里我使用循环生成3个对象,并将其保存到json.file中。
public class FakerTest
static FileWriter file;
public static void main(String[] args)
try
file = new FileWriter("c:\\<Your Location>\\test.json"); //try opening the file
for (int i = 0; i < 3; i ++)
Faker faker = new Faker();
JSONObject obj = new JSONObject();
obj.put("Name", faker.name.firstName());
obj.put("address",faker.address.streetAddress());
obj.put("email",faker.internet.email());
file.write(obj.toJSONString());
file.flush();
file.close();
catch (IOException e)
e.printStackTrace();
json文件的结果:
"地址":"790 墨菲 Vista","email":"willa@schmittjenkinsandabernathy.net","Name":"Christop""address":"7706 拉金 River","email":"martin_carter@ryanbartellandeffertz.com","Name":"Braeden""address":"1893 雅马库斯 休息","email":"cassidy_kris@ziemeankundingandblick.com","Name":"Marlee"
现在,使用 mongoimport 上传。
faker 库可以让你生成很多字段,请参考:
https://github.com/stympy/faker/blob/master/README.md
【讨论】:
【参考方案4】:Download这个json文件由MongoDB提供。
你可以mongoimport
它使用:
mongoimport --db testDB --collection testCollection --file test.json
有关 Mongoimport 的更多详细信息可以找到here。
【讨论】:
谢谢,但我宁愿使用自己的数据模型。它不应该是随机数据,而是我的数据模型中的随机数据。【参考方案5】:您可以尝试编写 json 文件而不是代码,并使用 mongoimport 重新创建您的数据库。 这比大量冗长重复的代码更容易维护。
【讨论】:
这听起来足够强大。有没有一种简单的方法来管理这种方法中的文档关系?例如,每个学生都有一个学校 ID 作为字段。在我的脚本中,猫鼬处理了这个 id 创建阶段(仅在您创建对象时) - 在这种方法中,我是否需要手动将 Id 设置为学校并将它们链接到 json 文档中? 是的,您必须手动维护关系。请记住,_id
不需要是 ObjectId。它可以是任何东西,只要它是独一无二的。所以school.json
可以包含:_id:1, name:"Foo"
和student.json
可以包含_id:"student_1", school_id:1, name:"John"
。请记住尝试嵌入文档而不是进行“类似 SQL 的连接”。
另外,我会使用不同的(小)json 文件来确保我的所有测试保持独立以避免庞大的数据集。
我相信这是最好的方法,它并不完美但目前没有其他解决方案。以上是关于在 mongodb 中设置假数据进行测试的主要内容,如果未能解决你的问题,请参考以下文章
使用 mongoose 在 mongodb 中设置集合的到期时间
使用 mongoose 在 mongodb 中设置集合的到期时间