BDD क्या है और यह सिर्फ एक और ट्रेंड क्यों नहीं है?
\n\nक्या आपने कभी ऐसा कोड लिखा है जो कंपाइलर के नज़रिए से बिल्कुल सही है, लेकिन बिज़नेस की ज़रूरतों को पूरा नहीं करता? जब मैनेजर तैयार फीचर को देखकर कहता है, "मुझे लगा था कि यह अलग होगा" — यह स्थिति जानी-पहचानी है? अगर हाँ, तो BDD (Behaviour-Driven Development) की दुनिया में आपका स्वागत है। यह सिर्फ एक मेथडोलॉजी नहीं, बल्कि "मुझे हरा बटन चाहिए" और "यह टेस्ट फेल हो जाता है अगर बटन हरा नहीं है" के बीच का पुल है।
\n\nक्लासिक TDD (Test-Driven Development) के विपरीत, जहाँ हम फंक्शन की जाँच के लिए टेस्ट लिखते हैं, BDD सिस्टम के व्यवहार पर ध्यान केंद्रित करता है — यूज़र के नज़रिए से। C++ के संदर्भ में यह विशेष रूप से मूल्यवान है: भाषा जटिल है, प्रोजेक्ट बड़े होते हैं, और क्लाइंट के साथ गलतफहमी के बाद लॉजिक को फिर से लिखना महंगा है। C++ में BDD दो काम एक साथ करता है: वह दस्तावेज़ीकरण तैयार करता है जिसे प्रोजेक्ट मैनेजर भी समझ सके, और ऑटोमेटेड टेस्ट का सेट देता है जो बिज़नेस लॉजिक को टूटने से बचाता है।
\n\nइस लेख में, हम देखेंगे कि एक वास्तविक C++ प्रोजेक्ट में behaviour-driven development को कैसे लागू किया जाए। बिना अनावश्यक बातों के, कोड और व्यावहारिक तरीकों के साथ।
\n\nBDD की बुनियाद: Gherkin भाषा और C++ में इसकी भूमिका
\n\nBDD का दिल Gherkin भाषा में लिखे गए सीनारियो हैं। ये कुछ इस तरह दिखते हैं:
\n\nFeature: खातों के बीच पैसे ट्रांसफर करना\n Scenario: पर्याप्त बैलेंस होने पर सफल ट्रांसफर\n Given उपयोगकर्ता के पास खाता A है जिसमें 1000 रुपये का बैलेंस है\n And उपयोगकर्ता के पास खाता B है जिसमें 0 रुपये का बैलेंस है\n When उपयोगकर्ता खाता A से खाता B में 500 रुपये ट्रांसफर करता है\n Then खाता A का बैलेंस 500 रुपये हो जाता है\n And खाता B का बैलेंस 500 रुपये हो जाता है\n\nहाँ, यह C++ नहीं है। लेकिन यही इसका जादू है: सीनारियो मानव भाषा में लिखा जाता है, और फिर स्टेप्स के ज़रिए वास्तविक C++ कोड से जोड़ा जाता है। Given, When, Then की हर पंक्ति एक फंक्शन में बदल जाती है जो आपकी क्लासेस को कॉल करती है और परिणामों की जाँच करती है।
C++ के लिए कई फ्रेमवर्क हैं जो Gherkin के साथ काम कर सकते हैं। सबसे लोकप्रिय:
\n\n- \n
- Catch2 BDD-स्टाइल के साथ — हल्का, Catch2 में बिल्ट-इन, किसी बाहरी पार्सर की ज़रूरत नहीं। \n
- Cucumber-CPP — C++ के लिए Cucumber का पूर्ण कार्यान्वयन, .feature फ़ाइलों को सीधे पार्स करता है। \n
- Boost.Test — BDD जैसा सिंटैक्स देता है, लेकिन कम लचीला है। \n
मेरी सलाह है कि Catch2 से शुरुआत करें: यह 90% C++ प्रोजेक्ट्स में पहले से मौजूद होता है, और BDD के लिए कुछ अतिरिक्त इंस्टॉल करने की ज़रूरत नहीं है। अगर प्रोजेक्ट बड़ा है और बिज़नेस एनालिस्टों के साथ इंटीग्रेशन चाहिए — तो Cucumber-CPP लें।
\n\nCatch2 के साथ BDD: कोड में ही सीनारियो लिखना
\n\nCatch2 मैक्रोज़ प्रदान करता है: SCENARIO, GIVEN, WHEN, THEN और AND_WHEN/AND_THEN। यह शुद्ध Gherkin नहीं है, लेकिन स्टाइल काफी करीब है। आइए एक साधारण बैंक खाते के लिए टेस्ट लिखें।
पहले — खाता क्लास:
\n\n// account.h\n#pragma once\n#include <string>\n#include <stdexcept>\n\nclass Account {\npublic:\n explicit Account(std::string owner, double initial_balance = 0.0)\n : owner_(std::move(owner)), balance_(initial_balance) {}\n\n void deposit(double amount) {\n if (amount <= 0) throw std::invalid_argument("राशि सकारात्मक होनी चाहिए");\n balance_ += amount;\n }\n\n void withdraw(double amount) {\n if (amount > balance_) throw std::runtime_error("अपर्याप्त धनराशि");\n if (amount <= 0) throw std::invalid_argument("राशि सकारात्मक होनी चाहिए");\n balance_ -= amount;\n }\n\n double balance() const { return balance_; }\n const std::string& owner() const { return owner_; }\n\nprivate:\n std::string owner_;\n double balance_ = 0.0;\n};\n\nऔर अब — Catch2 का उपयोग करके BDD टेस्ट:
\n\n// tes