C++ में परीक्षण: फ्रेमवर्क और उपकरण
C++ में कोड की गुणवत्ता सॉफ्टवेयर की विश्वसनीयता के लिए एक महत्वपूर्ण कारक है। प्रबंधित मेमोरी वाली भाषाओं के विपरीत, C++ में त्रुटियाँ गंभीर विफलताओं, मेमोरी लीक और अनिर्धारित व्यवहार का कारण बन सकती हैं। मॉड्यूलर परीक्षण (यूनिट-टेस्टिंग) प्रणाली प्रारंभिक चरणों में दोषों का पता लगाने, रिफैक्टरिंग को सुविधाजनक बनाने और फ़ंक्शन के व्यवहार का दस्तावेजीकरण करने में मदद करती है। इस लेख में, हम C++ परीक्षण के लिए तीन लोकप्रिय फ्रेमवर्क: Google Test, Catch2 और doctest, साथ ही विकास प्रक्रिया में उनके एकीकरण के लिए उपकरणों की समीक्षा करेंगे।
C++ में परीक्षण क्यों आवश्यक है?
- रिफैक्टरिंग में सुरक्षा: परीक्षण प्रतिगमन के बारे में तुरंत संकेत देते हैं।
- दस्तावेज़ीकरण: पठनीय परीक्षण API उपयोग के जीवंत उदाहरण के रूप में कार्य करते हैं।
- CI के साथ एकीकरण: प्रत्येक कमिट पर परीक्षणों का स्वचालित निष्पादन।
- अनिर्धारित व्यवहार का पता लगाना: सैनिटाइज़र (AddressSanitizer, UndefinedBehaviorSanitizer) के साथ परीक्षण।
1. Google Test (GTest)
Google का सबसे लोकप्रिय फ्रेमवर्क। xUnit-शैली, एसर्शन मैक्रोज़ का समृद्ध सेट, परीक्षणों का स्वचालित पंजीकरण, मॉक (Google Mock के माध्यम से) और पैरामीटरयुक्त परीक्षणों का समर्थन करता है।
स्थापना (CMake FetchContent के माध्यम से)
# CMakeLists.txtinclude(FetchContent)FetchContent_Declare( googletest GIT_REPOSITORY https://github.com/google/googletest.git GIT_TAG release-1.12.1)FetchContent_MakeAvailable(googletest)
add_executable(my_tests test.cpp)target_link_libraries(my_tests GTest::gtest_main)परीक्षण का उदाहरण
#include <gtest/gtest.h>
int factorial(int n) { return (n <= 1) ? 1 : n * factorial(n - 1);}
TEST(FactorialTest, HandlesZeroInput) { EXPECT_EQ(factorial(0), 1);}
TEST(FactorialTest, HandlesPositiveInput) { EXPECT_EQ(factorial(5), 120); EXPECT_GT(factorial(3), 5);}
int main(int argc, char **argv) { ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS();}TEST()— परीक्षण मामले को परिभाषित करने के लिए मैक्रो।EXPECT_EQ— समानता की जाँच (गैर-घातक)।ASSERT_*— घातक जाँच (विफलता पर परीक्षण रोक देता है)।
2. Catch2
पठनीयता और सरलता पर ध्यान केंद्रित करने वाला आधुनिक फ्रेमवर्क। BDD-शैली (Given-When-Then), सेक्शन (परीक्षणों को नेस्टेड परिदृश्यों में विभाजित करना) और यादृच्छिक डेटा उत्पादन का समर्थन करता है। बेस क्लास से इनहेरिटेंस की आवश्यकता नहीं है।
स्थापना (single-header या vcpkg के माध्यम से)
# vcpkgvcpkg install catch2
# CMakefind_package(Catch2 REQUIRED)target_link_libraries(my_tests Catch2::Catch2)परीक्षण का उदाहरण
#define CATCH_CONFIG_MAIN#include <catch2/catch.hpp>
int add(int a, int b) { return a + b; }
TEST_CASE("Addition works", "[math]") { REQUIRE(add(2, 2) == 4); CHECK(add(-1, 1) == 0);
SECTION("With zero") { REQUIRE(add(0, 5) == 5); }}
TEST_CASE("String concatenation", "[string]") { std::string result = std::string("Hello ") + "World"; CHECK(result == "Hello World");}TEST_CASE— नाम और टैग के साथ परीक्षण की घोषणा।REQUIRE— घातक जाँच।CHECK— गैर-घातक जाँच।SECTION— नेस्टेड परिदृश्य (प्रत्येक सेक्शन सामान्य स्थिति से चलता है)।
3. Doctest
हल्का और तेज़ विकल्प। Catch2 से प्रेरित, लेकिन 2-5 गुना तेज़ी से कंपाइल होता है। उन प्रोजेक्ट्स के लिए डिज़ाइन किया गया है जहाँ बिल्ड की गति महत्वपूर्ण है। हेडर-ओनली फ़ाइल, CHECK और REQUIRE मैक्रोज़, साथ ही XML प्रारूप में आउटपुट का समर्थन करता है।