> 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/unit-testing.md).

# Unit Testing

ধরুন, আপনি অনেক কষ্ট করে একটা ফিচার বানালেন। লোকাল মেশিনে ঠিকঠাক চলে। কিন্তু প্রোডাকশনে গিয়ে ভেঙে গেলো! ডাটাবেসে গোলমাল, কোন একটা ফাংশন ভুল রেজাল্ট দিচ্ছে, আর আপনি ডিবাগ করতে করতে ঘেমে একাকার!

এই ভয়াবহতা থেকে বাঁচার উপায় কী?

উত্তর: Unit Testing — এমন এক জাদুকরী টুল যা আপনার কোডকে নিজেই নিজেকে চেক করতে শেখায়!

Unit Test আপনার কোডের জন্য সেই সতর্ক প্রহরী, যে প্রতিটা ছোট লজিকের উপর চোখ রাখে — যেন কোন বাগ চুপি চুপি ঢুকে না পড়ে।

এটা শুধু একটা টেস্টিং টুল না, এটা একটা মাইন্ডসেট: "আমি এমন কোড লিখি, যা নিজেই জানে সে ঠিকভাবে কাজ করছে।"

***

### Unit Testing আসলে কী?

**Unit Testing** হলো এমন একটি টেকনিক, যেখানে **প্রোগ্রামের প্রতিটি ছোট ইউনিট** — যেমন **function, method, class** — কে **আলাদা করে টেস্ট** করা হয়, যাতে নিশ্চিত হওয়া যায়, এটি সঠিকভাবে কাজ করছে।

> এই টেস্ট গুলো **একেবারেই isolated** হয় — অর্থাৎ ডাটাবেস, API, ফাইল সিস্টেম বা UI এর সাথে কোনো সম্পর্ক থাকে না।

### Unit Test মানে কী?

Unit Test হচ্ছে এমন একটি **automated test**, যা শুধু একটি নির্দিষ্ট **logic** বা **unit**-এর কাজ ঠিকঠাক হচ্ছে কিনা তা যাচাই করে।

#### ইউনিট টেস্ট কেমন হওয়া উচিত:

* Fast (কোনো external system ডিপেন্ড করে না)
* Isolated (একটা ফাংশন বা ক্লাস একাই টেস্ট হয়)
* Repeatable (প্রতিবার একই ফলাফল)
* Deterministic (বাইরের কিছুর কারণে বদলায় না)

### Unit বলতে ঠিক কী বুঝায়?

| Programming Style         | Unit বলতে বুঝায়      |
| ------------------------- | -------------------- |
| Object-Oriented প্রোগ্রাম | একটি method বা class |
| Functional প্রোগ্রাম      | একটি function        |

### কেন Unit Testing করা জরুরি?

**Unit Test** শুধু bug ধরার জন্য নয় — এটা আপনার কোডের ভবিষ্যৎ সুরক্ষাও করে। নিচে দেখুন:

* বাগ শুরুতেই ধরা পড়ে
* কোড structure সুন্দর হয় (modular, reusable)
* নির্ভয়ে কোড পরিবর্তন করতে পারেন (refactor)
* CI/CD তে সুন্দরভাবে integrate হয়
* কোড কীভাবে কাজ করে — সেটা বোঝাতেও সাহায্য করে

### কোন জিনিসগুলো Unit Test-এ রাখা যাবে না?

Unit Test কখনই নিচের কাজগুলো করবে না:

* ডাটাবেজে রিড/রাইট করা
* API কল করা
* UI বা ব্রাউজার ওপেন করা
* ইউজারের ইনপুট/আউটপুট নেওয়া

👉 এই কাজগুলো করা হয়:

* Integration Test
* Feature Test
* End-to-End Test

***

### AAA প্যাটার্ন: Unit Test লেখার সহজ গাইডলাইন

প্রায় সব Unit Test-ই নিচের ৩টি ধাপে লেখা হয়:

1. **Arrange** – দরকারি ডেটা সেটআপ
2. **Act** – ফাংশন/মেথড কল করা
3. **Assert** – ফলাফল যাচাই করা

***

### বিভিন্ন প্রোগ্রামিং ল্যাংগুয়েজে Unit Test-এর উদাহরণ

#### Python

```python
import unittest

def add(a, b):
    return a + b

class TestMath(unittest.TestCase):
    def test_add(self):
        self.assertEqual(add(2, 3), 5)
```

***

#### JavaScript (Jest)

```js
function add(a, b) {
  return a + b;
}

test('adds 2 + 3 to equal 5', () => {
  expect(add(2, 3)).toBe(5);
});
```

***

#### PHP (PHPUnit)

```php
use PHPUnit\Framework\TestCase;

class MathTest extends TestCase {
    public function testAdd() {
        $this->assertEquals(5, add(2, 3));
    }
}
```

***

#### Java (JUnit)

```java
import static org.junit.Assert.assertEquals;
import org.junit.Test;

public class MathTest {
    @Test
    public void testAdd() {
        assertEquals(5, Math.add(2, 3));
    }
}
```

***

### জনপ্রিয় Unit Testing Frameworks

| Language   | Frameworks          |
| ---------- | ------------------- |
| PHP        | PHPUnit, Pest       |
| Python     | unittest, pytest    |
| JavaScript | Jest, Mocha         |
| Java       | JUnit               |
| C#/.NET    | xUnit, NUnit        |
| Ruby       | RSpec               |
| Go         | testing (built-in)  |
| Rust       | cargo test          |
| C/C++      | Google Test (gtest) |

***

### ডাটাবেজ লাগলে সেটা Unit Test হবে?

**না**, যদি আপনার টেস্টে ডাটাবেজে কিছু insert, update, fetch করা লাগে — সেটা আর Unit Test নয়। সেটা হয় **Feature Test** বা **Integration Test**।

👉 **Unit Test = শুধু লজিক** 👉 **Feature Test = DB/API সহ interaction**

***

### Unit Test লেখার বেস্ট প্র্যাকটিস

* টেস্টের নাম clear রাখুন: `testDiscountCalculationIsCorrect`
* ছোট টেস্ট লিখুন — এক টেস্ট এক কাজ
* Reuse করার জন্য `setUp()` বা helper function ব্যবহার করুন
* Mock ব্যবহার করুন যদি কোনো external dependency থাকে
* টেস্ট automate করে দিন (CI/CD pipeline, pre-push hooks)

***

**Unit Test** হলো আপনার কোডের নিরাপত্তার বর্ম। এটা শুধু bug ধরার নয় — ভালো ডেভেলপার হয়ে ওঠার অন্যতম পথ। যারা ভালো টেস্ট লেখে, তারা ভবিষ্যতের কোড maintain করতেও দক্ষ।

> আজ থেকে শুরু করুন ছোট্ট একটা ফাংশনের Unit Test দিয়ে — আপনি ভবিষ্যতের জন্য একটা শক্ত পাথর ফেলে রাখলেন।
