2010-09-13 15 views
24

PHPUnit के अपने मैनुअल के पास डेटाबेस परीक्षण के लिए सर्वोत्तम अभ्यास some as-yet-unwritten sections है जिसका शीर्षक "संचालन" और "डेटाबेस परीक्षण सर्वोत्तम अभ्यास" है।PHPUnit

PHPUnit के साथ डेटाबेस का परीक्षण करने के लिए सर्वोत्तम प्रथाएं क्या हैं, खासकर MySQL में?

+1

संभव डुप्लिकेट: // stackoverflow .com/प्रश्न/3560116/क्या-मानक-सर्वोत्तम-प्रथाओं के लिए-बनाने-इकाई-परीक्षण-कार्यक्षमता-उपयोग करने के लिए) – Gordon

+0

गॉर्डन, मैंने वास्तव में यह प्रश्न विशेष रूप से *** लिखा क्योंकि *** वहां उत्तर बहुत गहराई में नहीं लगते हैं, न ही डेटाबेस परीक्षण पर 'PHPUnit' अध्याय संदर्भित करता है। मैं इस पर और अधिक देखना चाहता हूं। –

+1

चीजों को स्पष्ट करने के लिए: आपके पास एक ज्ञात इनपुट के आधार पर डीबी पर कुछ क्वेरी (या क्वेरी) करने का कार्य है। यह परिणाम देगा और अब आप यह जांचना चाहते हैं कि क्या परिणाम आप उम्मीद करेंगे? यदि ऐसा है: तो एक ज्ञात राज्य से शुरू करें (जहां आप यह भी जानते हैं कि वास्तविक परिणाम क्या होना चाहिए) एक अच्छी शुरुआत होगी (और यही वह है जो वे सभी डुप्लिकेट प्रश्न में संदर्भित करते हैं)। बस इस ज्ञात राज्य को हर टेस्ट रन पर पुनर्स्थापित करें। – wimvds

उत्तर

9

जब मैं PHPUnit के साथ डेटाबेस परीक्षण कर रहा हूं, तो पहले सूट की शुरुआत में मेरा MySQL डंप लोड करता है जिसमें कोई भी जानकारी शामिल है जिसे मैं सभी परीक्षणों में सच मान रहा हूं। जब प्रत्येक परीक्षण शुरू होता है तो मैं setupDatabase विधि का उपयोग करता हूं। यह विधि उन तालिकाओं से सभी पंक्तियों को हटा देती है जिन्हें मैं जानता हूं, फिर यह एक फ्लैट एक्सएमएल डेटासेट लोड करता है जिसमें डेटा को सही रखने की आवश्यकता होती है। ऐसा करने के बाद मैं जो भी कोड परीक्षण कर रहा हूं उसे चलाता हूं। अंत में, मैं डेटाबेस से पंक्तियों का चयन करने के लिए सरल तरीकों का संग्रह उपयोग करता हूं ताकि मेरे द्वारा किए गए परिवर्तनों को सही तरीके से किया जा सके।

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

ज़ेंड फ्रेमवर्क में PHPUnit के लिए एक दिलचस्प लाइब्रेरी है जो एक फ्लैट XML डेटासेट में compare a database table पर परीक्षण की अनुमति देती है लेकिन मुझे अभी तक इसका उपयोग करने का मौका नहीं मिला है।

+0

डेटाबेस धीमेपन के लिए: एक और mysql सर्वर स्थापित करें और मेमोरी-बैकएंड माउंटपॉइंट (उदा। लिनक्स में tmpfs) में यह संपूर्ण डेटाफ़ोल्डर है। यह उल्लेखनीय रूप से डीबी निर्माण और संचालन को तेज करेगा। –

3

कुछ अव्यवस्थित विचार:

यह जुड़नार (के साथ या बिना डाटाबेस संरचना) के लिए अच्छा है, हर परीक्षण के स्टार्टअप() में db में लोड। यह यानी आ सकता है। JSON या XML फ़ाइलों से, प्रत्येक तालिका के लिए एक। यदि आप इसे GetNthFixture ($ sTable, $ nIndex) या countFixtures ($ sTable) जैसे कार्यों के साथ जोड़ते हैं, तो आप आसानी से अपने प्रश्नों का परीक्षण कर सकते हैं। इससे भी आगे, आप [LINQ] [1] का उपयोग कर सकते हैं ताकि डीबी & फिक्स्चर क्वेरी के बीच फिक्स्चर के सेट से अपेक्षाकृत परिणाम प्राप्त हो सकें। मुझे प्रारंभिक प्रोटोटाइप/विकासशील चरण में अनुकूलन करना बहुत आसान लगता है, जब डीबी संरचना अक्सर बदलती जा रही है। डीबी क्वेरी परिणाम के साथ सीधे LINQ क्वेरी परिणाम की तुलना करने के लिए दावे जोड़ना परीक्षणों को शुद्ध खुशी बनाता है;)

एक और संकेत: डीबी परीक्षण परीक्षण से पहले नहीं, प्रत्येक परीक्षण विधि से पहले पुनर्नवीनीकरण किया जाना चाहिए। आदर्श रूप से आपको आधार छोड़ना चाहिए और इसे फिक्स्चर के पूर्ण सेट से पुनर्निर्माण करना चाहिए।

और, यदि आप कर सकते हैं, तो विभिन्न डेटाबेस के साथ काम करने वाले परीक्षण करने का प्रयास करें (कुछ चीजें, निश्चित रूप से पोर्टेबल नहीं हैं, लेकिन बहुमत है)। Mysql/postgres/other_big_rdbm से कम से कम वर्गमीटर का उपयोग करें।

यदि आप ढांचे या अन्य जटिल प्रणाली का परीक्षण कर रहे हैं, तो आपको शायद डेटाबेस एक्सेस सिंगलॉन का नकल करना चाहिए। अगर कुछ हार्डकोडेड सामान को इतनी लचीला-ओम में गहरा दफनाया जाता है, तो यह दर्द हो सकता है, कहें, गर्दन।

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

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

दुखद व्यक्तिगत अनुभव से जाने वाली एक और अच्छी सलाह: हमेशा बहुत से अलग-अलग भाषाओं के साथ काम करते हुए, विशेष रूप से बहुत से अलग-अलग भाषाओं के साथ परीक्षण जोड़ें।ISO-8859-1 दुनिया बहुत छोटी है;)

[1]: http://phplinq.codeplex.com/ LINQ

[क्या का उपयोग कर कार्यक्षमता डेटाबेस के लिए इकाई परीक्षण बनाने के लिए मानक/सर्वोत्तम प्रथाओं रहे हैं?] (Http के