परिचय: C++ परीक्षण विश्वसनीय कोड का आधार क्यों है
\nC++ में विकास हमेशा उच्च जिम्मेदारी के साथ काम करना है। भाषा मेमोरी और प्रदर्शन पर पूर्ण नियंत्रण प्रदान करती है, लेकिन त्रुटि की कीमत विनाशकारी हो सकती है: मेमोरी लीक से लेकर पूरे सिस्टम के क्रैश होने तक। यही कारण है कि C++ में परीक्षण कोई विकल्प नहीं, बल्कि किसी भी गंभीर प्रोजेक्ट के विकास का एक अनिवार्य चरण है।
\nइस लेख में, हम परीक्षण के तीन प्रमुख स्तरों पर चर्चा करेंगे: unit (मॉड्यूलर), integration (एकीकरण) और e2e (एंड-टू-एंड)। आप जानेंगे कि वे कैसे भिन्न हैं, किन उपकरणों का उपयोग करना है और C++ में सही तरीके से परीक्षण कैसे लिखना है। यह सामग्री शुरुआती और अनुभवी डेवलपर्स दोनों के लिए उपयोगी होगी जो अपने ज्ञान को व्यवस्थित करना चाहते हैं।
\n\n1. C++ में Unit-परीक्षण: प्रोग्राम के "बिल्डिंग ब्लॉक्स" का परीक्षण
\nUnit-परीक्षण (या मॉड्यूलर परीक्षण) कोड की सबसे छोटी इकाई की जाँच करते हैं - आमतौर पर एक अलग फ़ंक्शन या क्लास मेथड। उनका मुख्य उद्देश्य: घटक को अलग करना और यह सुनिश्चित करना कि वह बाहरी निर्भरताओं से अलग होकर सही ढंग से काम करता है।
\n\n1.1. C++ unit-परीक्षण के लिए उपकरण
\nC++ बाजार में कई परिपक्व फ्रेमवर्क हैं। यहाँ सबसे लोकप्रिय हैं:
\n- \n
- Google Test (GTest) — डी-फैक्टो मानक। शक्तिशाली मैक्रोज़, पैरामीटराइज़्ड परीक्षणों के लिए समर्थन, मॉक ऑब्जेक्ट (Google Mock के माध्यम से)। \n
- Catch2 — हल्का, आधुनिक, उत्कृष्ट सिंटैक्स के साथ। छोटे प्रोजेक्ट्स के लिए उपयुक्त। \n
- Boost.Test — Boost लाइब्रेरी का हिस्सा। भारी, लेकिन कार्यात्मक। \n
हम सबसे सामान्य विकल्प के रूप में Google Test का उपयोग करेंगे।
\n\n1.2. C++ (Google Test) में unit-परीक्षण का उदाहरण
\nमान लीजिए, हमारे पास फैक्टोरियल की गणना के लिए एक सरल फ़ंक्शन है:
\n// math_utils.h\n#pragma once\nint factorial(int n);\n// math_utils.cpp\n#include "math_utils.h"\nint factorial(int n) {\n if (n < 0) return -1; // त्रुटि: ऋणात्मक संख्या\n if (n == 0) return 1;\n return n * factorial(n - 1);\n}\nअब Google Test का उपयोग करके एक unit-परीक्षण लिखते हैं:
\n// test_math_utils.cpp\n#include <gtest/gtest.h>\n#include "math_utils.h"\n\nTEST(FactorialTest, HandlesZeroInput) {\n EXPECT_EQ(factorial(0), 1);\n}\n\nTEST(FactorialTest, HandlesPositiveInput) {\n EXPECT_EQ(factorial(5), 120);\n}\n\nTEST(FactorialTest, HandlesNegativeInput) {\n EXPECT_EQ(factorial(-1), -1);\n}\n\nint main(int argc, char **argv) {\n ::testing::InitGoogleTest(&argc, argv);\n return RUN_ALL_TESTS();\n}\nपरीक्षण चलाएँ - और हरी बत्ती देखें। यदि फ़ंक्शन में कोई त्रुटि होती (जैसे, factorial(5) 119 लौटाता), तो परीक्षण विफल हो जाता, और हमें तुरंत समस्या के बारे में पता चल जाता।
1.3. Unit-परीक्षणों के लिए Best practices
\n- \n
- पृथक्करण: बाहरी निर्भरताओं (DB, नेटवर्क, फ़ाइल सिस्टम) को बदलने के लिए मॉक (Mock) का उपयोग करें। \n
- प्रति परीक्षण एक जाँच: प्रत्येक
TESTको एक व्यवहार की जाँच करनी चाहिए। \n - स्पष्ट नाम:
HandlesZeroInput,Test1से बेहतर है। \n - सीमा मामलों का कवरेज: शून्य, ऋणात्मक संख्याएँ, अधिकतम मान। \n
2. एकीकरण परीक्षण (Integration Testing): अंतःक्रिया की जाँच
\nएकीकरण परीक्षण जाँचते हैं कि सिस्टम के विभिन्न मॉड्यूल एक साथ कैसे काम करते हैं। Unit-परीक्षणों के विपरीत, यहाँ हम घटकों को अलग नहीं करते - हम वास्तविक कनेक्शनों की जाँच करते हैं (जैसे, एक क्लास से फ़ंक्शन कॉल जो दूसरे क्लास का उपयोग करता है)।
\n\n2.1. एकीकरण परीक्षण कब आवश्यक है?
\n- \n
- जब दो मॉड्यूल डेटा का आदान-प्रदान करते हैं (जैसे, पार्सर + वैलिडेटर)। \n
- बाहरी संसाधनों के साथ काम करते समय: डेटाबेस, फ़ाइलें, नेटवर्क सॉकेट। \n
- कई unit-परीक्षित घटकों को संयोजित करने के बाद। \n