2010-04-13 14 views
5

ऐसे कई तरीके परीक्षण के लिए डेटा (न केवल इकाई परीक्षण), उदाहरण के लिए, वस्तु माँ, बिल्डरों, उत्पन्न करने के लिए कर रहे हैं आदि एक और उपयोगी दृष्टिकोण सादे पाठ के रूप परीक्षण डेटा लिखने के लिए किया जाता है:डीएसएल परीक्षण डेटा उत्पन्न करने के लिए

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

और फिर इसे सी # ऑब्जेक्ट्स में पार्स करें। यूनिट परीक्षणों में उपयोग करना आसान है (क्योंकि गहरे आंतरिक संग्रह को एकल रेखा में लिखा जा सकता है), यह फिटनेस-जैसी प्रणाली में उपयोग करने के लिए और भी सुविधाजनक है (क्योंकि यह डीएसएल स्वाभाविक रूप से विकी में फिट बैठता है), और इसी तरह।

तो मैं इस का उपयोग करें और पार्सर लिखने, लेकिन यह हर बार लिखने के लिए कठिन है। मैं डीएसएल/भाषा पार्सर्स में एक बड़ा विशेषज्ञ नहीं हूं, लेकिन मुझे लगता है कि वे यहां मदद कर सकते हैं। उपयोग करने के लिए सही क्या होगा?

  • डीएसएल (मेरा मतलब है, किसी भी डीएसएल)
  • बू (मुझे लगता है कि डीएसएल कर सकते हैं)
  • ANTLR

लेकिन मैं यह भी नहीं जानते: मैं केवल बारे में सुना कौन सा चुनना है और कहां से शुरू करना है।

तो सवाल: यह डीएसएल किसी तरह का उपयोग करने के लिए परीक्षण डेटा उत्पन्न करने के लिए उचित है? ऐसा करने का आप क्या सुझाव देंगे? क्या कोई मौजूदा मामला है?

अद्यतन: ऐसा लगता है जैसे मैं पर्याप्त स्पष्ट नहीं था। यह कनवर्टन ऑब्जेक्ट करने के लिए कच्ची स्ट्रिंग के बारे में नहीं है। पहली पंक्ति को देखो और यह

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

से संबंधित हैं और वह मैं पहली बार उप उत्पाद बनाने और उसके बाद मुख्य में जोड़ने, भले ही यह उलटे क्रम में सूचीबद्ध किया गया है ध्यान दें। कीमतों को एक विशेष तरीके से संभाला जाता है। मैं उप उत्पाद का नाम निर्दिष्ट करना चाहता हूं और इसका संदर्भ प्राप्त करना चाहता हूं - बनाया गया। मैं सभी उत्पाद गुणों को सूचीबद्ध करना चाहता हूं - फ्लैट और गैर-दोहराव - एकल रेखा पर। मैं गुणों के लिए डिफ़ॉल्ट का उपयोग करना चाहता हूँ। और इसी तरह।

अद्यतन: मैं डीएसएल से बचने के लिए, क्योंकि सभी विकल्प उदाहरण भी वर्बोज़ और नहीं उपयोगकर्ता के अनुकूल हैं आश्वस्त नहीं हूँ। और किसी ने भी डीएसएल के बारे में कुछ भी उपयोगी नहीं कहा।

उत्तर

1

मैं पहली बार यह देखकर शुरू करूंगा कि मेरी पसंद की भाषा मेरे डीएसएल बनाने के लिए पर्याप्त समृद्ध थी या नहीं। सी # काफी आसानी से अपने मामले को संभालने के लिए चाहिए:

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

काफी के रूप में सुंदर नहीं है, लेकिन निश्चित रूप से काफी संतोषजनक है कि मैं एक कस्टम डीएसएल के लिए अतिरिक्त प्रयास का औचित्य साबित करने के लिए संघर्ष करेंगे।

भी ध्यान रखें कि समाप्त एक तार के साथ initialised है, लेकिन यह स्पष्ट रूप से एक तारीख है। यह एक डीएसएल मुहावरे के लिए बिल्कुल उचित है, क्योंकि TestProduct.Expire का सेटर अनुवाद कर सकता है।

+0

यह बहुत अधिक वर्बोज़ है, खासकर यदि आप जोड़ते हैं कि कीमतें केवल इनट्स नहीं हैं, और इसमें स्ट्रिंग्स नहीं हैं लेकिन अन्य उत्पादों के संदर्भ हैं (अपडेट देखें)। मैं "कीमतें: 145, 255" लिखना चाहता हूं और पार्सर को पता होना चाहिए कि पहला मुख्य उत्पाद मूल्य है और दूसरा रखरखाव उत्पाद मूल्य है। हर बार इन विवरणों को लिखने के बिना। – queen3

+0

और यदि मैं "कीमतें: 145" लिखता हूं तो पार्सर दोनों कीमतों को एक ही मूल्य पर सेट करने के लिए पर्याप्त स्मार्ट होना चाहिए। या, हो सकता है, रखरखाव आधा मूल्य के रूप में। यदि आप ऐसे विवरण जोड़ते हैं, तो आपको डीएसएल की आवश्यकता दिखाई देगी। – queen3

+0

@ queen3: आपकी पहली टिप्पणी के बारे में, मैं सहमत हूं; चाहे एक डीएसएल लायक है, यह लाइन-शोर के लिए आपके दर्द-थ्रेसहोल्ड पर आता है। आपका दूसरा बिंदु गलत है, हालांकि; 'TestProduct.prices' के लिए सेटटर आसानी से देख सकता है कि एक या दो कीमतें आपूर्ति की गई हैं और तदनुसार नियमों की अपनी पसंद लागू करें। –

2

डेटा डीएसएल 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. 

मैंने कई परियोजनाओं में वाईएएमएल का उपयोग किया और इसके साथ खुश हूं।

हालांकि, अगर हम इकाई के बारे में बात कर रहे हैं- यह आमतौर पर रचनाकारों और संपत्ति असाइनमेंट के साथ "हाथ से" आवश्यक वस्तुओं को बनाने के लिए सरल और अधिक पठनीय होता है। ऐसा इसलिए है क्योंकि इकाई-परीक्षण उनकी प्रकृति द्वारा कुछ कोड (इकाई) पर केंद्रित है, और परीक्षण के लिए पर्याप्त डेटा आधारभूत संरचना बनाना कठिन नहीं होना चाहिए। यूनिट-टेस्ट में अर्ध-पूर्ण इकाइयों पर काम करना ठीक है, इस ठोस परीक्षण से संबंधित डेटा बनाने के साथ परेशान न करें।

कार्यात्मक परीक्षणों के लिए वाईएएमएल बहुत अच्छा है।

+1

यह मल्टीलाइन है, जो मेरी राय में उपयोग करने के लिए बदतर है। – queen3

+0

डेटा सपाट होने पर केवल सामान्य मामलों के लिए एकल पंक्ति पठनीय रहती है। एकल लाइन में नेस्टेड संरचनाओं को कैसे प्रतिबिंबित करें? – nkrkv

+0

परीक्षण करते समय साधारण मामलों में ज्यादातर मामले होते हैं (जैसा आपने कहा था); डीएसएल के साथ हम 80% साधारण मामलों के लिए एकल लाइन कर सकते हैं और बाकी 20% के लिए मल्टीलाइन कर सकते हैं; मल्टीलाइन के साथ हमें सरल मामलों के लिए भी वर्बोज़ होने के लिए मजबूर होना पड़ता है। यह विशेष रूप से फिटनेस-विकी-जैसी प्रणालियों के लिए खराब है जहां टेस्ट डेटा टेक्स्ट टेबल में दर्ज किया जाता है। – queen3

0

बाहरी डीएसएल बनाने के लिए मैं एक्लिप्स टीएमएफ एक्सटेक्स्ट की सिफारिश करता हूं जो वास्तव में अच्छा है (एएनटीएलआर पर आधारित लेकिन सरल), लेकिन ग्रहण और जावा के शीर्ष पर बनाया गया है, हालांकि आप कोई कोड उत्पन्न कर सकते हैं। जब परीक्षण डेटा बनाने की बात आती है, तो रेलवे के लोगों ने रूबी के तरीके से प्रेरित किया, जो कि किसी अन्य उत्तर में उल्लिखित वाईएएमएल फिक्स्चर था, लेकिन मैंने कारखानों का उपयोग करके एक दृष्टिकोण भी देखा, जो आपको छुटकारा पाने में मदद कर सकता है कुछ डुप्लिकेट और लचीलापन। इस Railscasts 158: Factories not Fixtures को देखें, यह आपको डीएसएल डिजाइन करने के लिए कुछ विचार दे सकता है।

संबंधित मुद्दे