Catch2 / Google Test C++: पूर्ण गाइड उदाहरणों के साथ

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

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

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

परिचय: Catch2 और Google Test क्या हैं और इनकी आवश्यकता क्यों है?

C++ में आधुनिक सॉफ्टवेयर डेवलपमेंट में टेस्टिंग कोई विलासिता नहीं, बल्कि एक आवश्यकता है। यूनिट टेस्टिंग (unit testing) लाइब्रेरीज़ डेवलपर्स को स्वचालित रूप से यह जांचने में मदद करती हैं कि प्रोग्राम के अलग-अलग घटक (फंक्शन, क्लास, मॉड्यूल) सही ढंग से काम कर रहे हैं। इस उद्देश्य के लिए दो सबसे लोकप्रिय लाइब्रेरीज़ हैं Catch2 और Google Test (gtest)।

Catch2 एक आधुनिक, हल्की और बहुत ही उपयोगकर्ता-अनुकूल यूनिट टेस्टिंग लाइब्रेरी है। इसकी मुख्य विशेषता मैक्रोज़ का उपयोग है, जो टेस्ट को पढ़ने योग्य और सामान्य अंग्रेजी जैसा बनाता है। Catch2 Behaviour-Driven Development (BDD) शैली, स्वचालित टेस्ट रजिस्ट्रेशन का समर्थन करता है और इसमें जटिल कॉन्फ़िगरेशन की आवश्यकता नहीं होती।

Google Test (gtest) Google द्वारा विकसित एक शक्तिशाली और परिपक्व लाइब्रेरी है, जो कई बड़े प्रोजेक्ट्स में डी-फैक्टो मानक है। यह assertion मैक्रोज़ का एक समृद्ध सेट, फिक्स्चर (test fixtures) बनाने की सुविधा, पैरामीटराइज़्ड टेस्ट और CMake बिल्ड सिस्टम के साथ उत्कृष्ट एकीकरण प्रदान करता है।

दोनों लाइब्रेरीज़ एक ही कार्य करती हैं: टेस्ट लिखना जो स्वचालित रूप से चलते हैं और परिणाम रिपोर्ट करते हैं। इनके बीच चुनाव अक्सर व्यक्तिगत पसंद, प्रोजेक्ट की आवश्यकताओं या मौजूदा इंफ्रास्ट्रक्चर पर निर्भर करता है। इस लेख में हम दोनों लाइब्रेरीज़ को कवर करेंगे, क्योंकि वे अवधारणा में बहुत समान हैं, लेकिन सिंटैक्स और API में भिन्न हैं।

इंस्टॉलेशन (Installation)

Python (जहाँ pip का उपयोग होता है) के विपरीत, C++ लाइब्रेरीज़ की स्थापना आमतौर पर सिस्टम पैकेज मैनेजर या बिल्ड सिस्टम (जैसे CMake) के माध्यम से की जाती है। आइए दोनों विकल्पों को देखें।

Catch2 की स्थापना

विधि 1: vcpkg के माध्यम से (अनुशंसित)

# vcpkg इंस्टॉल करें, अगर पहले से नहीं है
git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh  # या Windows पर .\bootstrap-vcpkg.bat

# Catch2 इंस्टॉल करें
./vcpkg install catch2

# CMake के साथ एकीकरण
./vcpkg integrate install

विधि 2: Header-only (सबसे आसान)
Catch2 को header-only लाइब्रेरी के रूप में उपयोग किया जा सकता है। बस आधिकारिक रिपॉजिटरी से catch.hpp फ़ाइल डाउनलोड करें और इसे अपने प्रोजेक्ट फ़ोल्डर में रखें। फिर कोड में इसे शामिल करें:

#define CATCH_CONFIG_MAIN  // यह लाइन केवल एक .cpp फ़ाइल में होनी चाहिए
#include "catch.hpp"

Google Test की स्थापना

विधि 1: vcpkg के माध्यम से

./vcpkg install gtest
./vcpkg integrate install

विधि 2: CMake FetchContent के माध्यम से (CMake प्रोजेक्ट्स के लिए अनुशंसित)
अपने CMakeLists.txt में यह जोड़ें:

include(FetchContent)
FetchContent_Declare(
  googletest
  GIT_REPOSITORY https://github.com/google/googletest.git
  GIT_TAG release-1.12.1
)
FetchContent_MakeAvailable(googletest)

# अब आप अपनी टेस्ट फ़ाइल के लिए target_link_libraries का उपयोग कर सकते हैं
add_executable(my_tests test.cpp)
target_link_libraries(my_tests GTest::gtest_main)

कोड उदाहरण के साथ त्वरित शुरुआत (Quick Start)

आइए एक सरल फंक्शन लिखें और इसे दोनों लाइब्रेरीज़ से टेस्ट करें। फंक्शन किसी संख्या का फैक्टोरियल निकालेगा।

Catch2 के साथ उदाहरण

#define CATCH_CONFIG_MAIN
#include "catch.hpp"

// टेस्ट करने के लिए फंक्शन
unsigned int factorial(unsigned int n) {
    if (n == 0) return 1;
    return n * factorial(n - 1);
}

// टेस्ट केस
TEST_CASE("फैक्टोरियल सही ढंग से गणना करता है", "[factorial]") {
    REQUIRE(factorial(0) == 1);
    REQUIRE(factorial(1) == 1);
    REQUIRE(factorial(2) == 2);
    REQUIRE(factorial(3) == 6);
    REQUIRE(factorial(10) == 3628800);
}

// सेक्शन के साथ एक और टेस्ट केस
TEST_CASE("सीमा मामलों की जाँच", "[factorial][edge]") {
    SECTION("0 का फैक्टोरियल") {
        REQUIRE(factorial(0) == 1);
    }
    SECTION("1 का फैक्टोरियल") {
        REQUIRE(factorial(1) == 1);
    }
}

Google Test के साथ उदाहरण

#include <gtest/gtest.h>

// टेस्ट करने के लिए फंक्शन
unsigned int factorial(unsigned int n) {
    if (n == 0) return 1;
    return n * factorial(n - 1);
}

// टेस्ट केस
TEST(FactorialTest, HandlesZeroInput) {
    EXPECT_EQ(factorial(0), 1);
}

TEST(FactorialTest, HandlesPositiveInput) {
    EXPECT_EQ(factorial(1), 1);
    EXPECT_EQ(factorial(2), 2);
    EXPECT_EQ(factorial(3), 6);
    EXPECT_EQ(factorial(10), 3628800);
}

// मुख्य फंक्शन
int main(int argc, char **argv) {
    ::testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

अनुशंसाएँ