JSONium — еще один генератор коллекций json’ов

JSONium

Генерация мок-данных — задача довольно тривиальная, если речь идет о создании нескольких объектов с различными значениями в нескольких полях (например, json-generator, mockaroo и npm-модули — ?q=json+generator).

Проанализировав их, я пришел к выводу, что они отлично подходят только для создания заданного количества случайных комбинаций. А у меня была задача о генерации всех возможных JSON’ов по заданным вариантам данных. Пример: есть шаблон вида {p1: '{{a}}', p2: '{{b}}'}, для a есть варианты — 1, 2, а для b3, 4. В результате я рассчитываю получить 4 объекта:

[
    {a: 1, b: 3},
    {a: 1, b: 4},
    {a: 2, b: 3},
    {a: 2, b: 4}
]

Алгоритм генерации тут довольно простой — несколько вложенных циклов:

цикл по шаблонам
    цикл по ключам в каждом шаблоне, в значениях которых надо сделать замены
        цикл по вариантам данных

Несколько «тонких» моментов:

  • Замены могут потребоваться на произвольной вложенности ключа: {a: {b: '{{replace_me}}'}} или {a: [{b: '{{replace_me}}'}]}
  • В одном ключе может быть несколько замен

Так и появился JSONium — «класс» для генерации всех возможных комбинаций объектов. Исходный код доступен на github — ссылка. Установка:

npm i jsonium

Приведу пример использования:

var Jsonium = require('jsonium');
var j = new Jsonium();
 
var operators = [
  {OPERATOR: "==="},
  {OPERATOR: "!=="}
];
 
var types = [
  {TYPE: "string"},
  {TYPE: "object"}
];
 
var templates = [
  {
    code:
      "var val = typeof foo {{OPERATOR}} '{{TYPE}}';"
  },
  {
    code:
      "var val = '{{TYPE}}' {{OPERATOR}} typeof foo;"
  }
];
 
var tests = j
  .setTemplates(templates)
  .createCombos(["code"], operators)
  .useCombosAsTemplates()
  .createCombos(["code"], types)
  .uniqueCombos()
  .getCombos();

На выходе получится:

[
  {
    "code": "var val = typeof foo === 'string';"
  },
  {
    "code": "var val = typeof foo === 'object';"
  },
  {
    "code": "var val = typeof foo !== 'string';"
  },
  {
    "code": "var val = typeof foo !== 'object';"
  },
  {
    "code": "var val = 'string' === typeof foo;"
  },
  {
    "code": "var val = 'object' === typeof foo;"
  },
  {
    "code": "var val = 'string' !== typeof foo;"
  },
  {
    "code": "var val = 'object' !== typeof foo;"
  }
]

Даже на таком маленьком примере видно, насколько легче добавлять новые варианты к существующим комбинациям. Если я захочу помимо строгих сравнений добавить еще варианты с нестрогими, то будет достаточно operators сделать вида (и на выходе будет уже не 8, а 16 комбинаций):

var operators = [
  {OPERATOR: "==="},
  {OPERATOR: "!=="},
  {OPERATOR: "!="},
  {OPERATOR: "=="}
];

А если в types добавить еще undefined, symbol, function, number, boolean, то комбинаций будет уже 56. Определенно, что прописывать их «вручную» — не вариант.

Немного подробнее о методах. setTemplates — получает массив шаблонов и сохраняет их внутри генератора. createCombos — собственно, сам метод-генератор. Принимает два аргумента — массив со списком ключей, где делать замены, и объект с данными для замен. useCombosAsTemplates — подкладывает созданные комбинации на место шаблонов. Это полезно, когда генерация выполняется «по цепочке». uniqueCombos — отфильтровывает дубликаты в комбинациях. getCombos — возвращает сгенерированные комбинации.

Свое практическое применение JSONium получил при работе над eslint-плагинами mocha-cleanup и ember-cleanup, а точнее при их тестировании. Когда количество тестов написанных «вручную» начало переваливать за адекватные рамки, было решено этот процесс автоматизировать.

, ,

jsonium 

Оставить комментарий

Top ↑ | Main page | Back