C++ परीक्षणों में मॉक ऑब्जेक्ट और फिक्स्चर: बिना डर के कोड कैसे लिखें

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

परिचय: क्यों मॉक और फिक्स्चर के बिना परीक्षण लॉटरी की तरह हैं

\n\n

कल्पना करें कि आप अंतरिक्ष यान के लिए कोड लिख रहे हैं। आपका फंक्शन इंजन नियंत्रण मॉड्यूल से संपर्क करके प्रक्षेपवक्र की गणना करता है। वास्तविक इंजन चलाए बिना यह कैसे जांचें कि प्रक्षेपवक्र सही है? वास्तविक दुनिया में यह आपदा है। C++ की दुनिया में, यह mock-ऑब्जेक्ट और फिक्स्चर के लिए एक कार्य है।

\n\n

यदि आपने कभी C++ में यूनिट-टेस्ट लिखे हैं, तो आप निश्चित रूप से समस्याओं का सामना कर चुके हैं: नेटवर्क, डेटाबेस या फ़ाइल सिस्टम के कारण परीक्षण विफल हो जाता है। या आप प्रत्येक जांच के लिए डेटा तैयार करने में 10 लाइनें खर्च करते हैं। परिचित लगता है? तो यह लेख आपके लिए है।

\n\n

हम समझेंगे कि कैसे C++ में mock-ऑब्जेक्ट कोड को बाहरी दुनिया से अलग करने में मदद करते हैं, और फिक्स्चर परीक्षण सेटअप को पुन: उपयोग करने में मदद करते हैं। कोई बेकार बात नहीं, केवल कोड और अभ्यास। चलिए शुरू करते हैं!

\n\n

मॉक-ऑब्जेक्ट क्या हैं और C++ में इनकी आवश्यकता क्यों है

\n\n

मॉक-ऑब्जेक्ट (या बस मॉक) एक वास्तविक ऑब्जेक्ट का प्रतिस्थापन है जो उसके व्यवहार का अनुकरण करता है। आप मॉक से कहते हैं: "जब getData() मेथड कॉल किया जाए, तो 42 लौटाओ।" और वह आज्ञाकारी रूप से 42 लौटाता है, बिना डेटाबेस, API या फ़ाइल से संपर्क किए।

\n\n

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

\n\n

C++ में mock-ऑब्जेक्ट के मुख्य उपयोग के परिदृश्य:

\n
    \n
  • बाहरी सेवाएँ (डेटाबेस, REST API, फ़ाइलें)।
  • \n
  • जटिल गणनाएँ जो परीक्षणों को धीमा करती हैं (क्रिप्टोग्राफी, रेंडरिंग)।
  • \n
  • अनिर्धारित फंक्शन (rand(), time())।
  • \n
  • इंटरैक्शन की जाँच: क्या मेथड कॉल हुआ, कितनी बार, किन तर्कों के साथ।
  • \n
\n\n

C++ में मॉक बनाने के लिए डी-फैक्टो मानक Google Mock (जिसे gmock भी कहा जाता है) लाइब्रेरी है, जो Google Test के साथ आती है। लेकिन आप मैन्युअल रूप से भी मॉक लिख सकते हैं - छोटे प्रोजेक्ट के लिए यह और भी आसान है।

\n\n

फिक्स्चर: परीक्षण के लिए मंच तैयार करना

\n\n

फिक्स्चर (test fixture) ऑब्जेक्ट और डेटा का एक सेट है जो परीक्षण चलाने के लिए आवश्यक है। हर बार यह लिखने के बजाय:

\n\n
MyClass obj;\nobj.init("data");\nobj.connect();
\n\n

…आप इसे फिक्स्चर में डालते हैं। Google Test ::testing::Test से इनहेरिट करके फिक्स्चर का समर्थन करता है। यह केवल सुविधाजनक नहीं है - यह C++ परीक्षण की सर्वोत्तम प्रथा है।

\n\n

फिक्स्चर तीन कार्यों को हल करते हैं:

\n
    \n
  1. कोड का पुन: उपयोग - एक बार सेटअप करें, सभी परीक्षणों में उपयोग करें।
  2. \n
  3. परीक्षणों की शुद्धता - प्रत्येक परीक्षण एक समान स्थिति से शुरू होता है।
  4. \n
  5. स्वचालित सफाई - यदि संसाधनों को मुक्त करने की आवश्यकता है, तो यह फिक्स्चर के डिस्ट्रक्टर में किया जाता है।
  6. \n
\n\n

अब आइए एक उदाहरण में मॉक और फिक्स्चर को एक साथ जोड़ें।

\n\n

मॉक-ऑब्जेक्ट और फिक्स्चर के साथ परीक्षण लिखना: वास्तविक उदाहरण

\n\n

मान लीजिए हमारे पास एक क्लास WeatherReporter है जो API के माध्यम से मौसम डेटा प्राप्त करता है। हम वास्तविक सर्वर से संपर्क किए बिना getTemperature() मेथड का परीक्षण करना चाहते हैं।

\n\n

चरण 1. इंटरफ़ेस परिभाषित करना

\n\n

मॉक डालने के लिए, हमें एक एब्सट्रैक्ट क्लास चाहिए। यह महत्वपूर्ण बिंदु है: मॉक पॉलीमॉर्फिज़्म के माध्यम से काम करते हैं।

\n\n
// weather_api.h\nclass WeatherAPI {\npublic:\n    virtual ~WeatherAPI() = default;\n    virtual double getTemperature(const std::string& city) = 0;\n    virtual bool isAvailable() = 0;\n};
\n\n

चरण 2. Google Mock के साथ मॉक लागू करना

\n\n
// mock_weather_api.h\n#include <gmock/gmock.h>\n#include "weather_api.h"\n\nclass MockWeatherAPI : public WeatherAPI {\npublic:\n    MOCK_METHOD(double, getTemperature, (const std::string& city), (override));\n    MOCK_METHOD(bool, isAvailable, (), (override                

ब्लॉग

पुस्तक अनुशंसाएँ