一千萬個為什麽

搜索

DSL生成測試數據

有幾種方法可以為測試生成數據(不僅是單元測試),例如,Object Mother,構建器等。另一種有用的方法是將測試數據寫為純文本:

 產品:Main;價格:145,255;有效期:2011年4月10日;數量:2;包括:Sub
產品:Sub;價格:145,255;有效期:2011年4月10日;數量:2
</代碼> 

然後將其解析為C#對象。這在單元測試中很容易使用(因為深層內部集合可以用單行編寫),這在FitNesse類系統中使用更加方便(因為這個DSL自然適合wiki),依此類推。

所以我使用它並編寫解析器,但每次編寫都很繁瑣。我不是DSL /語言解析器的大專家,但我認為他們可以在這裏提供幫助。什麽是正確的使用?我只聽說過:

  • DSL(我的意思是,任何 DSL)
  • Boo(我認為可以做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);

請註意,我首先創建子產品,然後將其添加到main,即使它以相反的順序列出。價格以特殊方式處理。我想指定Sub產品的名稱並獲得它的引用 - 創建。我想在單行上列出所有產品屬性 - FLAT和NON-REPEATATIVE。我想使用屬性的默認值。等等。

更新:我不相信避免使用DSL,因為所有替代示例都過於冗長且不便於用戶使用。沒有人說有關DSL的任何有用的東西。

最佳答案

對於數據DSL, YAML 是一個很好的候選人。以下是維基百科的示例:

---
receipt:     Oz-Ware Purchase Invoice
date:        2007-08-06
customer:
    given:   Dorothy
    family:  Gale

items:
    - part_no:   A4786
      descrip:   Water Bucket (Filled)
      price:     1.47
      quantity:  4

    - part_no:   E1628
      descrip:   High Heeled "Ruby" Slippers
      price:     100.27
      quantity:  1

bill-to:  &id001
    street: |
            123 Tornado Alley
            Suite 16
    city:   East Westville
    state:  KS

ship-to:  *id001

specialDelivery:  >
    Follow the Yellow Brick
    Road to the Emerald City.
    Pay no attention to the
    man behind the curtain.

我在幾個項目中使用YAML並對此感到滿意。

但是,如果我們討論的是 unit -tests,那麽使用構造函數和屬性賦值來“構建”必要的對象通常更簡單,更易讀。這是因為單元測試本質上高度集中在某些代碼(單元)上,並且創建足夠 的數據基礎結構並不難以進行測試。在單元測試中對半完全實體進行操作是可以的,不用擔心構造與此具體測試無關的數據。

對於功能測試,YAML很棒。

轉載註明原文: DSL生成測試數據