#generate #model #specification #mocking #fake #properties #fake-data

bin+lib mockery

基于规范文件生成用于各种目的的模拟数据

2 个版本

0.2.1 2019 年 12 月 10 日
0.2.0 2019 年 12 月 10 日

#477 in 测试

GPL-3.0+

42KB
935

Mockery.rs

根据规范文件生成模拟数据。可以在文件中指定多个模型,模型可以相互引用属性以创建关系型数据。

安装

目前 Mockery.rs 通过 crates.io 分发。将来将提供二进制分发。

  • cargo install mockery (已测试与 rustc 1.39.0 兼容)

命令行使用

mockery.rs 0.2.0
Louis Capitanchik <[email protected]>
Generate spec based model data.

USAGE:
    mockery [FLAGS] [OPTIONS] <MODEL> [OUTPUT]

FLAGS:
    -h, --help       
            Prints help information

    -p, --pretty     
            Whether or not the output should be formatted for human consumption. Default: false

    -V, --version    
            Prints version information


OPTIONS:
    -n, --number <NUMBER>       
            The number of root models that should be generated

    -s, --spec <SPEC_PATH>      
            Sets the spec file to use. By default, mockery will look for a 'spec.json' file in CWD, and will error if it
            can not be found
    -t, --type <OUTPUT_TYPE>    
            Sets the output type. This value defaults to CSV for higher compatibility and throughput [possible values:
            csv, json]

ARGS:
    <MODEL>     
            Sets the model to generate. The model determines what files will be generated based on it's definition in
            the spec
    <OUTPUT>    
            Sets the output path. Must be a file path pointing to a folder that optionally exists; if it does not exist,
            it will be created. Files corresponding to the input model names will be created inside this folder

入门

模型在 specification 文件中定义,将模型名称映射到属性/类型对。目前仅支持 JSON,但未来将支持更多格式。本简短指南将指导你设置一个模型规范,可以生成复杂的关系型数据集

基本模型

spec.json 文件的最小样板代码如下

{
  "models": {
  
  }
}

这定义了一个空的模型集。显然,这意味着无法生成任何内容。所以我们将添加一个简单的 post 模型,其中包含 id(一个 UUID)、title(一个句子)和 contents(一个段落)属性,以表示像 Mastodon 这样的微博服务上的帖子。模型名称是 models 对象中的键,它们映射到定义模型属性的嵌套对象

{
  "models": {
    "post": {
      "id": {
        "type": "RandomData",
        "value": "UUID4"
      },
      "title": {
        "type": "RandomData",
        "value": "Sentence"
      },
      "contents": {
        "type": "RandomData",
        "value": "Paragraph"
      }
    }
  }
}

这里有很多新内容;我们定义了一个 post 模型和三个简单属性。每个属性都有一个 typevalue,它决定了如何生成。指定 RandomData 作为 type 允许我们生成丰富的一组模拟数据。

我们选择使用 UUID4 值生成我们的 id 属性的 v4 UUID,使用 Sentence 值生成我们的 title 的一句 lorem ipsum 文本,并为我们 contents 生成一段 lorem ipsum 文本。

这足以开始,但有一些不同的值可以用于 type,这些值可能会很有用,还有在 RandomData 属性的 value 位置指定复杂类型选项的方法。

使用复杂类型

有时我们希望对生成数据的类型有一定的控制。例如,我们可能希望值在某个范围内。有时我们可能只想在我们的模型中包含静态、预定的数据;复杂类型提供了自定义输出值的语法。在下面的例子中,我们将基于上一个例子,生成一个特定大小的封面图像,以显示在我们的帖子旁边。

{
  "models": {
    "post": {
      "id": {
        "type": "RandomData",
        "value": "UUID4"
      },
      "title": {
        "type": "RandomData",
        "value": "Sentence"
      },
      "contents": {
        "type": "RandomData",
        "value": "Paragraph"
      },
      "cover_image": {
        "type": "RandomData",
        "value": {
          "LoremPicsum": {
            "width": 1920,
            "height": 1080
          }
        }
      }
    }
  }
}

通过添加 cover_image 属性,我们现在有一个 lorem picsum URL,它将渲染一个 1080p 的图像。由于 JSON 语法的性质,为了指定带有选项的类型,我们需要将定义嵌套在大括号中。这可能在 1.0.0 之前发生变化,具体取决于替代方法的形状。可以在这里找到可用的 RandomData 类型列表:这里

生成数据

现在您已经有了模型定义,您可以通过一些方式实际生成数据。本节将假设您已将前面的模型定义之一保存在当前工作目录中名为 spec.json 的文件中。

如果您运行 mockery post output 命令,Mockery.rs 将创建一个名为 output/post.csv 的文件,其中包含一个帖子。您可以通过指定 -n <number> 来生成多个帖子;例如,mockery post output -n 1000 将生成一个包含 1000 个模拟帖子的 post.csv 文件。

但是,关于这些行有些奇怪……数据并不总是在每一行中按照相同的顺序!

Mockery.rs 并不在内部以有序的方式生成或存储数据,因此如果您希望 CSV 输出是有序的,您需要在 spec.json 文件中添加另一个部分。这不会在生成 JSON 输出时考虑在内,因为对于 JSON 文件来说,顺序不应该很重要。如果您有对 JSON 输出中键进行排序的用例,请提交一个包含更多信息的问题。

serialize 键添加到您的 spec.json 文件的根目录允许您指定每个模型的属性排序。但要注意;如果您为某个模型指定了顺序,则只有您列出的键将出现在输出中。

{
  "serialize": {
    "post": [
      "id",
      "title",
      "contents",
      "cover_image"
    ]
  },
  "models": {
    "post": {
      "...": "..."
    }
  }
}

现在,当输出生成 CSV 文件时,post 模型将按照列表中的顺序排列所有属性。这种方法对于插入到关系型数据库中很好,因为许多 RDBMS 系统都有一种比传统插入查询更快的 CSV 导入方式。

但是,如果您想要输出格式化的 JSON,则可以运行 mockery post output -t json -n 1000 -p;这将创建一个包含 1000 个格式化帖子数组的 output/post.json 文件。这种输出格式很容易通过肉眼浏览,省略 -p 标志将输出一个简洁的 JSON 格式,可以很容易地用作模拟 API 的一部分。

依赖项

~12MB
~189K SLoC