2011-09-13 12 views
8

मेरी वेबसाइट पर एक उन्नत खोज होगी। लोग वहां जा सकते हैं और एक एंटीटी (कार, उदाहरण के लिए) के बारे में खोज सकते हैं। मैंने कुछ परीक्षण किए हैं जो खोज पैरामीटर के आधार पर परिणामों की संख्या की जांच करते हैं। मुझे लगता है कि मुझे कौन से परीक्षण लिखना चाहिए, फिर मैं इसे लिखता हूं, फिर मैं परीक्षण डेटाबेस में डेटा जोड़ता हूं। लेकिन यहां मुद्दा आता है। जब मैं डेटाबेस में नए मान डालता हूं तो मेरे पुराने परीक्षण टूट जाते हैं। ऐसा इसलिए है क्योंकि मैं रिकॉर्ड्स की संख्या की जांच कर रहा हूं ...टीडीडी: एक खोज का परीक्षण कैसे करें?

<?php defined('SYSPATH') or die('No direct access allowed!'); 

class Search_Test extends PHPUnit_Extensions_Database_TestCase 
{ 
    /** 
    * @return PHPUnit_Extensions_Database_DB_IDatabaseConnection 
    */ 
    public function getConnection() 
    { 
     $pdo = new PDO('mysql:dbname=db_test;host=127.0.0.1', 'root', null); 
     return $this->createDefaultDBConnection($pdo, 'db_test'); 
    } 

    /** 
    * @return PHPUnit_Extensions_Database_DataSet_IDataSet 
    */ 
    public function getDataSet() 
    { 
     $fixture = realpath(dirname(__FILE__).'/../data/fixture.xml'); 
     return $this->createXMLDataSet($fixture); 
    } 

    public function numberOfResultsDataProvider() 
    { 
     return array(
      array(1, null, null, 1), 
      array(2, null, null, 3), 
      array(3, null, null, 0), 
      array('abc', null, null, 5), 
      array(null, 1996, 2003, 3), 
      array(null, 1996, 1999, 2), 
      array(null, 2002, 2003, 1), 
      array(null, 1500, 1800, 0), 
      array(null, 2003, 2003, 1), 
      array(null, null, 2005, 4), 
      array(null, 1996, null, 4), 
      array(null, null, null, 4), 
      array(null, 2003, 1996, 0), 
      array(null, 'abc', 2003, 4), 
      array(null, '1996', '1999', 2), 
      array(2, 2003, 2005, 2), 
      array(null, null, null, 4), 
     ); 
    } 

    /** 
    * @dataProvider numberOfResultsDataProvider 
    */ 
    public function testNumberOfResults($brandId, $startYear, 
     $endYear, $numberOfResults 
    ) { 
     $search = ORM::factory('search'); 
     $search->setBrand($brandId) 
      ->setYearRange($startYear, $endYear); 
     $results = $search->results(); 
     $this->assertEquals($results->count(), $numberOfResults); 
    } 
} 
?> 

क्या यह सामान्य है? जब मैं नए परीक्षण करता हूं तो क्या मेरे पुराने परीक्षण तोड़ने चाहिए?

क्या मेरे परीक्षण डेटा से बाध्य होना चाहिए?

मेरी खोज में बहुत से पैरामीटर हैं और इन्हें एक ही रूप (दृश्य) में उपयोग किया जाएगा। क्या मुझे प्रत्येक पैरामीटर के लिए खोज परीक्षण करना चाहिए या क्या मुझे एक साथ परीक्षण करना चाहिए? क्या मुझे इसे अधिक परीक्षण कक्षाओं में विभाजित करना चाहिए?

धन्यवाद।

+1

अच्छा सवाल है, लेकिन शायद यह http://programmers.stackexchange.com के लिए बेहतर होगा। – Maxpm

उत्तर

6

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

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

0

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

यह निश्चित रूप से आपके परीक्षण धीमा कर देगा - इसलिए डेटा एक्सेस लेयर को मॉक करें।

+0

यह एक उन्नत खोज है और उपयोगकर्ता कई अलग-अलग पैरामीटर सेट कर सकते हैं। मुझे लगता है कि हर पथ का परीक्षण करना असंभव है लेकिन शायद कुछ परीक्षणों के साथ मुझे बहुत सारे डेटा फिक्स्चर सेट करना होगा ... क्या यह सामान्य है? क्या मुझसे कुछ गलत हो रही है? धन्यवाद। – thom

1

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

0

मेरे पास प्रत्येक टेस्ट विधि अपना डेटा बनायेगी, फिर दृढ़ करें, जोर देगी, और उसके बाद अपना नमूना डेटा नष्ट कर देगी।

मैं आमतौर पर एक साझा addData() विधि, और उसके बाद डेटाबेस क्लीनअप विधि रखूंगा। उम्मीद है कि आप अपने अतिरिक्त डेटा को किसी भी तरह से पहचानने में सक्षम होंगे ताकि आपकी सफाई विधि सामान्य हो। आपके उदाहरण में, हो सकता है कि आप अपने सभी ब्रांड आईडी की शुरुआत "test-" से शुरू कर सकें, और फिर आपकी क्वेरी उन सभी रिकॉर्ड्स को खोज और हटा देगी जहां ब्रांड 'test-%' की तरह है।

1

संक्षेप में:
एक जीवित डेटाबेस

पर ऐसा करने का कोई रास्ता नहीं आप परीक्षण के लिए एक अलग डेटाबेस की जरूरत है। यह वास्तव में डेटाबेस का एक नकली हो सकता है।

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

फिर, सबसे अच्छा विकल्प डेटाबेस लेनदेन शुरू जब आप मूल डेटाबेस राज्य में कोई भी बदलाव करने के लिए योजना है।

लेनदेन शुरू होने के बाद, आप डेटाबेस पर काम कर सकते हैं।

परीक्षण पूरा करने के बाद, आप केवल रोलबैक लेनदेन, और स्वच्छ स्थिति में डेटाबेस है।

एसक्लाइट (पहले से उल्लिखित) ज्यादातर मामलों में ठीक काम करेगा, लेकिन यह लाइव डेटाबेस से भिन्न हो सकता है। वैसे भी, अलग डेटाबेस एडेप्टर बहुत उपयोगी होगा।

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