C++ में परीक्षण: फ्रेमवर्क और उपकरणों का अवलोकन
\n\nपरीक्षण C++ पर पेशेवर विकास का एक अनिवार्य हिस्सा है। गतिशील टाइपिंग वाली भाषाओं के विपरीत, C++ को मेमोरी प्रबंधन, RAII और टेम्पलेट मेटाप्रोग्राम पर विशेष ध्यान देने की आवश्यकता होती है। गुणवत्तापूर्ण परीक्षणों के बिना, एक छोटा सा रिफैक्टरिंग भी मुश्किल से पकड़ में आने वाली त्रुटियों का कारण बन सकता है। इस लेख में, हम C++ में मॉड्यूलर परीक्षण के लिए मुख्य फ्रेमवर्क, उनकी विशेषताओं और उपयोग के उदाहरणों पर चर्चा करेंगे।
\n\nC++ कोड का परीक्षण क्यों करें?
\nपरीक्षण लागू करने के मुख्य कारण:
\n- \n
- रिफैक्टरिंग की सुरक्षा — परीक्षण बदलावों से पहले सही व्यवहार को सुनिश्चित करते हैं। \n
- दस्तावेज़ीकरण — परीक्षण दिखाते हैं कि API का उपयोग कैसे करें। \n
- प्रतिगमन का पता लगाना — प्रत्येक कमिट के बाद स्वचालित जाँच। \n
- सीमांत मामलों का सत्यापन — nullptr, खाली कंटेनर, ओवरफ्लो के साथ कार्य। \n
C++ के लिए लोकप्रिय फ्रेमवर्क
\n\n1. Google Test (gtest)
\nGoogle का सबसे सामान्य फ्रेमवर्क। यह स्वचालित परीक्षण पंजीकरण, ASSERT_* और EXPECT_* मैक्रोज़, पैरामीटरयुक्त परीक्षण, Google Mock के माध्यम से मॉक का समर्थन करता है।
\n#include <gtest/gtest.h>\n\nint add(int a, int b) { return a + b; }\n\nTEST(AdditionTest, PositiveNumbers) {\n EXPECT_EQ(add(2, 3), 5);\n EXPECT_EQ(add(0, 0), 0);\n}\n\nTEST(AdditionTest, NegativeNumbers) {\n EXPECT_EQ(add(-1, -2), -3);\n}\n\nint main(int argc, char **argv) {\n ::testing::InitGoogleTest(&argc, argv);\n return RUN_ALL_TESTS();\n}\nविशेषताएँ:
\n- \n
- assert की जाँच के लिए डेथ टेस्ट का समर्थन। \n
- निर्भरताओं को अलग करने के लिए मॉक फैक्ट्री (gmock)। \n
- CMake के साथ एकीकरण (find_package(GTest))। \n
2. Catch2
\nअभिव्यंजक सिंटैक्स वाला आधुनिक फ्रेमवर्क। इसमें अलग से परीक्षण पंजीकरण की आवश्यकता नहीं है — केवल TEST_CASE मैक्रो पर्याप्त है। BDD-शैली (Given-When-Then) का समर्थन करता है।
#include <catch2/catch_test_macros.hpp>\n\nint factorial(int n) {\n return n <= 1 ? 1 : n * factorial(n - 1);\n}\n\nTEST_CASE("Factorials are computed", "[math]") {\n REQUIRE(factorial(0) == 1);\n REQUIRE(factorial(1) == 1);\n REQUIRE(factorial(5) == 120);\n}\n\nTEST_CASE("Negative input", "[math][edge]") {\n REQUIRE_THROWS_AS(factorial(-1), std::domain_error);\n}\nविशेषताएँ:
\n- \n
- परीक्षण डेटा का जनरेशन (GENERATE)। \n
- परीक्षणों को अनुभागों (SECTION) में विभाजित करना। \n
- स्वचालित main() चयन (यदि CATCH_CONFIG_MAIN परिभाषित किया गया हो)। \n
3. doctest
\nहल्का और तेज़ फ्रेमवर्क, न्यूनतम संकलन समय। उन परियोजनाओं के लिए आदर्श जहाँ बिल्ड गति महत्वपूर्ण है। सिंटैक्स Catch2 के समान है।
\n#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN\n#include <doctest/doctest.h>\n\nint divide(int a, int b) {\n if (b == 0) throw std::invalid_argument("division by zero");\n return a / b;\n}\n\nTEST_CASE("Division") {\n CHECK(divide(10, 2) == 5);\n CHECK_THROWS_AS(divide(5, 0), std::invalid_argument);\n}\nविशेषताएँ:
\n- \n
- बहुत तेज़ संकलन (हेडर फ़ाइल ~5 KB)। \n
- CHECK, REQUIRE, WARN मैक्रोज़ का समर्थन। \n
- XML/JSON में अंतर्निहित रिपोर्टर। \n
4. Boost.Test
\nBoost लाइब्रेरीज़ का हिस्सा। इसमें समृद्ध क्षमताएँ हैं, लेकिन अधिक boilerplate कोड की आवश्यकता होती है। स्वचालित और मैन्युअल परीक्षण पंजीकरण का समर्थन करता है।
\n#define BOOST_TEST_MODULE MyTest\n#include <boost/test/included/unit_test.hpp>\n\nBOOST_AUTO_TEST_SUITE(MathTests)\n\nBOOST_AUTO_TEST_CASE(TestSum) {\n BOOST_CHECK_EQUAL(2 + 2, 4);\n BOOST_CHECK_CLOSE(3.14159, 3.14, 0.1); // सटीकता 0.1%\n}\n\nBOOST_AUTO_TEST_CASE(TestFail) {\n BOOST_REQUIRE_MESSAGE(false, "This test always fails");\n}\n\nBOOST_AUTO_TEST_SU