<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Testing on kenji.blog</title><link>http://kenji.blog/hi/categories/testing/</link><description>Recent content in Testing on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>hi</language><copyright>kenjinote</copyright><lastBuildDate>Sat, 12 Sep 2026 21:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/hi/categories/testing/index.xml" rel="self" type="application/rss+xml"/><item><title>C++ प्रोजेक्ट्स (GoogleTest आदि) में टेस्ट-ड्रिवन डेवलपमेंट (TDD) कैसे लागू करें</title><link>http://kenji.blog/hi/p/tdd-cpp-googletest-introduction/</link><pubDate>Sat, 12 Sep 2026 21:00:00 +0900</pubDate><guid>http://kenji.blog/hi/p/tdd-cpp-googletest-introduction/</guid><description>&lt;img src="http://kenji.blog/p/tdd-cpp-googletest-introduction/img/eyecatch.jpg" alt="Featured image of post C++ प्रोजेक्ट्स (GoogleTest आदि) में टेस्ट-ड्रिवन डेवलपमेंट (TDD) कैसे लागू करें" />&lt;p>आधुनिक सॉफ्टवेयर विकास में, कोड की गुणवत्ता बनाए रखते हुए तेजी से नई सुविधाएँ जोड़ना एक अत्यंत महत्वपूर्ण कार्य है। विशेष रूप से C++ जैसी जटिल और उच्च-प्रदर्शन वाली भाषाओं में, मेमोरी प्रबंधन की गलतियाँ या अपरिभाषित व्यवहार (Undefined Behavior) आसानी से गंभीर बग का कारण बन सकते हैं, इसलिए अन्य भाषाओं की तुलना में यहाँ परीक्षण (testing) का महत्व और भी अधिक है।&lt;/p>
&lt;p>इस लेख में, हम C++ प्रोजेक्ट्स में &lt;strong>टेस्ट-ड्रिवन डेवलपमेंट (Test-Driven Development: TDD)&lt;/strong> लागू करने के तरीकों को बहुत ही विस्तृत और व्यावहारिक रूप से समझाएंगे। हम यूनिट टेस्टिंग फ्रेमवर्क &lt;strong>GoogleTest&lt;/strong> और मॉकिंग फ्रेमवर्क &lt;strong>GoogleMock&lt;/strong> के उपयोग, बिल्ड सिस्टम &lt;strong>CMake&lt;/strong> का उपयोग करके आधुनिक कॉन्फ़िगरेशन के तरीके, और कोड कवरेज मापने के तरीकों को व्यापक रूप से कवर करेंगे।&lt;/p>
&lt;h2 id="1-टसट-डरवन-डवलपमट-tdd-क-दरशन-और-लभ">1. टेस्ट-ड्रिवन डेवलपमेंट (TDD) का दर्शन और लाभ
&lt;/h2>&lt;p>टेस्ट-ड्रिवन डेवलपमेंट (TDD) एक सॉफ्टवेयर विकास पद्धति है जिसमें &amp;ldquo;कार्यान्वयन (implementation) लिखने से पहले टेस्ट लिखा जाता है&amp;rdquo;। यह केवल एक परीक्षण पद्धति नहीं है, बल्कि एक &lt;strong>डिज़ाइन पद्धति&lt;/strong> के रूप में भी कार्य करता है। पहले टेस्ट लिखने से, डेवलपर्स स्वाभाविक रूप से &amp;ldquo;उपयोग में आसान इंटरफेस&amp;rdquo; और &amp;ldquo;ढीले युग्मित (loosely coupled) डिज़ाइन&amp;rdquo; के प्रति जागरूक हो जाते हैं।&lt;/p>
&lt;h3 id="11-red-green-refactor-चकर">1.1 Red-Green-Refactor चक्र
&lt;/h3>&lt;p>TDD के मूल में निम्नलिखित &amp;ldquo;Red-Green-Refactor&amp;rdquo; चक्र है।&lt;/p>
&lt;pre class="mermaid">
flowchart TD
Start[&amp;#34;विकास शुरू&amp;#34;] --&amp;gt; Red[&amp;#34;Red: विफल होने वाला टेस्ट लिखें&amp;#34;]
Red --&amp;gt; Green[&amp;#34;Green: टेस्ट पास करने के लिए न्यूनतम कार्यान्वयन करें&amp;#34;]
Green --&amp;gt; Refactor[&amp;#34;Refactor: कोड को परिष्कृत करें (रिफैक्टरिंग)&amp;#34;]
Refactor --&amp;gt; Red
Refactor -.-&amp;gt; End[&amp;#34;सुविधा पूर्ण&amp;#34;]
&lt;/pre>
&lt;ol>
&lt;li>&lt;strong>Red (लाल)&lt;/strong>: बिना किसी कार्यान्वयन के, अपेक्षित व्यवहार को परिभाषित करने वाला एक टेस्ट लिखें। चूँकि इस समय कोई कार्यान्वयन नहीं है, टेस्ट निश्चित रूप से विफल (Red) होगा।&lt;/li>
&lt;li>&lt;strong>Green (हरा)&lt;/strong>: टेस्ट को सफल (Green) बनाने के लिए केवल न्यूनतम कोड लिखें। इस स्तर पर, कोड की सुंदरता या प्रदर्शन सर्वोच्च प्राथमिकता नहीं है।&lt;/li>
&lt;li>&lt;strong>Refactor (रिफैक्टरिंग)&lt;/strong>: टेस्ट पास होने की स्थिति को बनाए रखते हुए, डुप्लीकेशन हटाएं और कोड के डिज़ाइन में सुधार करें। टेस्ट होने से, आप सुरक्षित रूप से कोड में बदलाव कर सकते हैं।&lt;/li>
&lt;/ol>
&lt;h3 id="12-बग-खजन-म-दर-क-करण-लगत-म-वदध">1.2 बग खोजने में देरी के कारण लागत में वृद्धि
&lt;/h3>&lt;p>सॉफ्टवेयर इंजीनियरिंग में, यह ज्ञात है कि विकास प्रक्रिया में बग जितनी देर से पाया जाता है, उसे ठीक करने की लागत चरघातांकी (exponentially) रूप से बढ़ जाती है। लागत वृद्धि के इस मॉडल का अनुमान अक्सर निम्नलिखित सूत्र से लगाया जाता है।&lt;/p>
$$ Cost(t) = C_0 \times e^{k \cdot t} $$&lt;p>यहाँ, $Cost(t)$ समय $t$ पर सुधार की लागत है, $C_0$ बग पेश किए जाने के तुरंत बाद की सुधार लागत (बेसलाइन) है, और $k$ एक स्थिरांक है। TDD को लागू करके, $t$ को न्यूनतम रखा जा सकता है, जिससे लागत की चरघातांकी वृद्धि को रोका जा सकता है।&lt;/p>
&lt;h2 id="2-c-म-टसट-टलस-क-चयन-और-आधनक-cmake-कनफगरशन">2. C++ में टेस्ट टूल्स का चयन और आधुनिक CMake कॉन्फ़िगरेशन
&lt;/h2>&lt;p>C++ के लिए कई टेस्टिंग फ्रेमवर्क उपलब्ध हैं। इनमें Catch2, Boost.Test, doctest आदि शामिल हैं, लेकिन उद्योग मानक के रूप में सबसे व्यापक रूप से &lt;strong>GoogleTest (gtest)&lt;/strong> का उपयोग किया जाता है। GoogleTest अपने समृद्ध असर्शन (assertions), शक्तिशाली मॉकिंग फ्रेमवर्क (GoogleMock), और उच्च एक्स्टेंसिबिलिटी (extensibility) के लिए जाना जाता है।&lt;/p>
&lt;h3 id="21-cmake-क-fetchcontent-क-उपयग-करक-googletest-क-शमल-करन">2.1 CMake के &lt;code>FetchContent&lt;/code> का उपयोग करके GoogleTest को शामिल करना
&lt;/h3>&lt;p>आधुनिक C++ विकास में, बाहरी निर्भरता (dependencies) को प्रबंधित करने के लिए CMake के &lt;code>FetchContent&lt;/code> मॉड्यूल का उपयोग करना मुख्यधारा है। इससे सबमॉड्यूल (submodules) को प्रबंधित करने या लाइब्रेरीज़ को पहले से इंस्टॉल करने की परेशानी बच जाती है।&lt;/p>
&lt;p>प्रोजेक्ट के रूट में स्थित &lt;code>CMakeLists.txt&lt;/code> को इस प्रकार लिखा जाता है।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;span class="lnt">36
&lt;/span>&lt;span class="lnt">37
&lt;/span>&lt;span class="lnt">38
&lt;/span>&lt;span class="lnt">39
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cmake" data-lang="cmake">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cmake_minimum_required&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">VERSION&lt;/span> &lt;span class="s">3.14&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="nb">project&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">TddCppExample&lt;/span> &lt;span class="s">CXX&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="c"># C++ मानक निर्दिष्ट करना
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c">&lt;/span>&lt;span class="nb">set&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">CMAKE_CXX_STANDARD&lt;/span> &lt;span class="s">17&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="nb">set&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">CMAKE_CXX_STANDARD_REQUIRED&lt;/span> &lt;span class="s">ON&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="c"># उत्पादन कोड को लाइब्रेरी बनाना
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c">&lt;/span>&lt;span class="nb">add_library&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">core_lib&lt;/span> &lt;span class="s">src/Calculator.cpp&lt;/span> &lt;span class="s">src/StringUtils.cpp&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="nb">target_include_directories&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">core_lib&lt;/span> &lt;span class="s">PUBLIC&lt;/span> &lt;span class="s">include&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="c"># परीक्षण सक्षम करना
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c">&lt;/span>&lt;span class="nb">enable_testing&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="c"># GoogleTest प्राप्त करना
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c">&lt;/span>&lt;span class="nb">include&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">FetchContent&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="nb">FetchContent_Declare&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s">googletest&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s">URL&lt;/span> &lt;span class="s">https://github.com/google/googletest/archive/refs/tags/v1.14.0.zip&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="c"># Windows परिवेश में बिल्ड चेतावनियों से बचने के लिए
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c">&lt;/span>&lt;span class="nb">set&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">gtest_force_shared_crt&lt;/span> &lt;span class="s">ON&lt;/span> &lt;span class="s">CACHE&lt;/span> &lt;span class="s">BOOL&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span> &lt;span class="s">FORCE&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="nb">FetchContent_MakeAvailable&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">googletest&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="c"># टेस्ट एक्ज़ीक्यूटेबल कॉन्फ़िगरेशन
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c">&lt;/span>&lt;span class="nb">add_executable&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">unit_tests&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s">tests/CalculatorTest.cpp&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s">tests/StringUtilsTest.cpp&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="nb">target_link_libraries&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">unit_tests&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s">PRIVATE&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s">core_lib&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s">gtest_main&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s">gmock&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="c"># CTest के साथ पंजीकृत करना
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c">&lt;/span>&lt;span class="nb">include&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">GoogleTest&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="nb">gtest_discover_tests&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">unit_tests&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>इस सेटिंग के साथ, CMake स्वचालित रूप से GoogleTest का सोर्स कोड डाउनलोड करेगा और इसे प्रोजेक्ट में एकीकृत कर देगा।&lt;/p>
&lt;h2 id="3-अभयस-googletest-क-सथ-red-green-refactor-चकर">3. अभ्यास: GoogleTest के साथ Red-Green-Refactor चक्र
&lt;/h2>&lt;p>अब, आइए एक सरल &lt;code>Calculator&lt;/code> क्लास के उदाहरण के साथ TDD चक्र का अभ्यास करें।&lt;/p>
&lt;h3 id="31-चरण-1-red-वफल-हन-वल-टसट-लख">3.1 चरण 1: Red (विफल होने वाला टेस्ट लिखें)
&lt;/h3>&lt;p>सबसे पहले, हम हेडर फाइल &lt;code>include/Calculator.h&lt;/code> का कंकाल (skeleton) और टेस्ट कोड लिखेंगे।&lt;/p>
&lt;p>&lt;strong>include/Calculator.h (कंकाल)&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#pragma once
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">Calculator&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">public&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">int&lt;/span> &lt;span class="n">Add&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>&lt;strong>tests/CalculatorTest.cpp (टेस्ट कोड)&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;span class="lnt">8
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;gtest/gtest.h&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;#34;Calculator.h&amp;#34;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">TEST&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">CalculatorTest&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">AddsTwoPositiveNumbers&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Calculator&lt;/span> &lt;span class="n">calc&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">int&lt;/span> &lt;span class="n">result&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">calc&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Add&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPECT_EQ&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">result&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">5&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>इस बिंदु पर, यदि आप निर्माण (build) करने का प्रयास करते हैं, तो &lt;code>Calculator::Add&lt;/code> के कार्यान्वयन की कमी के कारण आपको एक लिंक त्रुटि (link error) मिलेगी, या यदि आप परीक्षण चलाते हैं, तो यह विफल (Red) हो जाएगा।&lt;/p>
&lt;h3 id="32-चरण-2-green-नयनतम-करयनवयन">3.2 चरण 2: Green (न्यूनतम कार्यान्वयन)
&lt;/h3>&lt;p>अब हम केवल परीक्षण पास करने के लिए न्यूनतम कोड लिखेंगे।&lt;/p>
&lt;p>&lt;strong>src/Calculator.cpp&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;#34;Calculator.h&amp;#34;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">int&lt;/span> &lt;span class="n">Calculator&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">Add&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">int&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// टेस्ट पास करने के लिए न्यूनतम कार्यान्वयन
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>यदि आप अब निर्माण करते हैं और परीक्षण चलाते हैं, तो परीक्षण सफल (Green) होगा।&lt;/p>
&lt;h3 id="33-चरण-3-refactor-रफकटरग">3.3 चरण 3: Refactor (रिफैक्टरिंग)
&lt;/h3>&lt;p>इस उदाहरण में, कोड बहुत सरल है, लेकिन जैसे-जैसे आवश्यकताएं अधिक जटिल होती जाती हैं, आप रिफैक्टरिंग चरण के दौरान कोड की पठनीयता (readability) में सुधार कर सकते हैं या प्रदर्शन को बढ़ा सकते हैं। टेस्ट कोड भी रिफैक्टरिंग के अधीन है। उदाहरण के लिए, आप सेटअप लॉजिक को साझा करने के लिए टेस्ट फिक्स्चर (&lt;code>testing::Test&lt;/code>) का उपयोग कर सकते हैं।&lt;/p>
&lt;h2 id="4-expect_eq-और-assert_eq-क-बच-अतर">4. &lt;code>EXPECT_EQ&lt;/code> और &lt;code>ASSERT_EQ&lt;/code> के बीच अंतर
&lt;/h2>&lt;p>GoogleTest का उपयोग करते समय, दो प्रकार के असर्शन मैक्रोज़ (assertion macros) होते हैं: &lt;code>EXPECT_*&lt;/code> और &lt;code>ASSERT_*&lt;/code>। मजबूत परीक्षण लिखने के लिए इनके बीच के अंतर को समझना बहुत महत्वपूर्ण है।&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&lt;code>EXPECT_EQ(expected, actual)&lt;/code>&lt;/strong>: यदि परीक्षण विफल हो जाता है, तो यह वर्तमान परीक्षण फ़ंक्शन का निष्पादन &lt;strong>जारी&lt;/strong> रखता है। यह तब उपयुक्त होता है जब आप एक ही परीक्षण के भीतर कई स्थितियों को सत्यापित करना चाहते हैं।&lt;/li>
&lt;li>&lt;strong>&lt;code>ASSERT_EQ(expected, actual)&lt;/code>&lt;/strong>: यदि परीक्षण विफल हो जाता है, तो यह तुरंत वर्तमान परीक्षण फ़ंक्शन के निष्पादन को &lt;strong>रोक (घातक विफलता)&lt;/strong> देता है। इसका उपयोग तब किया जाता है जब आगे के सत्यापन का कोई अर्थ न हो (उदाहरण के लिए: यह जाँचने के बाद कि पॉइंटर &lt;code>nullptr&lt;/code> नहीं है, उसे डीरेफ़रेंस करना)।&lt;/li>
&lt;/ul>
&lt;h2 id="5-डपडस-इजकशन-di-और-googlemock-क-सथ-मकग">5. डिपेंडेंसी इंजेक्शन (DI) और GoogleMock के साथ मॉकिंग
&lt;/h2>&lt;p>वास्तविक C++ प्रोजेक्ट्स में, बाहरी सिस्टम जैसे डेटाबेस एक्सेस, नेटवर्क संचार, या हार्डवेयर नियंत्रण पर निर्भरता हमेशा मौजूद होती है। यदि इन निर्भरताओं को वैसे ही छोड़ दिया जाए, तो यूनिट टेस्टिंग बहुत मुश्किल हो जाती है।&lt;/p>
&lt;p>यहीं पर &lt;strong>डिपेंडेंसी इंजेक्शन (Dependency Injection: DI)&lt;/strong> और &lt;strong>GoogleMock&lt;/strong> का उपयोग करके इंटरफेस की मॉकिंग काम आती है।&lt;/p>
&lt;pre class="mermaid">
flowchart LR
Test[&amp;#34;यूनिट टेस्ट&amp;#34;] --&amp;gt;|मॉक इंजेक्ट करता है| Target[&amp;#34;लक्ष्य सेवा&amp;#34;]
Target --&amp;gt;|पर निर्भर करता है| Interface[&amp;#34;इंटरफ़ेस (IUserRepository)&amp;#34;]
Mock[&amp;#34;मॉक उपयोगकर्ता रिपॉजिटरी&amp;#34;] -.-&amp;gt;|लागू करता है| Interface
Test --&amp;gt;|कॉन्फ़िगर करता है| Mock
&lt;/pre>
&lt;h3 id="51-इटरफस-क-परभषत-करन-और-लकषय-वरग-क-लग-करन">5.1 इंटरफ़ेस को परिभाषित करना और लक्ष्य वर्ग को लागू करना
&lt;/h3>&lt;p>सबसे पहले, हम निर्भरता (dependency) घटक को अमूर्त (abstract) करने वाला एक इंटरफ़ेस (विशुद्ध रूप से वर्चुअल फ़ंक्शन वाली एक क्लास) परिभाषित करते हैं।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;span class="lnt">8
&lt;/span>&lt;span class="lnt">9
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// include/IUserRepository.h
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="cp">#pragma once
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;string&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">IUserRepository&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">public&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">virtual&lt;/span> &lt;span class="o">~&lt;/span>&lt;span class="n">IUserRepository&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">default&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">virtual&lt;/span> &lt;span class="kt">bool&lt;/span> &lt;span class="nf">SaveUser&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="k">const&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">string&lt;/span>&lt;span class="o">&amp;amp;&lt;/span> &lt;span class="n">name&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>इसके बाद, हम एक सेवा वर्ग (परीक्षण के अधीन) बनाते हैं जो इस इंटरफ़ेस पर निर्भर करता है। हम कंस्ट्रक्टर (Constructor Injection) के माध्यम से निर्भरता को इंजेक्ट करते हैं।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// include/UserService.h
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="cp">#pragma once
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;#34;IUserRepository.h&amp;#34;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;string&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">UserService&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">private&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">IUserRepository&lt;/span>&lt;span class="o">&amp;amp;&lt;/span> &lt;span class="n">repository_&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">public&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">UserService&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">IUserRepository&lt;/span>&lt;span class="o">&amp;amp;&lt;/span> &lt;span class="n">repository&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">:&lt;/span> &lt;span class="n">repository_&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">repository&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">bool&lt;/span> &lt;span class="nf">RegisterUser&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="k">const&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">string&lt;/span>&lt;span class="o">&amp;amp;&lt;/span> &lt;span class="n">name&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">empty&lt;/span>&lt;span class="p">())&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="nb">false&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">repository_&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">SaveUser&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">name&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="52-googlemock-क-उपयग-करक-मक-कलस-बनन-और-परकषण-करन">5.2 GoogleMock का उपयोग करके मॉक क्लास बनाना और परीक्षण करना
&lt;/h3>&lt;p>हम इंटरफ़ेस का मॉक बनाने के लिए GoogleMock के &lt;code>MOCK_METHOD&lt;/code> मैक्रो का उपयोग करेंगे।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;span class="lnt">36
&lt;/span>&lt;span class="lnt">37
&lt;/span>&lt;span class="lnt">38
&lt;/span>&lt;span class="lnt">39
&lt;/span>&lt;span class="lnt">40
&lt;/span>&lt;span class="lnt">41
&lt;/span>&lt;span class="lnt">42
&lt;/span>&lt;span class="lnt">43
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// tests/UserServiceTest.cpp
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;gtest/gtest.h&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;gmock/gmock.h&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;#34;UserService.h&amp;#34;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;#34;IUserRepository.h&amp;#34;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">using&lt;/span> &lt;span class="o">::&lt;/span>&lt;span class="n">testing&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">Return&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">using&lt;/span> &lt;span class="o">::&lt;/span>&lt;span class="n">testing&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">_&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// मॉक क्लास की परिभाषा
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="k">class&lt;/span> &lt;span class="nc">MockUserRepository&lt;/span> &lt;span class="o">:&lt;/span> &lt;span class="k">public&lt;/span> &lt;span class="n">IUserRepository&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">public&lt;/span>&lt;span class="o">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">MOCK_METHOD&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">bool&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">SaveUser&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">id&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="k">const&lt;/span> &lt;span class="n">std&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">string&lt;/span>&lt;span class="o">&amp;amp;&lt;/span> &lt;span class="n">name&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="k">override&lt;/span>&lt;span class="p">));&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">TEST&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">UserServiceTest&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">RegistersValidUserSuccessfully&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">MockUserRepository&lt;/span> &lt;span class="n">mockRepo&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">UserService&lt;/span> &lt;span class="nf">service&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">mockRepo&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// अपेक्षाओं को सेट करना: उम्मीद है कि SaveUser को (1, &amp;#34;Kenji&amp;#34;) के साथ 1 बार बुलाया जाएगा और यह true लौटाएगा
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">EXPECT_CALL&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">mockRepo&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">SaveUser&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;Kenji&amp;#34;&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="n">Times&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="n">WillOnce&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Return&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">true&lt;/span>&lt;span class="p">));&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// लक्ष्य का निष्पादन
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="kt">bool&lt;/span> &lt;span class="n">result&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">service&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">RegisterUser&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;Kenji&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// असर्शन
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">EXPECT_TRUE&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">result&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">TEST&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">UserServiceTest&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">RejectsEmptyNameWithoutCallingRepository&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">MockUserRepository&lt;/span> &lt;span class="n">mockRepo&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">UserService&lt;/span> &lt;span class="nf">service&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">mockRepo&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// खाली नाम के मामले में, उम्मीद है कि SaveUser को कभी नहीं बुलाया जाएगा
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">EXPECT_CALL&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">mockRepo&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">SaveUser&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">_&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">_&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="n">Times&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">bool&lt;/span> &lt;span class="n">result&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">service&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">RegisterUser&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">EXPECT_FALSE&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">result&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>इस तरह GoogleMock का उपयोग करके, हम सटीक रूप से यह सत्यापित कर सकते हैं कि &amp;ldquo;क्या लक्ष्य क्लास अपनी निर्भरताओं के साथ सही ढंग से संपर्क (interact) कर रही है&amp;rdquo;।&lt;/p>
&lt;h2 id="6-कड-कवरज-मपन-और-वजअलइज-करन">6. कोड कवरेज मापना और विज़ुअलाइज़ करना
&lt;/h2>&lt;p>परीक्षण लिखने के बाद, हम निष्पक्ष रूप से यह मूल्यांकन करने के लिए &lt;strong>कोड कवरेज&lt;/strong> मापते हैं कि परीक्षणों द्वारा हमारे प्रोजेक्ट का कौन सा भाग निष्पादित (कवर) किया गया है। कोड कवरेज ($Coverage$) को निम्नलिखित सूत्र द्वारा दर्शाया जाता है:&lt;/p>
$$ Coverage = \left( \frac{L_{executed}}{L_{total}} \right) \times 100 \ (\%) $$&lt;p>यहाँ, $L_{executed}$ परीक्षणों के दौरान निष्पादित कोड लाइनों की संख्या है, और $L_{total}$ संपूर्ण प्रोजेक्ट में कोड लाइनों की कुल संख्या है।&lt;/p>
&lt;p>यदि आप GCC या Clang का उपयोग कर रहे हैं, तो आप कवरेज मापने के लिए &lt;code>gcov&lt;/code> और &lt;code>lcov&lt;/code> टूल का उपयोग कर सकते हैं।&lt;/p>
&lt;h3 id="61-cmake-म-कवरज-वकलप-जडन">6.1 CMake में कवरेज विकल्प जोड़ना
&lt;/h3>&lt;p>कवरेज मापने के लिए, हमें विशिष्ट कंपाइलर झंडे (flags) की आवश्यकता होती है। &lt;code>CMakeLists.txt&lt;/code> में निम्नलिखित सेटिंग्स जोड़ें।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-cmake" data-lang="cmake">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># कवरेज बिल्ड विकल्प
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c">&lt;/span>&lt;span class="nb">option&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">ENABLE_COVERAGE&lt;/span> &lt;span class="s2">&amp;#34;Enable coverage reporting&amp;#34;&lt;/span> &lt;span class="s">OFF&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="nb">if&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">ENABLE_COVERAGE&lt;/span> &lt;span class="s">AND&lt;/span> &lt;span class="s">CMAKE_CXX_COMPILER_ID&lt;/span> &lt;span class="s">MATCHES&lt;/span> &lt;span class="s2">&amp;#34;GNU|Clang&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="nb">message&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">STATUS&lt;/span> &lt;span class="s2">&amp;#34;Coverage enabled&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="nb">target_compile_options&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">core_lib&lt;/span> &lt;span class="s">PRIVATE&lt;/span> &lt;span class="s">--coverage&lt;/span> &lt;span class="s">-O0&lt;/span> &lt;span class="s">-g&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="nb">target_link_options&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">core_lib&lt;/span> &lt;span class="s">PRIVATE&lt;/span> &lt;span class="s">--coverage&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="nb">target_compile_options&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">unit_tests&lt;/span> &lt;span class="s">PRIVATE&lt;/span> &lt;span class="s">--coverage&lt;/span> &lt;span class="s">-O0&lt;/span> &lt;span class="s">-g&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="nb">target_link_options&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">unit_tests&lt;/span> &lt;span class="s">PRIVATE&lt;/span> &lt;span class="s">--coverage&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span>&lt;span class="nb">endif&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="62-कवरज-रपरट-तयर-करन-क-परकरय">6.2 कवरेज रिपोर्ट तैयार करने की प्रक्रिया
&lt;/h3>&lt;p>निर्माण करते समय झंडे को सक्षम करें, परीक्षण चलाएं, और फिर HTML रिपोर्ट उत्पन्न करने के लिए &lt;code>lcov&lt;/code> का उपयोग करें।&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 1. कवरेज विकल्पों को सक्षम करके निर्माण करें&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mkdir build &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> &lt;span class="nb">cd&lt;/span> build
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cmake .. -DENABLE_COVERAGE&lt;span class="o">=&lt;/span>ON
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">make
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 2. परीक्षण चलाएं&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ctest
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 3. कवरेज डेटा एकत्र करें (lcov निष्पादित करें)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">lcov --capture --directory . --output-file coverage.info
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 4. सिस्टम हेडर और बाहरी लाइब्रेरीज़ (GoogleTest आदि) को छोड़ें&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">lcov --remove coverage.info &lt;span class="s1">&amp;#39;/usr/*&amp;#39;&lt;/span> &lt;span class="s1">&amp;#39;*/_deps/*&amp;#39;&lt;/span> &lt;span class="s1">&amp;#39;*/tests/*&amp;#39;&lt;/span> --output-file coverage.info
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 5. HTML रिपोर्ट जनरेट करें&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">genhtml coverage.info --output-directory coverage_report
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>उत्पन्न की गई &lt;code>coverage_report/index.html&lt;/code> को ब्राउज़र में खोलने पर, आप दृश्य रूप से (हरे और लाल रंग में) देख पाएंगे कि कौन सी पंक्तियाँ स्रोत कोड के स्तर पर निष्पादित की गई थीं, जिससे छूटे हुए परीक्षणों (coverage holes) को पहचानने में मदद मिलती है।&lt;/p>
&lt;h2 id="7-c-परजकटस-म-tdd-क-चनतय-और-सरवततम-अभयस">7. C++ प्रोजेक्ट्स में TDD की चुनौतियाँ और सर्वोत्तम अभ्यास
&lt;/h2>&lt;p>जब आप C++ प्रोजेक्ट्स में TDD लागू करते हैं, तो कुछ विशिष्ट चुनौतियाँ आती हैं।&lt;/p>
&lt;h3 id="71-बलड-समय-सकलन-समय-म-वदध">7.1 बिल्ड समय (संकलन समय) में वृद्धि
&lt;/h3>&lt;p>C++ में, टेम्प्लेट (templates) के व्यापक उपयोग और बड़ी हेडर फ़ाइलों के समावेशन के कारण, संकलन (compilation) समय लंबा हो सकता है। चूँकि TDD के &amp;ldquo;Red-Green-Refactor&amp;rdquo; चक्र को जल्दी-जल्दी दोहराने की आवश्यकता होती है, इसलिए बिल्ड समय में देरी घातक हो सकती है।
&lt;strong>समाधान&lt;/strong>: फॉरवर्ड डिक्लेरेशन (Forward Declaration) और Pimpl (Pointer to implementation) इडियम का उपयोग करके हेडर फ़ाइलों की निर्भरता को कम करें। इसके अलावा, Ccache जैसे बिल्ड कैशिंग टूल पेश करना भी प्रभावी हो सकता है।&lt;/p>
&lt;h3 id="72-लगस-कड-म-tdd-क-परचय-दन">7.2 लिगेसी कोड में TDD का परिचय देना
&lt;/h3>&lt;p>मौजूदा बड़े और मोनोलिथिक कोड में बाद में TDD लागू करना अत्यंत कठिन हो सकता है।
&lt;strong>समाधान&lt;/strong>: शुरुआत से सब कुछ फिर से लिखने के बजाय, उन हिस्सों से परीक्षण जोड़ना शुरू करें जहाँ आप नई सुविधाएँ जोड़ रहे हैं या बग फिक्स कर रहे हैं (बॉय स्काउट रूल)। कोडबेस को धीरे-धीरे TDD के नियंत्रण में लाने के दृष्टिकोण (Working Effectively with Legacy Code में वर्णित विधि) की अनुशंसा की जाती है।&lt;/p>
&lt;h2 id="8-सफटवयर-डजइन-क-रप-म-tdd">8. सॉफ्टवेयर डिज़ाइन के रूप में TDD
&lt;/h2>&lt;p>TDD न केवल कोड की गुणवत्ता बनाए रखने के लिए एक सुरक्षा जाल (safety net) है, बल्कि यह C++ कोड डिज़ाइन को बेहतर बनाने वाला एक चालक (driver) भी है। चूंकि परीक्षण लिखने के लिए डिपेंडेंसी इंजेक्शन (DI) को लागू करना आवश्यक हो जाता है, इसके परिणामस्वरूप कक्षाओं के बीच युग्मन (Coupling) कम हो जाता है और सामंजस्य (Cohesion) बढ़ जाता है।&lt;/p>
&lt;p>रिफैक्टरिंग के दौरान, साइक्लोमैटिक जटिलता (McCabe&amp;rsquo;s Cyclomatic Complexity) के प्रति जागरूक होना भी महत्वपूर्ण है।&lt;/p>
$$ M = E - N + 2P $$&lt;p>($M$: जटिलता, $E$: किनारों की संख्या (edges), $N$: नोड्स की संख्या, $P$: जुड़े हुए घटकों की संख्या)&lt;/p>
&lt;p>परीक्षणों के अस्तित्व के कारण, आप जटिलता को कम करने के लिए कार्यों को विभाजित कर सकते हैं या उन्हें पॉलीमॉर्फिज्म से बदल सकते हैं, और यह सब बिना किसी विनाशकारी परिवर्तन के डर के किया जा सकता है।&lt;/p>
&lt;h2 id="नषकरष">निष्कर्ष
&lt;/h2>&lt;p>इस लेख में, हमने विस्तार से बताया है कि C++ प्रोजेक्ट्स में GoogleTest और GoogleMock का उपयोग करके टेस्ट-ड्रिवन डेवलपमेंट (TDD) कैसे लागू किया जाए।&lt;/p>
&lt;ol>
&lt;li>&lt;strong>CMake FetchContent&lt;/strong> का उपयोग करके आधुनिक प्रोजेक्ट संरचना&lt;/li>
&lt;li>&lt;strong>Red-Green-Refactor&lt;/strong> चक्र का अभ्यास&lt;/li>
&lt;li>&lt;strong>GoogleMock और डिपेंडेंसी इंजेक्शन (DI)&lt;/strong> का उपयोग करके इंटरफेस की मॉकिंग&lt;/li>
&lt;li>&lt;strong>gcov/lcov&lt;/strong> के माध्यम से टेस्ट कवरेज का विज़ुअलाइज़ेशन&lt;/li>
&lt;/ol>
&lt;p>हालाँकि TDD को सीखने में समय लग सकता है, लेकिन C++ जैसी सिस्टम प्रोग्रामिंग में, जहाँ प्रदर्शन और सुरक्षा दोनों की आवश्यकता होती है, इसका निवेश पर प्रतिफल (ROI) असीमित है। अपने अगले प्रोजेक्ट से ही धीरे-धीरे TDD का अभ्यास करना शुरू करें और मजबूत और आसानी से मेंटेन होने वाले C++ कोड प्राप्त करें।&lt;/p></description></item></channel></rss>