什么可以使这个dsl​​更容易键入或读取?

时间:2010-10-20 01:25:10

标签: java database testing scala dbunit

我编写了一个工作语法来替换Scala中的dbunit,称为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"

我不喜欢这种语法。这有点两个罗嗦。使用“ - ”看起来不正确,但如果我使用像“record”这样的实际命令字,我需要输入“ - >”将它们分开,否则它看起来非常糟糕(由于技术原因,这不是必需的)。

$ label将简单地重复标签,因此您可以使用最小标签作为重用字符串的方式。 $ label.uncamel将添加看起来像驼峰的空格。

标签背后的想法是为API提供访问记录的方式,而不必记住ID。如果您知道您想要获得的国家/地区对象是“加拿大”,那么您只需传递“加拿大”标签,它就会将其转换为唯一ID并将其从数据库中拉出来。

以下是您可以指定默认参数的示例:

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列。由于其中两个省来自加拿大,因此它们会自动从默认值继承。在第三种情况下,我们将其覆盖在纽约的美国。我们可以根据需要进行混合/匹配。

在实践中,这将节省大量的输入和认知负荷,因为我们通常只关心实践中的一些值,其余的可能只是占位符让数据库关闭缺少必需的字段等等上。这也有助于测试多态对象。

这是另一个:

article:
? date_create: $now
- article_id: 1, title: "The Fed Sucks"
- article_id: 2, title: null

此代码段显示您实际上可以放置空值而不执行dbUnit中的任何操作。在DbUnit中,您必须首先创建一个转换器,将自定义字符串(如“[NULL]”)转换为实际的空值。

事实上,我们可以更具表现力,并提供各种表达和功能来帮助生成数据。例如,$ now返回今天日期/时间格式正确的sql日期。我将扩展这些功能,以帮助您更轻松地编写测试数据。

无论如何,我正在寻求帮助来真正清理语法。我可以做任何改变,因为这是新鲜的,我想从一开始就把它变得非常时髦,而不是在以后改变它。

由于

4 个答案:

答案 0 :(得分:1)

我会考虑将其嵌入Scala而不是创建外部DSL。有用的功能是案例类,默认参数,编译器生成的复制方法。

答案 1 :(得分:1)

我建议通过以下方式扩展标签的初始语法:

  1. 按列名称分段/组标签。
    国家:[标签:名称]
    - country_id:1,姓名:“加拿大”
    - country_id:2,名称:“美国”
  2. 按列索引显示段/组标签,以最大限度地减少键入。
    国家:[标签:2]
    - country_id:1,姓名:“加拿大”
    - country_id:2,名称:“美国”
  3. Single Recod
    国家:
    - [标签:2] country_id:1,名称:“加拿大”
    - [标签:名称] country_id:2,名称:“美国”
  4. 如果您不想跟踪记录中的列数,则可以删除基于索引的标签。

    如果您希望扩展该工具,您可以为记录组添加其他属性,如并发,例如,使用5个Thread创建5K行将是这样的:


    国家:[标签:名称] [并发:5]
    - [标签:2] country_id:1,名称:“加拿大”
    - [标签:名称] country_id:2,名称:“美国”

答案 2 :(得分:1)

虽然拥有易于理解和简洁的格式当然很重要,但恕我直言仍然没有理由在没有寻找标准化替代品的情况下编写自己的专有。您是否考虑过使用轻量级且更具可读性的XML替代方案,例如JSONHAML?请注意,如果您只支持明确定义的子集,则仍具有工具支持和标准化的优势。

答案 3 :(得分:1)

这看起来很像YAML,所以我建议你看一下。以下是一些有效的YAML语法:

country:
  - country_id: 1
    name: Canada
  - country_id: 2
    name: United States

# country
---
country_id: 1
name: Canada
---
country_id: 2
name: United States