2011-08-23 9 views
40

मेरे पास एक PHPUnit परीक्षण केस क्लास है (कुछ परीक्षण फ़ंक्शंस शामिल हैं)। मैं कक्षा में अपने सभी परीक्षणों के लिए एक बार कॉल करने के लिए oneTimeSetUp() फ़ंक्शन लिखना चाहता हूं (मानक setUp() फ़ंक्शन के विपरीत जिसे कक्षा में प्रत्येक परीक्षण के लिए एक बार कहा जाता है)। दूसरे शब्दों में, मैं JUnit @BeforeClass annotation के समतुल्य PHPUnit की तलाश में हूं।PHPUnit: मैं अपने सभी परीक्षणों के लिए एक बार कॉल करने के लिए एक फ़ंक्शन कैसे बना सकता हूं?

oneTimeTearDown() फ़ंक्शन के साथ समान प्रश्न।

क्या PHPUnit में ऐसा करना संभव है?

+0

मैं प्रदर्शन के लिए कभी-कभी ऐसा करने की आवश्यकता को पूरी तरह से समझता हूं। यदि संभव हो तो इससे बचने की अनुशंसा की जाती है ताकि आप परीक्षणों के बीच राज्य साझा नहीं कर रहे हों। –

+2

@ ग्रेग: मैं सहमत हूं। फिर भी, ऐसी स्थितियां हैं जहां सभी परीक्षणों के लिए एक बार आरंभ करना बेहतर होता है (उदाहरण के लिए डीबी से कनेक्शन स्थापित करना)। – snakile

+0

मैं अपने डेटामैपर में ज़ेंड_Db/PDO एडाप्टर को मजाक कर एक डीबी सर्वर की आवश्यकता से बचने की कोशिश करता हूं, फिर मैं अपने वर्गों के एसक्यूएल पर एसक्यूएल पर दावा करता हूं। मैं कभी-कभी कार्यात्मक/अंत-टू-एंड परीक्षणों के लिए अपरिहार्य की सराहना करता हूं। –

उत्तर

59

PHPUnit दस्तावेज़ों के section 6 से setUpBeforeClass() पर एक नज़र डालें।

एक बार आंसू के लिए आपको tearDownAfterClass(); का उपयोग करना चाहिए।

दोनों विधियों को आपकी कक्षा में स्थैतिक तरीकों के रूप में परिभाषित किया जाना चाहिए।

+2

मैं वही चीज़ लिखने वाला था ...आपका उत्तर उत्तर है – Fabio

+5

क्या कोई गैर-स्थैतिक विकल्प है? – Martijn

+0

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

3

मैं एक ही प्रश्न के साथ इस पृष्ठ पर आया, हालांकि स्वीकार्य उत्तर सभी वर्गों पर चलाया गया है, और मेरे लिए सही जवाब नहीं था।

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

माइग्रेशन में कुछ समय लगता है, इसलिए मैं नहीं चाहता कि यह सभी परीक्षणों पर चलता है।

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

तो, मैंने जो किया वह सुपर आसान है, लेकिन इंटरनेट पर बहुत अच्छी तरह से समझाया नहीं गया है। मैंने डेटाबेस सेटअप करने के लिए एक सरल परीक्षण बनाया। फिर अपने phpspec.xml फ़ाइल में एक testsuite जोड़ें ....

<testsuite name="Products"> 
    <file>tests/in/SystemSetupTest.php</file> 
    <file>tests/in/ProductTest.php</file> 
    <file>tests/in/ProductImportTest.php</file> 
</testsuite> 

और SystemSetupTest.php में ....

class SystemSetupTest extends ApiTester 
{ 

    /** @test */ 
    function system_init() 
    { 
     fwrite(STDOUT, __METHOD__ . "\n"); 
     self::createEM(); //this has all the code to init the system... 
    } 
} 

फिर इसे पसंद निष्पादित करें:

PHPUnit - -स्टेस्टाइट उत्पाद

अंत में, यह एक टन आसान है। यह मुझे अपने सिस्टम को सही तरीके से बनाने की अनुमति देगा।

इसके अतिरिक्त मैं लार्वेल का उपयोग कर रहा हूं 5. setUpBeforeClass() का उपयोग करते समय मैं बूटस्ट्रैप समस्याओं के साथ समाप्त होता हूं, जो मुझे यकीन है कि मैं ठीक कर सकता हूं, लेकिन ऊपर दी गई विधि सही काम करती है।

+0

इस तरह के रन परीक्षण से बेहतर: './artisan migrate --datebase CONNECTION_NAME &&।/विक्रेता/bin/phpunit'। यदि आप अपने खोल के कमांड इतिहास का उपयोग करते हैं तो कोई बड़ा सौदा नहीं है। –

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