C++ में परीक्षण: Unit, Integration, E2E शुरू से अंत तक

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

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

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

परिचय: C++ में परीक्षण क्यों विलासिता नहीं, बल्कि आवश्यकता है



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



परीक्षण यह सुनिश्चित करने का एकमात्र विश्वसनीय तरीका है कि आपका C++ कोड अपेक्षित रूप से काम करता है। इस लेख में, हम छोटे unit-परीक्षणों से लेकर पूर्ण end-to-end (E2E) जांच तक का सफर तय करेंगे। आप सीखेंगे कि परीक्षण रणनीति को सही तरीके से कैसे बनाया जाए, किन उपकरणों का उपयोग किया जाए, और ऐसे परीक्षण कैसे लिखे जाएं जो वास्तव में लाभदायक हों।



हम परीक्षण पिरामिड के तीन स्तरों पर विचार करेंगे: unit (मॉड्यूलर), integration (एकीकरण), और e2e (एंड-टू-एंड)। इनमें से प्रत्येक अपनी समस्या का समाधान करता है, और केवल इनका संयोजन ही प्रोग्राम की विश्वसनीयता में पूर्ण आत्मविश्वास देता है।



Unit-परीक्षण: गुणवत्ता की नींव



Unit-परीक्षण सबसे निचला और सबसे तेज़ स्तर है। ये बाहरी निर्भरताओं (डेटाबेस, फ़ाइल सिस्टम, नेटवर्क) से अलग करके अलग-अलग फ़ंक्शन, क्लास या मेथड की जांच करते हैं। मुख्य उद्देश्य यह सुनिश्चित करना है कि कोड की प्रत्येक तार्किक इकाई सही ढंग से काम करे।



C++ के लिए फ्रेमवर्क का चयन



C++ इकोसिस्टम में unit-परीक्षण के लिए कई लोकप्रिय फ्रेमवर्क हैं:



  • Google Test (gtest) — Google का सबसे आम फ्रेमवर्क। यह assertion, फिक्स्चर, पैरामीटराइज़्ड टेस्ट और मॉक (Google Mock के माध्यम से) का समर्थन करता है।
  • Catch2 — उत्कृष्ट सिंटैक्स वाला हल्का और आधुनिक फ्रेमवर्क। तेज़ प्रोटोटाइपिंग के लिए विशेष रूप से अच्छा है।
  • Boost.Test — Boost लाइब्रेरी का हिस्सा। शक्तिशाली लेकिन अधिक भारी।


उदाहरण के लिए हम Google Test का उपयोग करेंगे, क्योंकि यह कई C++ प्रोजेक्ट्स में डी-फैक्टो मानक है।



C++ में unit-परीक्षण का उदाहरण



मान लीजिए, हमारे पास फैक्टोरियल की गणना के लिए एक सरल फ़ंक्शन है:



// math_utils.h#ifndef MATH_UTILS_H#define MATH_UTILS_H

long long factorial(int n);

#endif

// math_utils.cpp#include "math_utils.h"

long long factorial(int n) { if (n < 0) throw std::invalid_argument("Negative input"); if (n == 0) return 1; long long result = 1; for (int i = 1; i <= n; ++i) { result *= i; } return result;}


अब Google Test का उपयोग करके unit-परीक्षण लिखते हैं:



// test_math_utils.cpp#include <gtest/gtest.h>#include "math_utils.h"

TEST(FactorialTest, HandlesZeroInput) { EXPECT_EQ(factorial(0), 1);}

TEST(FactorialTest, HandlesPositiveInput) { EXPECT_EQ(factorial(1), 1); EXPECT_EQ(factorial(5), 120); EXPECT_EQ(factorial(10), 3628800);}

TEST(FactorialTest, ThrowsOnNegative) { EXPECT_THROW(factorial(-1), std::invalid_argument);}


यह परीक्षण तीन परिदृश्यों की जांच करता है: सीमा मामला (0), सामान्य कार्य, और त्रुटि प्रबंधन। EXPECT_EQ और EXPECT_THROW मैक्रोज़ पर ध्यान दें — ये त्रुटि होने पर परीक्षण को नहीं रोकते, बल्कि केवल इसे रिकॉर्ड करते हैं।



अलगाव के लिए Mock-ऑब्जेक्ट



Unit-परीक्षण के लिए परीक्षण किए जा रहे कोड को बाहरी निर्भरताओं से अलग करना महत्वपूर्ण है। इसके लिए mock-ऑब्जेक्ट का उपयोग किया जाता है। Google Mock (Google Test का हिस्सा) आसानी से स्टब बनाने की अनुमति देता है:



// database_connector.hclass DatabaseConnector {public:    virtual ~DatabaseConnector() = default;    virtual bool connect(const std::string& url) = 0;    virtual std::vector<int> fetchData() = 0;};

// user_service.cppclass UserService { DatabaseConnector& db;public: UserService(DatabaseConnector& db) : db(db) {} int ge

ब्लॉग

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