मैं अपनी REST वेब सेवा का परीक्षण कैसे कर सकता / सकती हूं?


16

मैं इकाई परीक्षण के लिए नया हूँ, मेरे पास एक REST वेब विधि है जो बस DB को कॉल करती है और एक DTO को पॉप्युलेट करती है। छद्म कोड है

public object GetCustomer(int id)
{
  CustomerDTO objCust = //get from DB
  return objCust;
}

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

मुझे लगता है कि मुझे इन अवधारणाओं को समझने में कुछ याद आ रहा है।


5
आपके द्वारा पोस्ट किए गए कोड में, परीक्षण करने के लिए चीजें हैं: (1) क्या आप एक पैरामीटर के साथ एक इंट के साथ गेटकेंटर को कॉल कर सकते हैं। (२) क्या यह एक CustomerDTO वस्तु लौटाता है? (३) क्या वह वस्तु अपेक्षित रूप से DB से आबाद है। (४) क्या एक अपेक्षित व्यवहार तब होता है जब किसी ऐसे कस्टम के साथ कहा जाता है जो एक वैध ग्राहक के अनुरूप नहीं है? उसमे से किसी को भी अभी तक REST से कोई लेना देना नहीं है। जब आप उस कोड को लिखने के लिए तैयार होते हैं जो Restful अनुरोधों का जवाब देता है, तो आप इसके लिए परीक्षण लिखेंगे।
डेविडो

@ डेविड: "क्या वह वस्तु डीबी से अपेक्षित है।" निश्चित रूप से एक इकाई परीक्षण नहीं है (ओपी कोड के संबंध में)। यह एक एकीकरण परीक्षण है।
फ्लैटर

हाँ आप सही हैं। अगर मैं वापस जा सकता हूं और टिप्पणी को बदलने के लिए कह सकता हूं कि एकीकरण परीक्षण में आप डीबी घटक को सत्यापित करेंगे, और अन्यथा इसका मजाक उड़ाएंगे, मैं उस संपादन को बनाऊंगा, लेकिन टिप्पणियों के लिए संपादित विंडो 5 मिनट और टिप्पणी छह हो गई। बहुत साल पहले। :)
डेविड ओक्ट

जवाबों:


18

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

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

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

यदि आप प्रयोग करने के लिए अपना स्वयं का मॉक लिखना चाहते हैं, तो मान लें कि आपके पास निम्न CustomerRepositoryवर्ग है:

public class CustomerRepository {
 public CustomerDTO getCustomer(int id) {
   ...
 }
}

आप CustomerRepositoryनिम्न तरीके से अपने स्वयं के नकली और गंदे वर्ग को लिख सकते हैं :

public class MockedCustomerRepository extends CustomerRepository {
 public boolean bThrowDatabaseException;
 public boolean bReturnNull;
 public boolean bReturnCustomerWrongId;
 public boolean bReturnCustomerWithId;
 public CustomerDTO getCustomer(int id) {
  if(bThrowDatabaseException) { 
    throw new DatabaseException("xxx"); 
  } else if(bReturnNull) { 
    return null; 
  } else if(bReturnCustomerWrongId) { 
    throw new CustomerNotExistException(id);
  } else if(bReturnCustomerWithId) { 
    return new CustomerDTO(id); 
  }
 }
}

फिर, अपने परीक्षण के मामले में आप मूल रूप से अपने "मानक" उदाहरण को CustomerRepositoryएक नकली उदाहरण से बदलते हैं जो आपको विभिन्न परिणामों के लिए अपनी पद्धति का परीक्षण करने की अनुमति देगा getCustomer:

public class CustomerRestTest {
  public void testGetCustomer_databaseFailure() {
    MockedCustomerRepository dto = new MockedCustomerRepository();
    dto.bThrowDataBaseException = true;
    yRestClass rest = new MyRestClass();
    rest.dto = dto;
    rest.getCustomer(0);
    // depending on what you do in your getCustomer method, you should check if you catched the exception, or let it pass, etc.. Make your assertions here

  public void testGetCustomer_customerNotExist() {
    // etc.
  }
}

आम तौर पर, प्रत्येक परीक्षण विधि को केवल एक चीज का परीक्षण करना चाहिए, इससे आपके परीक्षणों को छोटा रखने और एक कार्य पर ध्यान केंद्रित करने में मदद मिलती है।

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

आशा है कि आपके REST विधि का परीक्षण करने में मदद करता है।


4
आमतौर पर आपके पास अपने डीटीओ वर्गों के भीतर तर्क नहीं होते हैं, विशेष रूप से कोई नहीं जो आपके डेटा भंडारण के साथ बातचीत करता है।
JustAnotherUserYouMayKnowOrNot

1
यह सिर्फ एक उदाहरण था, लेकिन आप बिल्कुल सही हैं। मैं उदाहरणों को बदलने जा रहा हूं ताकि वे सिद्धांत के अनुसार बेहतर हों।
जलयन्
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.