2010-04-13 38 views
5

Có một số cách để tạo dữ liệu cho các bài kiểm tra (không chỉ các bài kiểm tra đơn vị), ví dụ: Mẹ đối tượng, người xây dựng, v.v. Một cách tiếp cận hữu ích khác là ghi dữ liệu thử nghiệm dưới dạng văn bản thuần túy:DSL để tạo dữ liệu thử nghiệm

product: Main; prices: 145, 255; Expire: 10-Apr-2011; qty: 2; includes: Sub 
product: Sub; prices: 145, 255; Expire: 10-Apr-2011; qty: 2 

rồi phân tích cú pháp thành đối tượng C#. Điều này rất dễ sử dụng trong các bài kiểm tra đơn vị (vì các bộ sưu tập bên trong sâu có thể được viết bằng một dòng), điều này thậm chí còn thuận tiện hơn khi sử dụng trong hệ thống FitNesse (vì DSL này tự nhiên phù hợp với wiki), v.v.

Vì vậy, tôi sử dụng tính năng này và viết trình phân tích cú pháp, nhưng thật là tẻ nhạt khi viết mỗi lần. Tôi không phải là chuyên gia lớn về phân tích cú pháp DSL/ngôn ngữ, nhưng tôi nghĩ rằng họ có thể trợ giúp ở đây. Điều gì sẽ là một trong những quyền sử dụng? Tôi chỉ nghe nói về:

  • DSL (Ý tôi là, bất kỳ DSL)
  • Boo (mà tôi nghĩ rằng có thể làm DSL)
  • ANTLR

nhưng tôi thậm chí không biết cái nào để chọn và bắt đầu từ đâu.

Vì vậy, câu hỏi: có hợp lý để sử dụng một số loại DSL để tạo dữ liệu thử nghiệm không? Bạn sẽ gợi ý làm gì? Có bất kỳ trường hợp hiện tại nào không?

Cập nhật: có vẻ như tôi chưa đủ rõ ràng. Nó không phải về chuỗi thô để phản đối sự hội tụ. Nhìn vào dòng đầu tiên và liên kết nó với

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); 

Và lưu ý rằng trước tiên tôi tạo sản phẩm phụ và sau đó thêm sản phẩm phụ vào chính, mặc dù được liệt kê theo thứ tự ngược lại. Giá cả được xử lý một cách đặc biệt. Tôi muốn chỉ định tên của sản phẩm phụ và nhận được tham chiếu đến nó - tạo ra. Tôi muốn liệt kê tất cả các thuộc tính sản phẩm - FLAT và KHÔNG CHẤP NHẬN - trên một dòng. Tôi muốn sử dụng giá trị mặc định cho thuộc tính. Và cứ thế.

Cập nhật: Tôi không bị thuyết phục tránh DSL vì tất cả các ví dụ thay thế quá dài và không thân thiện với người dùng. Và không ai nói gì hữu ích về DSL.

Trả lời

1

Trước tiên tôi sẽ bắt đầu bằng cách xem liệu ngôn ngữ của tôi có đủ phong phú để xây dựng DSL của tôi hay không. C# nên xử lý trường hợp của bạn khá dễ dàng:

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} 
}; 

Không hoàn toàn đẹp, nhưng chắc chắn đủ để tôi đấu tranh để biện minh cho nỗ lực phụ của DSL tùy chỉnh.

Cũng lưu ý rằng Expire được khởi tạo bằng một chuỗi, nhưng rõ ràng là một ngày tháng. Điều này là hoàn toàn hợp lý cho một thành ngữ DSL, vì thiết lập của TestProduct.Expire có thể làm bản dịch.

+0

Nó tiết lộ chi tiết hơn, đặc biệt nếu bạn thêm rằng giá không chỉ là ints, và bao gồm không phải là chuỗi nhưng tham chiếu đến các sản phẩm khác (xem cập nhật). Tôi muốn viết "giá: 145, 255" và trình phân tích cú pháp nên biết rằng đầu tiên là giá sản phẩm chính và thứ hai là giá sản phẩm bảo trì. Mà không viết những chi tiết này mỗi lần. – queen3

+0

Và nếu tôi viết "giá: 145", trình phân tích cú pháp phải đủ thông minh để đặt cả giá thành cùng một giá trị. Hoặc, có thể, bảo trì như một nửa giá. Nếu bạn thêm các chi tiết như vậy, bạn sẽ thấy cần DSL. – queen3

+0

@ queen3: Về bình luận đầu tiên của bạn, tôi đồng ý; cho dù một DSL là giá trị nó đi xuống đến ngưỡng đau của riêng bạn cho tiếng ồn dòng. Tuy nhiên, điểm thứ hai của bạn không chính xác; setter cho 'TestProduct.prices' có thể dễ dàng xem liệu một hoặc hai giá đã được cung cấp và áp dụng lựa chọn các quy tắc của bạn cho phù hợp hay không. –

2

Đối với dữ liệu DSL YAML là một ứng cử viên xuất sắc. Đây là một mẫu từ Wikipedia:

--- 
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. 

Tôi đã sử dụng YAML trong một số dự án và hài lòng với nó.

Tuy nhiên, nếu chúng ta đang nói về đơn vị-xét nghiệm thường đơn giản và dễ đọc hơn để xây dựng các đối tượng cần thiết "bằng tay" với các nhà thầu và phân bổ tài sản tại chỗ. Điều này là bởi vì đơn vị kiểm tra là do bản chất của họ tập trung cao độ vào một số mã (đơn vị), và nó không phải là khó khăn để tạo ra cơ sở hạ tầng dữ liệu đó là chỉ đủ cho thử nghiệm. Nó là OK để hoạt động trên các thực thể nửa hoàn thành trong đơn vị kiểm tra, không bận tâm với việc xây dựng dữ liệu mà không liên quan đến thử nghiệm cụ thể này.

Đối với các bài kiểm tra chức năng, YAML rất tuyệt.

+1

Rất đa dạng, điều này tệ hơn khi sử dụng theo ý kiến ​​của tôi. – queen3

+0

Dòng đơn vẫn chỉ đọc được đối với các trường hợp đơn giản khi dữ liệu bằng phẳng. Làm thế nào để phản ánh cấu trúc lồng nhau trong một dòng? – nkrkv

+0

Trường hợp đơn giản là hầu hết các trường hợp khi làm các xét nghiệm (giống như bạn đã nói); với DSL, chúng tôi có thể thực hiện một dòng cho 80% trường hợp đơn giản và vẫn có thể thực hiện multiline với 20% còn lại; với multiline chúng tôi buộc phải tiết lộ ngay cả đối với các trường hợp đơn giản. Điều này đặc biệt xấu đối với các hệ thống giống như FitNesse-Wiki, nơi dữ liệu thử nghiệm được nhập vào các bảng văn bản. – queen3

0

Để tạo DSL bên ngoài, tôi khuyên bạn nên sử dụng Eclipse TMF Xtext thực sự tốt (dựa trên ANTLR nhưng đơn giản hơn), nhưng được xây dựng trên Eclipse và Java, tuy nhiên bạn có thể tạo bất kỳ mã nào. Khi tạo dữ liệu thử nghiệm, tôi lấy cảm hứng từ cách các nhân viên Ruby on Rails làm điều đó, đó là đồ đạc của YAML như đã đề cập trong câu trả lời khác, nhưng tôi cũng thấy một cách tiếp cận sử dụng các nhà máy. một số sự trùng lặp và không linh hoạt. Nhìn vào đây Railscasts 158: Factories not Fixtures, nó có thể cung cấp cho bạn một số ý tưởng để thiết kế DSL.

Các vấn đề liên quan