在 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 中设置假数据进行测试的主要内容,如果未能解决你的问题,请参考以下文章

mongoDB之基础

如何安装本地的mongo数据库之后如何安装客户端

使用 mongoose 在 mongodb 中设置集合的到期时间

使用 mongoose 在 mongodb 中设置集合的到期时间

如何在 GCP 中设置与 MongoDB Docker 容器的连接

使用模拟 MongoDB 服务器进行单元测试