C++ में परीक्षण: फ्रेमवर्क और उपकरणों का अवलोकन (Google Test, Catch2, doctest)

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

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

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

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 प्रारूप में आउटपुट का समर्थन करता है।



स्थापना (he

अनुशंसाएँ