2011-01-03 20 views
10

मैं PHPunit का उपयोग कर यूनिट परीक्षण पर थोड़ा ध्यान केंद्रित करने की कोशिश कर रहा हूं।डेटाबेस के साथ Phpunit परीक्षण

मैं यहाँ http://blog.nickbelhomme.com/php/phpunit-training-course-for-free_282

से अधिक एक बहुत अच्छा ट्यूटोरियल पाया है लेकिन वहाँ कुछ मैं याद आती है और अभी तक कैसे करना है समझ में नहीं आता है।

मेरे पास एक उपयोगकर्ता मॉड्यूल है जो उपयोगकर्ताओं के बारे में सभी जानकारी रखता है। और एक फ़ंक्शन सहेजता है जो उपयोगकर्ता को डेटाबेस में सहेजता है। तो मेरे पास एक परीक्षण है

public function testCanCreateUser() 
{ 
    $userData = array(
     'userName' => 'User1', 
     'firstName' => 'Joey', 
     'lastName' => 'Hendricks', 
     'email'  => '[email protected]', 
     'password' => 'f$tfe8F' 

    ); 
    $user = new Model_User($userData); 
    $user->save(); 

} 

पहली बार जब मैं अपना परीक्षण इस काम को चलाऊंगा। चूंकि डेटाबेस खाली है। लेकिन जब मैं दूसरी बार अपने परीक्षण चलाता हूं तो यह काम नहीं करेगा क्योंकि मेरा सिस्टम उसी उपयोगकर्ता को डीबी में दो बार अनुमति नहीं देता है। तो ऐसा करने के लिए मुझे अपने परीक्षण चलाने से पहले हर बार अपना टेस्टडेटाबेस फिर से बनाना होगा। इसे करने का बेहतरीन तरीका क्या है? या इस समस्या को हल करने के लिए एक अलग तरीके से हल किया जा रहा है?

टीएनएक्स।

उत्तर

21

आप अपने व्यापार के तर्क परीक्षण करना चाहते हैं: आप वर्ग कि एसक्यूएल बयान आग (परीक्षण करना चाहते हैं नकली दूर डाटाबेस वर्ग नकली डेटा

और लौटने और imho आप कर सकते थे परीक्षण वह भी मेरी कोड बैकएंड में एक असली db के साथ ठीक काम करता है, तो के बाद से मैं थोड़े पता करना चाहते हैं) यह थोड़ा जटिल हो जाता है लेकिन वहाँ यह करने के लिए तरीके हैं:

  • सेटअप का उपयोग () और tearDown() अपने परीक्षण चलाने से पहले डेटा के लिए एक सतत स्थिति प्राप्त करने के लिए (imho) डीबी संचालित संचालित unittests लिखने के लिए एक बढ़िया तरीका है। हालांकि हाथ से बहुत से कस्टम एसक्यूएल लिखने के लिए परेशान हो सकता है।

  • अपने लाइव को एक लाइट आसान बनाने के लिए आप DbUnit extension पर देख सकते हैं और देख सकते हैं कि यह आपके एप्लिकेशन के लिए काम करता है या नहीं।

  • आप वास्तव में Unittesting डेटाबेस बातचीत में इस विषय पर सबसे अच्छा पढ़ने गोता लगाने के लिए चाहते हैं (imho) Sebastian Bergmanns phpqa book में db-unittesting पर अध्याय है।

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

+2

बस सोच रहा है कि आप कैसे जानते हैं कि सेबसशन Bergmanns पुस्तक में एक अच्छा लेख है, जबकि यह अभी तक बाहर नहीं है। लेकिन यह एक जटिल बात रहता है। – sanders

7

setUp() या tearDown() विधियों में खाली और/या साफ़ किए गए डेटाबेस की दूसरी प्रति के साथ परीक्षण चलाएं, लेकिन सावधान रहें कि github did क्या नहीं है।

आप एक अच्छे डेटाबेस उपयोग कर रहे हैं (यानी MyISAM तालिकाओं के साथ MySQL नहीं) यदि आप एक सौदे में परीक्षण लपेट और इसे वापस रोल परीक्षण के बाद कर सकते हैं:

function setUp() { $this->db->exec("BEGIN"); } 
function tearDown() { $this->db->exec("ROLLBACK"); } 

नकारात्मक पक्ष यह है कि आप नहीं कर सकते है टेस्ट कोड जो लेन-देन का उपयोग करता है (जब तक कि आप उस सार को जोड़ते हैं और अनुकरण करते हैं, लेकिन यह iffy है)।

आदर्श रूप में आप नकली डेटाबेस वर्ग पर निर्भरता इंजेक्शन और चलाने के परीक्षण का उपयोग करना चाहिए:

$fakedb = new DatabaseThatDoesntReallySaveThings(); 
$user = new Model_User($fakedb, $userData); 
$user->save(); 
$this->assertTrue($fakedb->wasAskedToSaveUser()); 
2

मुझे लगता है कि आप tearDown() विधि का उपयोग अपने सहेजे गए डेटा को साफ करने के लिए कर सकते हैं।

protected $_user; 

public function testCanCreateUser() 
{ 
    ... 

    $this->_user = new Model_User($userData); 
    $this->_user->save(); 
} 

public function tearDown() 
{ 
    $this->_user->delete(); 
} 
संबंधित मुद्दे