Я написал рабочую грамматику для замены dbunit в scala под названием ScalaDBTest. Вся программа работает - на написание ушло всего 2 дня. Я получил много полировки, чтобы сделать.
В любом случае, грамматика, которую я использую для DSL для ввода данных в базу данных, является податливой, и я хотел бы получить некоторые отзывы об этом.
Основной синтаксис выглядит следующим образом. Все довольно просто:
country:
- country_id: 1, name: "Canada"
- country_id: 2, name: "United States"
Это, безусловно, лучше, чем операторы вставки XML или SQL.
Я обсуждал, используя ":" или "=". Первый выглядит лучше, но последний, кажется, автоматически набирает текст.
Существует также концепция, при которой вы можете "маркировать" запись. В некотором смысле приведенный выше синтаксис анонимных записей. Ярлыки будут интересной функцией, поскольку вы можете использовать их различными способами.
country:
record: Canada -> country_id: 1, name: $label # produces "Canada"
record: UnitedStates -> country_id: 2, name: $label.uncamel # produces "United States"
Мне не нравится этот синтаксис. Это немного два слова. Использование «-» не выглядит правильным, но если я использую фактическое командное слово, такое как «запись», мне нужно поставить «->», чтобы отделить их, иначе это выглядит очень плохо (это не нужно по техническим причинам).
$ label просто повторяет метку, поэтому вы можете использовать метку как минимум для повторного использования строки. $ label.uncamel добавит пробелы там, где это выглядит как верблюжий кейс.
Идея, стоящая за метками, заключается в том, чтобы предоставить API-интерфейсам доступ к записям без необходимости запоминания идентификаторов. Если вы знаете, что объектом страны, которую вы хотите получить, является «Канада», то вы можете просто передать метку «Канада», и она преобразует его в уникальный идентификатор и вытащит его из базы данных.
Вот пример, где вы можете указать параметры по умолчанию:
province:
? country_id: 1, nice_weather: true
- province_id: 1, name: "British Columbia"
- province_id: 2, name: "Manitoba", nice_weather: false
- province_id: 3, name: "New York", country_id: 2
Здесь вы видели какую-то реальную силу. Все эти 3 записи «провинции» будут иметь 4 столбца. Поскольку 2 провинции из Канады, они автоматически наследуются от значений по умолчанию. В третьем случае мы переопределяем это с Соединенными Штатами для Нью-Йорка. Мы можем смешивать / сочетать по мере необходимости.
На практике это сэкономит много печатной и когнитивной нагрузки, так как на практике мы часто заботимся только о нескольких значениях, а остальные могут быть просто заполнителями, чтобы база данных закрывалась из-за отсутствия обязательных полей и т. Д. на. Это действительно помогает в тестировании полиморфных объектов.
Вот еще один:
article:
? date_create: $now
- article_id: 1, title: "The Fed Sucks"
- article_id: 2, title: null
Этот фрагмент демонстрирует, что вы можете фактически помещать нулевые значения, не выполняя никаких трюков, как в dbUnit. В DbUnit сначала необходимо создать преобразователь, который переводит пользовательскую строку (например, «[NULL]») в фактическое нулевое значение.
На самом деле, мы можем быть намного более выразительными и предлагать различные выражения и функции, помогающие генерировать данные. Например, $ сейчас возвращает правильно отформатированную дату sql сегодняшней даты / времени. Я буду расширять эти функции, чтобы упростить написание тестовых данных.
В любом случае, я ищу помощь, чтобы действительно очистить синтаксис. Я могу сделать любое изменение, и, поскольку оно свежее, я бы хотел, чтобы оно было действительно шикарным с самого начала, а не менять его позже.
Спасибо