que*_*en3 5 dsl unit-testing antlr
有几种方法可以为测试生成数据(不仅仅是单元测试),例如,Object Mother,构建器等.另一种有用的方法是将测试数据写为纯文本:
Run Code Online (Sandbox Code Playgroud)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生成测试数据是否合理?你有什么建议吗?有现有案例吗?
更新:似乎我不够清楚.它不是关于原始字符串到对象转换.看第一行并将其与之相关联
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);
Run Code Online (Sandbox Code Playgroud)
请注意,我首先创建子产品,然后将其添加到main,即使它以相反的顺序列出.价格以特殊方式处理.我想指定Sub产品的名称并获得它的引用 - 创建.我想在单行上列出所有产品属性 - FLAT和NON-REPEATATIVE.我想使用属性的默认值.等等.
更新:我不相信避免使用DSL,因为所有替代示例都过于冗长且不便于用户使用.并且没有人说过有关DSL的任何有用的东西.
我首先会看看我选择的语言是否足够丰富来构建我的 DSL。C# 应该很容易处理你的情况:
Product[] products = new Product[] {
new TestProduct{product="Main", prices=new[]{145, 255}, Expire="10-Apr-2011", qty=2, includes="Sub"},
new TestProduct{product="Sub", prices=new[]{145, 255}, Expire="10-Apr-2011", qty=2}
};
Run Code Online (Sandbox Code Playgroud)
不太漂亮,但肯定足够可以忍受,以至于我很难证明定制 DSL 的额外努力是合理的。
另请注意,Expire 是用字符串初始化的,但它显然是一个日期。这对于 DSL 习惯用法来说是完全合理的,因为TestProduct.Expire的 setter 可以进行转换。
| 归档时间: |
|
| 查看次数: |
1170 次 |
| 最近记录: |