2009-09-24 13 views
7

हम परीक्षण डेटा उत्पन्न करने के लिए निर्माता पैटर्न का उपयोग कर रहे हैं। इन डोमेन ऑब्जेक्ट्स के बीच संबंध हैं। हमारे कार्यात्मक परीक्षणों को इन वस्तुओं को जारी रखने की आवश्यकता होती है।जटिल परीक्षण डेटा

domain model http://i34.tinypic.com/21mg1gn.png

अगर मैं सीआई के एक सादे उदाहरण करना aNew().c().build()

चाहते हैं मैं चाहता हूँ यह कायम किया जाना है मैं aNew().c().saveIn(session)

करते हैं मैं एक हैं:

इस मॉडल के बारे में सोचो एक ज्ञात बीआई के साथ सी का उदाहरण aNew().c().with(b).build()

ठीक है, आपको टी मिल गया वह विचार करता है। मेरी समस्या यह है कि, अगर मैं एक सी जारी रखना चाहता हूं, तो क्या यह बी को जारी रखना चाहिए? या इसे हाथ से पहले रखा जाना चाहिए? अगर मैं एक उचित डिफ़ॉल्ट बी चाहते हैं तो क्या होगा? अगर मैं डी को जारी रखना चाहता हूं तो क्या होगा? क्या यह सभी ए, बी, सी जारी रखना चाहिए?

बेशक वास्तविक प्रणाली अधिक जटिल है (कभी-कभी परिपत्र संदर्भों के साथ)। मैं जटिल परीक्षण डेटा जारी रखने के लिए एक सर्वोत्तम अभ्यास की तलाश में हूं।

संपादित करें: ऐसा लगता है कि मैंने भाषा बाधा में टक्कर लगी है, मेरी मां भाषा अंग्रेजी नहीं है, इसलिए मुझे अस्पष्टता के लिए खेद है।

  • यह विरासत कोड है कि मैं
  • परीक्षण करने के लिए मैं एक कवरेज परीक्षण, नहीं एक इकाई परीक्षण लिखने के लिए (एक परिणाम मैं कुछ भी मजाक नहीं किया जाएगा के रूप में) कोशिश कर रहा हूँ कोशिश कर रहा हूँ नहीं है: यहाँ और अधिक जानकारी है
  • सॉफ़्टवेयर का टुकड़ा मैं कुछ परीक्षणों के लिए पॉप्युलेट होने पर कामों का परीक्षण करने की कोशिश कर रहा हूं (यह सभी इकाइयों का उपयोग नहीं करता है)।

पीएस। कृपया अधिक जानकारी मांगने में संकोच न करें, क्योंकि मैं संभव सर्वोत्तम अभ्यास खोजने के लिए संघर्ष कर रहा हूं। मेरे साथ सबसे नज़दीकी चीज है:

  1. किसी इकाई के निर्माण के दौरान स्पष्ट रूप से सेट किए गए सेट का ट्रैक रखें।
  2. मान लीजिए कि स्पष्ट रूप से सेट इकाइयां पहले से ही बने रहती हैं, उन्हें जारी न रखें।
  3. बाकी सब कुछ जारी रखें (अपने स्वयं के उत्थान के साथ)।

यह काम करेगा, लेकिन मेरी मकड़ी की भावना झुकाव है, मुझे लगता है कि मैं कुछ गलत कर रहा हूं क्योंकि परीक्षण कोड में तर्क शामिल होगा, परीक्षणों के बिना निपटने के लिए यह बहुत जटिल होगा।

संपादित करें 2: मैं खुद को और अधिक स्पष्ट करने की कोशिश करूंगा। जब मैं अपनी इकाई लिख रहा/चला रहा हूं और कुछ एकीकरण परीक्षणों में मुझे कोई समस्या नहीं है, क्योंकि परीक्षण डेटा जारी नहीं है, यह स्मृति में रहता है।

लेकिन जब मैं अपने परीक्षण डेटा को जारी रखने की कोशिश करता हूं, तो हाइबरनेट मुझे इसके संबंधों के बिना एक इकाई को बचाने नहीं देगा।

मैं इस समस्या को कैसे दूर कर सकता हूं?

उत्तर

1

आप डोमेन बेहतर पर अपने झरने को परिभाषित करने की जरूरत है। यदि आप इसका परीक्षण नहीं कर सकते हैं, तो आप असली एप्लिकेशन में यह कैसे उम्मीद करेंगे?

उदाहरण के लिए:

A -> बी: इस रिश्ते के मालिक कौन है? क्या आप बी को ए, या दूसरी तरफ जोड़ना चाहते हैं? यह एक कार्यान्वयन विस्तार हो सकता है जहां आप बी। सैटपैरेंट (ए) और ए। चिल्ड्रेन दोनों शामिल कर सकते हैं। जोड़ें (बी), और जहां आप ए। चिल्ड्रेन के मामले में बी के माता-पिता को ए सेट करते हैं। जोड़ें (बी) (इसी तरह दूसरा निकलने का रास्ता)। यदि आप करते हैं तो क्या होता है:

A a1 = new A(); 
A a2 = new A(); 
B b = new B(); 
a1.Children.Add(b); 
b.SetParent(a); 

आपको अपना मन यहां बनाने की आवश्यकता है। समाधानों में से कोई भी सही नहीं है, इसलिए यह मूल रूप से व्यक्तिगत प्राथमिकता और ऐप स्थिरता है जो यहां लागू होती है।

ओआरएम के साथ काम करना आप सादे एसक्यूएल (या एक्सएमएल या अपने स्वयं के डेटासोर्स जैसे किसी भी अन्य डेटासोर्स) के साथ तेजी से इन बाधाओं की समस्याओं में आते हैं, लेकिन यदि आप सादे एसक्यूएल भी लिखना चाहते हैं तो आपको समस्याओं पर विचार करना होगा।

मुझे खेद है, मेरे पास आपके लिए कोई निश्चित जवाब नहीं है, लेकिन मेरे लिए ऐसा लगता है कि आपको कुछ बाधाओं पर विचार करने की आवश्यकता है (मुझे लगता है) आपने अभी तक नहीं किया है।

व्यक्तिगत रूप से, मुझे डीएएलएस में एनएचबीरनेट का उपयोग करते समय रिपोजिटरी-पैटर्न पसंद है। मैं अपने रिपॉजिटरीज को IDISposable से लागू करता हूं और उन्हें प्रत्येक सत्र प्राप्त करने देता हूं। इस तरह आपको अपने डिजाइन में "काम की इकाई" -पटलर मिलती है।

इसके साथ शुभकामनाएं :)

3

आपको शायद अपने परीक्षण सेटअप को अधिक विस्तार से वर्णित करना चाहिए।विशेष रूप से, क्यों क्या आपके कार्यात्मक परीक्षणों को इन वस्तुओं को जारी रखने की आवश्यकता है? क्या आप वास्तविक दृढ़ता संचालन का परीक्षण कर रहे हैं? या यह परीक्षण चलाने का सिर्फ एक दुष्प्रभाव है? क्या आप अपने परीक्षणों के हिस्से के रूप में लगातार वस्तुओं को लोड करना चाहते हैं?

मेरी समस्या यह है कि, यदि मैं एक सी जारी रखना चाहता हूं, तो क्या यह बी जारी रहेगा? या इसे हाथ से पहले रखा जाना चाहिए?

यह इस बात पर निर्भर करेगा कि आप पहले स्थान पर क्यों बने रहे हैं। यदि आप दृढ़ता परत का एकीकरण परीक्षण कर रहे हैं, तो आपको केवल उस तर्क का उपयोग करना चाहिए जो एप्लिकेशन स्वयं ही उपयोग करता है। यदि यह परीक्षण का एक दुष्प्रभाव है, तो आप दृढ़ता परत, आदि का नकल करना चाहेंगे ...

+0

कल्पना करें कि ये डेटा डीबी में पहले से मौजूद है। और एक और प्रक्रिया (जिसे मैं परीक्षण कर रहा हूं) इन आंकड़ों को पढ़ रहा है। लेकिन कभी-कभी बी बी प्रासंगिक होता है और मैं बीएस बनाने और बनाए रखने के दौरान इसे परीक्षण में दिखाना चाहता हूं; लेकिन कभी-कभी वे प्रासंगिक नहीं होते हैं और मैं उन्हें बिल्डरों के पीछे छिपाने की कोशिश कर रहा हूं। – nimcap

+0

यह मुझे समझ में नहीं आता है। यदि डेटा पहले ही डीबी में है, तो क्यों (और whan) आपको इसे जारी रखने की आवश्यकता है? और आपका क्या मतलब है "मैं इसे [बी] परीक्षण में दिखाना चाहता हूं" ?? – sleske

0
  • आपके परीक्षण आपको क्या बता रहे हैं?
  • यह आपके परीक्षण की विरासत एप्लिकेशन की तरह लगता है?
  • तो आपकी लेआउट कार्यक्षमता पहले से ही आपके कोड बेस में लिखी गई है और कवरेज टेस्ट बनाने की कोशिश कर रही है?

हमें कुछ और सुझाव दें कृपया

1

मैंने आपके उत्तरों को विषय के आधार पर अलग किया।

मेरे समस्या यह है, अगर मैं एक सी बनाए रखना चाहते हैं, यह दृढ़ रहना चाहिए यह बी है? अगर मैं डी को जारी रखना चाहता हूं तो क्या होगा? क्या यह सभी ए, बी, सी जारी रखना चाहिए?

यह पूरी तरह से डोमेन बाधाओं पर निर्भर है जिसे आप लागू करने के लिए चुनते हैं।उदाहरण के लिए, सी एक इकाई और बी एक मूल्य वस्तु है? दूसरे शब्दों में, सी की अपनी अनूठी पहचान और जीवन है? बी मुख्य रूप से इसके मूल्य और उसके जीवन चक्र द्वारा पहचाना जाता है जो इसके माता-पिता सी के साथ कसकर जोड़ता है?

इन प्रकार के प्रश्न पूछने से आपके निर्णय, कब और किसके द्वारा जारी रहना चाहिए, इस बारे में निर्णय लेने में मदद करनी चाहिए।

उदाहरण के लिए

, अगर दोनों सी और बी केवल एक रिश्ते को साझा करने संस्थाएं हैं, तो आप उन्हें स्वतंत्र रूप से लागू करने के लिए है, क्योंकि प्रत्येक क़यास एक सार्थक जीवन और अपनी खुद की पहचान हो सकती है तय कर सकते हैं। यदि बी एक मूल्य वस्तु है, तो आप शायद अपनी मूल इकाई सी ऑब्जेक्ट के निर्माण/पुनर्प्राप्ति/अद्यतन/हटाने सहित अपने जीवन को नियंत्रित करने का विकल्प चुनते हैं। यह बहुत अच्छी तरह से सीबी शामिल हो सकता है।

या इसे हाथ से पहले जारी रखा जाना चाहिए?

इसका उत्तर देने के लिए आपको अपनी ऑब्जेक्ट निर्भरताओं को मानचित्र बनाना होगा। आरडीबीएमएस को ऑब्जेक्ट ग्राफ़ जारी रखने पर इन निर्भरताओं को अक्सर विदेशी कुंजी बाधाओं द्वारा दर्शाया जाता है। सीबी के लिए एक संदर्भ के बिना कार्य नहीं कर सकता है, तो आप शायद बी डेटाबेस की विदेश कुंजी बाधाओं के साथ पालन करने के लिए पहले किया जा रहा है के साथ, एक सौदे के अंदर उन दोनों को बनाए रखना चाहते हैं। यदि बी एक बच्चे संस्था या सी का मूल्य वस्तु थी, ऊपर सोचा था की लाइन के बाद, आप भी सीबी बने के लिए जिम्मेदार हो सकता है।

अगर मुझे उचित डिफ़ॉल्ट बी चाहिए तो क्या होगा?

बी के निर्माण उदाहरणों बी फैक्टरी को प्रत्यायोजित किया जा सकता है। चाहे आप इस फैक्ट्री लॉजिक को कक्षा (उदाहरण नहीं) विधि, कन्स्ट्रक्टर के रूप में कार्यान्वित करते हैं, या इसे अपनी इकाई के रूप में अलग करते हैं, इससे कोई फर्क नहीं पड़ता। मुद्दा यह है कि आपके पास एक स्थान है जहां नए बी की सृजन और कॉन्फ़िगरेशन होता है। यह इस जगह पर है कि आपके पास नए तत्काल ऑब्जेक्ट की डिफ़ॉल्ट कॉन्फ़िगरेशन होगी।

सवालों के इन प्रकार को कवर एक उत्कृष्ट संसाधन एरिक इवांस द्वारा Domain-Driven Design है

+0

मैं यह तय नहीं कर सका कि कौन सा स्वीकार करना है, दूसरा कोई पहले आया था ... इसलिए मुझे खेद है, मेरी इच्छा है कि कई उत्तरों को स्वीकार करने का एक तरीका था – nimcap

1

मुझे यकीन है कि मैं इस समस्या समझ में आ आप उपयोग कर XML के रूप में पूरे ग्राफ serializing के बारे में बहुत अच्छी तरह से हल करने के लिए कोशिश कर रहे हैं लेकिन ... क्या नहीं कर रहा हूँ XStream या Google के Protocol Buffers जैसे कुछ?

+0

Google प्रोटोकॉल बफर पसंदीदा के रूप में जोड़ा गया –

0

जहां तक ​​मुझे लगता है कि समस्या यह है कि समस्या आपके डोमेन के साथ है (जैसा कि आपने इसे खींचा है)। जहां तक ​​मैं इसे अंडरस्टाफ करता हूं सी में बी से कई लोगों का रिश्ता होता है, और डेटाबेस इसे गैर-शून्य विदेशी क्षेत्र द्वारा enfocing कर रहा है।दूसरी ओर सवाल में कोड से मैं समझ सकता था कि कोड में बिल्कुल एक नियम का कोई प्रवर्तन नहीं है, और सदस्य जो सी उदाहरण में बी उदाहरण का संदर्भ देता है वह शून्य हो सकता है। जहां तक ​​मैं समझता हूं कि डोमेन मॉडल हमेशा कोड और रन-टाइम में सही होना चाहिए, इसलिए यदि यह नियम कोड में लागू किया गया था (उदाहरण के लिए सी बिल्ड() विधि में बी संदर्भ की मांग करके) आपके पास नहीं होगा दृढ़ता के साथ कोई समस्या - आप बस सभी को जारी रख सकते हैं।

अन्य, बहुत गंदे समाधान केवल सभी डीबी बाधाओं को प्रोग्रामेटिक रूप से छोड़ देंगे जो परीक्षण से पहले आपके परीक्षणों के साथ गड़बड़ करते हैं और बाद में उन्हें बहाल करते हैं। निस्संदेह यह डीबी को पूरी तरह से अनुपयोगी बनाता है जो कि परीक्षण के लिए पैरारल में चल रहा है, लेकिन इसे परीक्षण के लिए SQLite या SQL सर्वर कॉम्पैक्ट संस्करण जैसे इंटरैटेड डीबी का उपयोग करके हल किया जा सकता है।

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