> For the complete documentation index, see [llms.txt](https://mominur.gitbook.io/mominur-notes/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://mominur.gitbook.io/mominur-notes/testing/tdd.md).

# TDD

সফটওয়্যার ডেভেলপমেন্টের বড় একটি চ্যালেঞ্জ হলো – কোড যত বাড়তে থাকে, বাগ খুঁজে বের করা আর ঠিক করা তত কঠিন হয়। আজ নতুন ফিচার লিখলেন, কাল আবার সেই ফিচার অন্য কোথাও সমস্যা তৈরি করলো।

এই সমস্যার সমাধানের জন্য এসেছে **Test Driven Development (TDD)**।

👉 TDD এমন একটি ডেভেলপমেন্ট স্ট্র্যাটেজি যেখানে **টেস্ট আগে, কোড পরে**।\
👉 অর্থাৎ, আগে আপনি লিখবেন – *“*&#x986;মার কোড কী করবে?*”* (Test case)\
👉 তারপর সেই টেস্ট পাস করানোর মতো কোড লিখবেন।

***

### Test Driven Development (TDD) কী?

**TDD** হলো একটি **software development practice** যা মূলত **unit test** ভিত্তিক। এর মূল দর্শন হলো –

> **Don’t write code unless you already have a failing test that requires it.**

অন্যভাবে বললে:

1. Requirement → 2. Test → 3. Code → 4. Refactor

এই ৪ ধাপের মাধ্যমে সফটওয়্যার ধাপে ধাপে তৈরি হয়।

***

### TDD Cycle (Red-Green-Refactor)

TDD মূলত **Red-Green-Refactor cycle** নামক একটি পুনরাবৃত্তিমূলক চক্রে চলে।

1. **Red** – প্রথমে একটি টেস্ট লিখুন।
   * এটি ফেল করবে কারণ এখনো সেই কোড লেখা হয়নি।
   * উদাহরণ: Calculator এর add(2,3) মেথড ৫ রিটার্ন করবে।
2. **Green** – এতটুকু কোড লিখুন যাতে টেস্ট পাস করে।
   * *Just enough code to pass the test*।
3. **Refactor** – টেস্ট সবুজ (পাস) হলে কোডটিকে পরিষ্কার, সুন্দর এবং maintainable করুন।
   * তবে টেস্ট ভাঙা যাবে না।

এই ছোট ছোট চক্রেই পুরো প্রজেক্ট গড়ে ওঠে।

***

### উদাহরণ: Calculator

#### Step 1: টেস্ট লিখি (Red)

{% code lineNumbers="true" %}

```php
public function testAddTwoNumbers()
{
    $calculator = new Calculator();
    $result = $calculator->add(2, 3);
    $this->assertEquals(5, $result);
}
```

{% endcode %}

এখন টেস্ট ফেল করবে কারণ `Calculator` নেই।

***

#### Step 2: কোড লিখি (Green)

{% code lineNumbers="true" %}

```php
class Calculator {
    public function add($a, $b) {
        return $a + $b;
    }
}
```

{% endcode %}

এখন টেস্ট রান করলে পাস করবে।

***

#### Step 3: Refactor

{% code lineNumbers="true" %}

```php
class Calculator {
    public function add(int $a, int $b): int {
        return $a + $b;
    }
}
```

{% endcode %}

কোড আরও clean এবং type-safe হলো।

***

### TDD-তে কোন Test Coverage গুরুত্বপূর্ণ?

TDD-তে প্রধানত ফোকাস করা হয় **Unit Test Coverage**-এ।

* **Unit Test**: ছোট ছোট ফাংশন বা ক্লাস সঠিকভাবে কাজ করছে কিনা দেখা।
* **Integration Test**: আলাদা মডিউলগুলো একসাথে সঠিকভাবে কাজ করছে কিনা (secondary)।
* **System Test / Acceptance Test**: পুরো সিস্টেম expected behavior করছে কিনা (সাধারণত পরে আসে)।

কিন্তু TDD-এর **মূলে আছে Unit Test**।

***

### TDD-এর সুবিধা (Pros)

1. **High Code Quality** – প্রতিটি ছোট ইউনিট টেস্ট করা হয়, ফলে বাগ দ্রুত ধরা পড়ে।
2. **Safe Refactoring** – কোড পরিবর্তন করলে টেস্ট চালিয়ে যাচাই করা যায় কিছু ভাঙলো কিনা।
3. **Better Design** – টেস্ট আগে লিখলে কোড clean, decoupled ও modular হয়।
4. **Less Debugging** – টেস্টে বাগ ধরা পড়ায় ডিবাগিং কম লাগে।
5. **Living Documentation** – টেস্ট কেসগুলোই কোডের ব্যবহার বুঝিয়ে দেয়।

***

### TDD-এর সীমাবদ্ধতা (Cons)

1. **Time-Consuming শুরুতে** – কোড লেখার আগে টেস্ট লেখার কারণে সময় বেশি লাগে।
2. **Learning Curve** – নতুনদের জন্য অভ্যাস করা কঠিন।
3. **Not Practical Everywhere** – UI-heavy বা দ্রুত প্রোটোটাইপ বানানোর প্রজেক্টে TDD ঝামেলা হতে পারে।
4. **Test Maintenance Overhead** – অনেক টেস্ট মেইনটেইন করতে হয়, বিশেষ করে বড় প্রজেক্টে।

***

### কখন TDD ব্যবহার করবেন?

* **Critical business logic** যেখানে বাগ হলে বড় ক্ষতি হতে পারে
* **Long-term project** যেখানে কোড অনেকদিন maintain করতে হবে
* **Large team project** যেখানে consistency দরকার
* **API development** যেখানে ইনপুট/আউটপুট strictভাবে নির্ধারিত

***

**Test Driven Development (TDD)** কেবল একটি কোডিং টেকনিক নয়, বরং একটি **ডেভেলপমেন্ট মাইন্ডসেট**।\
এটি ডেভেলপারকে কোড লেখার আগে ভাবতে বাধ্য করে – আমার কোড কী করবে?

যদিও সব প্রজেক্টে TDD ব্যবহারযোগ্য নয়, কিন্তু যেখানে ব্যবহার করা হয়, সেখানে:\
কোড হয় নির্ভরযোগ্য\
বাগ কম হয়\
এবং ডেভেলপার টিম আত্মবিশ্বাস নিয়ে কাজ করতে পারে

> **Code without tests is a liability, not an asset.**
