【发布时间】:2010-04-13 11:54:18
【问题描述】:
有几种方法可以为测试(不仅仅是单元测试)生成数据,例如 Object Mother、builder 等。另一种有用的方法是将测试数据编写为纯文本:
product: Main; prices: 145, 255; Expire: 10-Apr-2011; qty: 2; includes: Sub product: Sub; prices: 145, 255; Expire: 10-Apr-2011; qty: 2
然后将其解析为 C# 对象。这在单元测试中很容易使用(因为深层内部集合可以用单行编写),在类似 FitNesse 的系统中使用更方便(因为这个 DSL 自然适合 wiki)等等。
所以我用这个来写解析器,但是每次都写起来很乏味。我不是 DSL/语言解析器的大专家,但我认为他们可以在这里提供帮助。什么是正确的使用?我只听说过:
- DSL(我的意思是,任何 DSL)
- 嘘(我认为可以做 DSL)
- ANTLR
但我什至不知道该选择哪一个以及从哪里开始。
那么问题来了:使用某种 DSL 来生成测试数据是否合理?你会建议这样做吗?有没有现成的案例?
更新:好像我还不够清楚。这与原始字符串到对象的转换无关。查看第一行并将其与
var main = Product.New("Main")
.AddPrice(Price.New(145).WithType(PriceType.Main).AndQty(2))
.AddPrice(Price.New(255).WithType(PriceType.Maintenance).AndQty(2))
.Expiration(new DateTime(10, 04, 2011));
var sub = Product
.New("Sub").Parent(main)
.AddPrice(...));
main.AddSubProduct(sub);
products.Add(main);
products.Add(sub);
请注意,我首先创建子产品,然后将其添加到主产品,即使它以相反的顺序列出。价格以特殊方式处理。我想指定子产品的名称并获得对它的引用 - 创建。我想在单行上列出所有产品属性 - 平面和非重复。我想对属性使用默认值。以此类推。
更新:我不相信要避免使用 DSL,因为所有替代示例都过于冗长且对用户不友好。没有人说任何关于 DSL 的有用信息。
【问题讨论】:
标签: unit-testing antlr dsl