काम पर हमने पाया है कि हमारे टेस्ट सूट को इस बिंदु पर मिला है कि बार-बार दौड़ना बहुत धीमा है, जिसे मैं वास्तव में पसंद नहीं करता। यह पूरे सूट पर कम से कम 5 मिनट और बैक-एंड डेटा ऑब्जेक्ट परीक्षणों के लिए 3 मिनट से अधिक है। इसलिए, मैं यह जानकर उत्सुक हूं कि लोग अपना परीक्षण कैसे करते हैं।आप परीक्षण अनुप्रयोगों को कैसे संभालते हैं जो डेटाबेस पर भारी निर्भर हैं?
फिलहाल, हमारे पास एक लाइव स्कीमा और _test स्कीमा वाला एक डेटाबेस डेटाबेस है। जब कोई परीक्षण चलता है, तो यह पहले एक SQL स्क्रिप्ट चलाता है जो कहता है कि टेस्ट डेटाबेस को कैसे पॉप्युलेट करना है (और किसी पुराने डेटा को साफ़ करना है)। यह लगभग सभी परीक्षणों के लिए होता है। जो मैं देख सकता हूं, यह हमारे परीक्षणों में सबसे बड़ी बाधा है - मैंने अभी एक परीक्षण का प्रोफाइल किया है और डेटाबेस को सेटअप करने में लगभग 800ms लगते हैं, और फिर प्रत्येक बाद का परीक्षण लगभग 10ms में चलता है।
मैं कुछ समाधान पता लगाने के लिए कोशिश कर रहा है, और यहाँ है मैं अब तक क्या पाया है:
परीक्षण स्कीमा एक बार आबादी है, और प्रत्येक परीक्षा के अंत में परिवर्तन रोलबैक।
यह सबसे आसान समाधान प्रतीत होता है, लेकिन इसका मतलब यह है कि हमें रोलबैक (यानी, त्रुटि प्रबंधन परीक्षण) पर निर्भर चीजों का परीक्षण करने के लिए कुछ विशेष केस सामान जोड़ना होगा।
नकली डेटाबेस जहां संभव
हम सेटअप डेटा ऑब्जेक्ट के लिए डेटाबेस परीक्षण किया जा रहा है, लेकिन नकली कुछ भी होगा उस पर निर्भर करता है। मेरे लिए, यह 2 कारणों से शानदार नहीं लगता है। सबसे पहले, जब हम डेटाबेस सेट अप करते हैं, तो हम अभी भी (आमतौर पर) विदेशी-कुंजी निर्भरताओं के कारण अधिक पंक्तियों के साथ समाप्त होते हैं। और दूसरी बात, अधिकांश डेटा ऑब्जेक्ट मॉडल वास्तव में अन्य लोगों के साथ बातचीत नहीं करते हैं, वे सिर्फ जॉइन करते हैं।
एक ही सिस्टम चलाने के लिए, लेकिन डंप और RAMFS
एक बड़ा SQL क्वेरी हम बजाय एक डेटाबेस डंप लोड होता चल रहा है के बजाय का उपयोग करें। परीक्षण सर्वर एक RAMFS विभाजन पर चलाएगा, और उम्मीद है कि कुछ गति लाभ लाएगा।
मैं इसका परीक्षण नहीं कर सकता क्योंकि यद्यपि मैं ओएसएक्स पर हूं और जो कुछ मैं देख सकता हूं, वहां ramfs समर्थन नहीं है।
आसपास SQLite का उपयोग कर की तरह कुछ अन्य विकल्प हैं, लेकिन इस के रूप में हम कुछ PostgreSQL विशिष्ट एक्सटेंशन पर निर्भर करते हैं हमारे लिए एक विकल्प नहीं है।
हल्प! :)
परीक्षण पर आने पर "भारी निर्भर" हमेशा एक बुरा शब्द होता है। चीजों पर अपने ऐप को भारी रूप से निर्भर न करें, और अचानक यह अधिक विश्वसनीय * और * परीक्षण करने में आसान हो जाता है।केवल डेटाबेस अबास्ट्रक्शन परत को वास्तविक डेटाबेस के खिलाफ परीक्षण की आवश्यकता होनी चाहिए; आपके बाकी ऐप को नकली अमूर्त परत के खिलाफ परीक्षण किया जा सकता है। – jrockway