2012-08-10 11 views
6

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

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

मुझे इन कार्यों के लिए यूनिट परीक्षण कैसे लिखना चाहिए? एक फ़ंक्शन (नीचे दिखाया गया) AJAX के माध्यम से इसे भेजे गए $ _GET डेटा को पकड़ता है और डेटाबेस में कुछ पंक्तियां डालता है। इसमें कोई भी सेटर्स, गेटर्स, या कुछ भी मायने रखता नहीं है और यह कक्षा नहीं है। क्या इसमें यूनिट टेस्ट भी होना चाहिए?

इन कार्यों के लिए लिखने वाले यूनिट परीक्षण का एक उदाहरण वास्तव में कमाल होगा! :)

/** 
* Create new Set and add item to it 
* @return void 
*/ 
public function action_create_set() { 
    // Get data from user 
    $user_id = Input::get('user_id'); 
    $post_id = Input::get('post_id'); 
    $set_name = Input::get('set_name'); 

    // Create new set 
    $data = array(
     'user_id' => $user_id, 
     'name' => $set_name 
    ); 
    $set_id = DB::table('sets')->insert_get_id($data); 

    // Add item to newly created set 
    DB::query("INSERT IGNORE INTO posts_sets (post_id, set_id, user_id) 
     VALUES ($post_id, $set_id, $user_id)"); 

    // Change `created_at` & `updated_at` col of 'sets' 
    $data = array(
     'created_at' => DB::raw('NOW()'), 
     'updated_at' => DB::raw('NOW()') 
     ); 
    DB::table('sets') 
     ->where('id', '=', $set_id) 
     ->update($data); 
} 

यह पहली समारोह के लिए, मेरे धारणा है कि एक परीक्षण है कि उन 3 वैरिएबल नहीं $user_id, $post_id, $set_name डेटा शामिल होने की जांच करने के लिए लिखा जा सकता है। मुझे लगता है कि जांच करने के लिए एक परीक्षण होना चाहिए कि 2 insert प्रश्न काम करते हैं, लेकिन मुझे यह भी लगता है कि पंक्तियों को सम्मिलित करने वाले फ़ंक्शंस PHP ढांचे द्वारा प्रदान किए जाते हैं और पहले ही पूरी तरह से परीक्षण किए जा चुके हैं ताकि आगे इकाई परीक्षण की आवश्यकता न हो।

एक और अनुमान है कि परीक्षण को फ़ंक्शन में 3 चर प्रदान करना चाहिए, फिर जांच करें कि नई पंक्तियों को 2 तालिकाओं में डाला गया है, लेकिन क्या इसे एकीकरण परीक्षण नहीं माना जाएगा?


यहां एक ऐसा फ़ंक्शन है जो उपयोगकर्ता से AJAX के माध्यम से इनपुट लेता है, फिर परिणाम जेएसओएन प्रारूप में देता है। क्या PHPUnit इस तरह के एपीआई कार्यों को संभाल लेना चाहिए? या क्लाइंटसाइड पर इकाई परीक्षण किया जाना चाहिए?

/** 
* Get items Liked by user 
* @return array 
*/ 
public function action_likes() { 

    $user_id = Input::get('user_id'); 

    $likes = DB::table('likes') 
       ->join('posts', 'posts.id', '=', 'likes.post_id') 
       ->where('likes.user_id', '=', $user_id) 
       ->get(); 

    return json_encode($likes); 

} 

उत्तर

4

सबसे पहले, आपको परीक्षण करने के लिए "यूनिट" बनाना चाहिए।

आपका वर्तमान कार्यान्वयन सब कुछ एक समारोह में डालता है। इस तरह के कोड का परीक्षण करना मुश्किल है।

सबसे पहले, मैं इसे 3 भागों में विभाजित करने की अनुशंसा करता हूं।

पहली भाग प्रक्रिया $_GET और एक आंतरिक अभिव्यक्ति लिखें। फिर दूसरा भाग डेटाबेस में सहेजता है। अंत में, तीसरा हिस्सा डेटाबेस में ऑब्जेक्ट प्राप्त करता है, और प्रतिक्रिया प्रस्तुत करता है।

यदि आप इसे विभाजित करते हैं, तो दूसरा और त्रिज्या कार्य टेस्टेबल बन जाएगा।

यह बहुत ही मूर्ख है, लेकिन शायद आपके पहले चरण के रूप में लायक है। यदि आप रुचि रखते हैं, तो कृपया एमवीसी की खोज करें।

1

एक अन्य अनुमान परीक्षण, कार्य करने के लिए 3 चर प्रदान करना चाहिए तो जाँच नई पंक्तियाँ 2 टेबल में डाला गया है या नहीं, लेकिन यह एक एकीकरण परीक्षण पर विचार किया जा wouldnt है?

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

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

क्या यह इकाई परीक्षण है? खैर, कोई तर्क दे सकता है कि उत्तर नहीं है क्योंकि यह फ़ंक्शन "बहुत अधिक" चीजें करता है (HTTP अनुरोध से डेटा को बदलना, डेटाबेस कॉल करना और यदि आप नकली http अनुरोध करके इसका परीक्षण करते हैं तो इसमें आम तौर पर आपका संपूर्ण http हैंडलिंग स्टैक शामिल होता है)।

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

मैं व्यक्तिगत रूप से बाद वाले को पसंद करता हूं लेकिन दिन के अंत में यह वास्तव में बहुत मायने रखता नहीं है।

यहाँ एक समारोह है कि AJAX के माध्यम से एक उपयोगकर्ता से इनपुट लेता है, तो JSON प्रारूप में परिणाम देता है। क्या PHPUnit इस तरह के एपीआई कार्यों को संभाल लेना चाहिए? या क्लाइंटसाइड पर इकाई परीक्षण किया जाना चाहिए?

यह स्थिति पर निर्भर करता है। परीक्षण स्वचालन शुद्धियों के दृष्टिकोण से दोनों तरफ परीक्षण करने के लिए सही समाधान होगा।

सर्वर साइड परीक्षण का वर्णन और परीक्षण कैसे विभिन्न स्थितियों में अपने action_likes समारोह व्यवहार करना चाहिए:

  • यह खाली सेट वापसी करता है जब कोई डेटा उपलब्ध नहीं है?
  • क्या होता है यदि उपयोगकर्ता_आईडी अनुपस्थित है या गलत प्रारूप में है?
  • एक विशिष्ट परिदृश्य में क्या लौटाया जाता है?

इनमें से प्रत्येक परीक्षण डेटाबेस में कुछ प्रीसेट डेटा से शुरू होना चाहिए और जेएसओएन की सामग्री की जांच करनी चाहिए। इस तरह आप अपने सर्वर एपीआई परत का परीक्षण कर रहे हैं।

लेकिन क्लाइंट साइड कोड का परीक्षण भी समझ में आता है। अक्सर अजाक्स कॉल से डेटा प्राप्त करने से पहले कुछ साइड इफेक्ट्स होने चाहिए।

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

इस तरह के परीक्षणों में आप वास्तविक सर्वर से बातचीत नहीं कर रहे हैं लेकिन आप इस उद्देश्य के लिए डिजाइन किए गए जेएस पुस्तकालयों का उपयोग करके AJAX अनुरोधों और प्रतिक्रियाओं का मज़ाक उड़ा रहे हैं। उनमें से कई हैं। मेरी वर्तमान प्राथमिकताओं में buster.js शामिल है जो मुझे निरंतर एकीकरण वातावरण में उपयोग करने के लिए भी बहुत अच्छा लगता है।

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