Unit Testing in Go (ইউনিট টেস্টিং)

গো প্রোগ্রামিং (Go Programming) - Computer Programming

332

Go-তে Unit Testing (ইউনিট টেস্টিং)

Unit Testing হল একটি প্রোগ্রামিং কৌশল যা ফাংশন বা কোডের নির্দিষ্ট অংশের কার্যকারিতা পরীক্ষা করে। ইউনিট টেস্টিং কোডের প্রতিটি ইউনিটের (ফাংশন, মেথড, ক্লাস ইত্যাদি) আচরণ সঠিক কিনা তা নিশ্চিত করে। Go তে ইউনিট টেস্টিং করার জন্য testing প্যাকেজ ব্যবহৃত হয়। এটি সহজ, কার্যকর এবং কোডের নির্ভুলতা নিশ্চিত করার একটি গুরুত্বপূর্ণ প্রক্রিয়া।


১. Go তে Testing প্যাকেজ

Go তে ইউনিট টেস্ট লেখার জন্য testing প্যাকেজটি ব্যবহার করা হয়। এই প্যাকেজটি টেস্ট চালানোর জন্য ফাংশনগুলো সরবরাহ করে এবং টেস্টের ফলাফল দেখায়। এটি go test কমান্ডের মাধ্যমে রান করা হয়।

১.১ Unit Test ফাংশন ডিফাইন করা

Go তে একটি টেস্ট ফাংশন লিখতে, আপনাকে ফাংশনটির নাম Test দিয়ে শুরু করতে হবে এবং এটি *testing.T টাইপের প্যারামিটার নিবে।

package main

import "testing"

// যোগফল দেওয়ার একটি ফাংশন
func Add(a, b int) int {
    return a + b
}

// টেস্ট ফাংশন
func TestAdd(t *testing.T) {
    result := Add(2, 3)
    if result != 5 {
        t.Errorf("Add(2, 3) = %d; want 5", result)
    }
}

এখানে, TestAdd একটি টেস্ট ফাংশন যা Add ফাংশনের কার্যকারিতা পরীক্ষা করবে। যদি Add(2, 3) এর ফলাফল 5 না হয়, তবে টেস্ট ব্যর্থ হবে এবং ত্রুটি প্রদর্শন করবে।


২. Unit Test চালানো

Go তে টেস্ট চালানোর জন্য go test কমান্ড ব্যবহার করা হয়।

go test

এই কমান্ডটি আপনার বর্তমান ডিরেক্টরিতে থাকা সমস্ত টেস্ট ফাইল (*_test.go) পরীক্ষা করবে এবং তাদের ফলাফল প্রদর্শন করবে।

২.১ Unit Test এর আউটপুট

যদি টেস্টটি সফল হয়:

PASS
ok      mymodule    0.003s

এবং যদি টেস্ট ব্যর্থ হয়:

--- FAIL: TestAdd (0.00s)
    main_test.go:12: Add(2, 3) = 6; want 5
FAIL
exit status 1
FAIL    mymodule    0.003s

৩. Multiple Test Functions

একাধিক টেস্ট ফাংশন তৈরি করা যায় যাতে আপনি বিভিন্ন ফাংশন বা কোডের অংশ পরীক্ষা করতে পারেন।

package main

import "testing"

// একটি ফাংশন যা দুটি সংখ্যা যোগ করে
func Add(a, b int) int {
    return a + b
}

// একটি ফাংশন যা দুটি সংখ্যা বিয়োগ করে
func Subtract(a, b int) int {
    return a - b
}

// টেস্ট ফাংশন যা Add পরীক্ষা করবে
func TestAdd(t *testing.T) {
    result := Add(2, 3)
    if result != 5 {
        t.Errorf("Add(2, 3) = %d; want 5", result)
    }
}

// টেস্ট ফাংশন যা Subtract পরীক্ষা করবে
func TestSubtract(t *testing.T) {
    result := Subtract(5, 3)
    if result != 2 {
        t.Errorf("Subtract(5, 3) = %d; want 2", result)
    }
}

এখানে, TestAdd এবং TestSubtract দুটি আলাদা টেস্ট ফাংশন তৈরি করা হয়েছে যা Add এবং Subtract ফাংশনগুলো পরীক্ষা করবে।


৪. Test Table-Driven Tests

Go তে table-driven tests একটি জনপ্রিয় কৌশল, যেখানে বিভিন্ন ইনপুট এবং প্রত্যাশিত আউটপুট একটি টেবিল (slice) হিসেবে রাখা হয় এবং তার উপর ভিত্তি করে টেস্ট করা হয়। এটি একাধিক টেস্ট কেস একটি টেবিলের মাধ্যমে সিম্পলভাবে পরিচালনা করার একটি উপায়।

৪.১ Table-Driven Test Example

package main

import "testing"

// যোগফল ফাংশন
func Add(a, b int) int {
    return a + b
}

// Table-driven টেস্ট ফাংশন
func TestAdd(t *testing.T) {
    tests := []struct {
        a, b, sum int
    }{
        {1, 2, 3},
        {3, 4, 7},
        {5, 5, 10},
    }

    for _, test := range tests {
        result := Add(test.a, test.b)
        if result != test.sum {
            t.Errorf("Add(%d, %d) = %d; want %d", test.a, test.b, result, test.sum)
        }
    }
}

এখানে, tests slice এর মধ্যে তিনটি টেস্ট কেস সংরক্ষণ করা হয়েছে এবং সেগুলির উপর ভিত্তি করে Add ফাংশনের টেস্ট করা হচ্ছে।


৫. Test Assertions

Go-তে assertions ব্যবহারের জন্য সাধারণত কোনো লাইব্রেরি প্রয়োজন হয়, যেমন github.com/stretchr/testify/assert। তবে, Go এর testing প্যাকেজ স্বয়ংক্রিয়ভাবে assertion এর মত কাজ করে। যখনই কোনো টেস্ট ব্যর্থ হয়, তখন তা রিপোর্ট করা হয়।

৫.১ Test Assertions Example using testify/assert

go get github.com/stretchr/testify/assert
package main

import (
    "github.com/stretchr/testify/assert"
    "testing"
)

// একটি ফাংশন যা দুটি সংখ্যা যোগ করে
func Add(a, b int) int {
    return a + b
}

// Assert ব্যবহার করে টেস্ট ফাংশন
func TestAdd(t *testing.T) {
    result := Add(2, 3)
    assert.Equal(t, 5, result, "They should be equal")
}

এখানে, assert.Equal ব্যবহার করা হয়েছে যা সহজভাবে চেক করবে যে দুটি মান সমান কিনা এবং সঠিক বার্তা প্রদর্শন করবে।


৬. Benchmarking

Go তে benchmarking হল ফাংশনের পারফরম্যান্স পরিমাপের প্রক্রিয়া। আপনি একটি ফাংশনের কার্যকারিতা বা পারফরম্যান্স নির্ধারণ করতে benchmark tests ব্যবহার করতে পারেন।

৬.১ Benchmark Example

package main

import "testing"

// একটি ফাংশন যা দুটি সংখ্যা যোগ করে
func Add(a, b int) int {
    return a + b
}

// Benchmark ফাংশন
func BenchmarkAdd(b *testing.B) {
    for i := 0; i < b.N; i++ {
        Add(2, 3)
    }
}

এখানে, BenchmarkAdd ফাংশনটি Add ফাংশনের পারফরম্যান্স পরিমাপ করবে। b.N ব্যবহার করে ফাংশনটি নির্দিষ্ট সংখ্যক বার চালানো হবে।

৬.২ Benchmark Run

go test -bench .

এটি আপনার প্রোজেক্টে সব benchmark টেস্ট চালাবে এবং তাদের ফলাফল দেখাবে।


সারসংক্ষেপ

  • Unit Testing: Go তে ইউনিট টেস্টিং করতে testing প্যাকেজ ব্যবহৃত হয় এবং টেস্ট ফাংশনগুলি Test দিয়ে শুরু হয়।
  • Table-Driven Tests: Go-তে টেবিল ড্রাইভেন টেস্টিং জনপ্রিয় পদ্ধতি, যেখানে একাধিক টেস্ট কেস একটি স্লাইসে রাখা হয়।
  • Assertions: testify/assert লাইব্রেরি দিয়ে সহজভাবে assertions করা যায়।
  • Benchmarking: Go তে ফাংশনের পারফরম্যান্স মাপার জন্য benchmark tests ব্যবহার করা যায়।

Go তে Unit Testing এবং Benchmarking ব্যবহারের মাধ্যমে আপনি আপনার কোডের কার্যকারিতা, নির্ভুলতা এবং পারফরম্যান্স সুনির্দিষ্টভাবে যাচাই করতে পারবেন।

Content added By

Go-তে Unit Testing এর জন্য testing প্যাকেজ

Go প্রোগ্রামিং ভাষায় unit testing কোডের বিভিন্ন অংশের কার্যকারিতা পরীক্ষা করার একটি গুরুত্বপূর্ণ প্রক্রিয়া। Go Testing Framework সহজ এবং শক্তিশালী। Go তে ইউনিট টেস্ট লেখার জন্য প্রধানত testing প্যাকেজ ব্যবহার করা হয়। এই প্যাকেজটি দিয়ে আপনি সহজেই বিভিন্ন ফাংশন এবং মেথডের কার্যকারিতা যাচাই করতে পারেন।

Go-তে unit test লেখার জন্য দুটি গুরুত্বপূর্ণ ফাংশন থাকে:

  • t.Error(): যখন কোনো টেস্ট ফেইল করে, তখন এটি ব্যবহার করা হয়।
  • t.Fatal(): এটি ফেইল হওয়ার পর টেস্ট সম্পূর্ণভাবে থামিয়ে দেয়।

এই টিউটোরিয়ালে আমরা দেখব কিভাবে testing প্যাকেজ ব্যবহার করে Go-তে unit tests লেখা হয়।


১. Testing প্যাকেজের মাধ্যমে Unit Test তৈরি করা

১.১ Basic Unit Test উদাহরণ

ধরা যাক, একটি ফাংশন রয়েছে যেটি দুটি সংখ্যার যোগফল প্রদান করে। আমরা এই ফাংশনটির জন্য একটি unit test তৈরি করব।

package main

import "testing"

// ফাংশন যা দুটি সংখ্যা যোগফল প্রদান করবে
func Add(a, b int) int {
    return a + b
}

// Unit Test ফাংশন
func TestAdd(t *testing.T) {
    result := Add(2, 3)
    expected := 5

    if result != expected {
        t.Errorf("Expected %d, but got %d", expected, result)
    }
}

এখানে, TestAdd একটি unit test যা Add ফাংশনের কার্যকারিতা পরীক্ষা করছে। আমরা চেক করছি যে Add(2, 3) এর ফলাফল 5 হওয়া উচিত। যদি ফলাফল প্রত্যাশিত মানের সাথে মেলে না, তবে t.Errorf() কল করা হয়।

১.২ Unit Test রান করা

Go-তে unit test রান করার জন্য কমান্ড লাইন থেকে go test ব্যবহার করা হয়:

go test

এটি বর্তমান প্যাকেজের সমস্ত টেস্ট রান করবে এবং টেস্টের ফলাফল দেখাবে।

আউটপুট:

PASS
ok      <your-package-name>    0.001s

এখানে, PASS দেখাচ্ছে যে টেস্টটি সফলভাবে সম্পন্ন হয়েছে।


২. Multiple Tests

একাধিক টেস্ট একসঙ্গে লেখা এবং পরীক্ষা করা সহজ। প্রতিটি টেস্ট ফাংশন আলাদা নামে থাকা উচিত এবং প্রতিটি ফাংশন t *testing.T গ্রহণ করে।

২.১ Multiple Tests উদাহরণ

package main

import "testing"

// ফাংশন যা দুটি সংখ্যা যোগফল প্রদান করবে
func Add(a, b int) int {
    return a + b
}

// ফাংশন যা দুটি সংখ্যা বিয়োগফল প্রদান করবে
func Subtract(a, b int) int {
    return a - b
}

// Unit Test 1
func TestAdd(t *testing.T) {
    result := Add(2, 3)
    expected := 5
    if result != expected {
        t.Errorf("Expected %d, but got %d", expected, result)
    }
}

// Unit Test 2
func TestSubtract(t *testing.T) {
    result := Subtract(5, 3)
    expected := 2
    if result != expected {
        t.Errorf("Expected %d, but got %d", expected, result)
    }
}

এখানে দুটি ফাংশন Add এবং Subtract এর জন্য আলাদা টেস্ট তৈরি করা হয়েছে।

টেস্ট রান করার জন্য কমান্ড:

go test

আউটপুট:

PASS
ok      <your-package-name>    0.001s

এটি দুটি টেস্ট রান করবে এবং সফল হলে PASS দেখাবে।


৩. Error Handling in Tests

টেস্টের মধ্যে ত্রুটি ঘটলে আপনি t.Error() বা t.Fatal() ব্যবহার করতে পারেন।

  • t.Error(): টেস্ট চলতে থাকা অবস্থায় ত্রুটি রিপোর্ট করে।
  • t.Fatal(): টেস্ট চলাকালীন ত্রুটি ঘটলে টেস্ট সম্পূর্ণভাবে থামিয়ে দেয়।

৩.১ Error Handling Example

package main

import "testing"

// ফাংশন যা দুটি সংখ্যা যোগফল প্রদান করবে
func Add(a, b int) int {
    return a + b
}

// Unit Test with t.Error()
func TestAddWithError(t *testing.T) {
    result := Add(2, 3)
    expected := 6

    if result != expected {
        t.Error("Expected", expected, "but got", result)
    }
}

// Unit Test with t.Fatal()
func TestAddWithFatal(t *testing.T) {
    result := Add(2, 3)
    expected := 6

    if result != expected {
        t.Fatal("Test failed:", result)
    }
}

এখানে:

  • TestAddWithError: যদি কোনো ত্রুটি হয়, তাহলে t.Error() ব্যবহার করা হবে, এবং টেস্টের পরবর্তী কাজ চালু থাকবে।
  • TestAddWithFatal: যদি কোনো ত্রুটি হয়, তাহলে t.Fatal() ব্যবহার করা হবে, এবং টেস্ট সম্পূর্ণভাবে থামিয়ে দেওয়া হবে।

৪. Test Table-Driven Tests

Go তে টেস্টিংয়ের জন্য table-driven tests একটি জনপ্রিয় প্যাটার্ন, যেখানে একাধিক ইনপুট এবং প্রত্যাশিত আউটপুটের উপর ভিত্তি করে একাধিক টেস্ট তৈরি করা হয়।

৪.১ Table-Driven Tests Example

package main

import "testing"

// ফাংশন যা দুটি সংখ্যা যোগফল প্রদান করবে
func Add(a, b int) int {
    return a + b
}

// Table-Driven Test Example
func TestAddTableDriven(t *testing.T) {
    tests := []struct {
        a, b     int
        expected int
    }{
        {1, 2, 3},
        {2, 3, 5},
        {3, 4, 7},
        {10, 20, 30},
    }

    for _, tt := range tests {
        t.Run(fmt.Sprintf("%d+%d", tt.a, tt.b), func(t *testing.T) {
            result := Add(tt.a, tt.b)
            if result != tt.expected {
                t.Errorf("Expected %d, but got %d", tt.expected, result)
            }
        })
    }
}

এখানে, আমরা একটি table-driven test ব্যবহার করেছি যা বিভিন্ন ইনপুট এবং প্রত্যাশিত আউটপুটের উপর ভিত্তি করে একাধিক টেস্ট রান করবে।


৫. Benchmark Tests

Go তে benchmark tests ব্যবহার করে আপনি আপনার কোডের পারফরম্যান্স পরীক্ষা করতে পারেন। এটি testing.B টাইপের মাধ্যমে করা হয়।

৫.১ Benchmark Example

package main

import "testing"

// Function to benchmark
func Add(a, b int) int {
    return a + b
}

// Benchmark Test
func BenchmarkAdd(b *testing.B) {
    for i := 0; i < b.N; i++ {
        Add(2, 3)
    }
}

এখানে, BenchmarkAdd ফাংশনটি Add ফাংশনের পারফরম্যান্স টেস্ট করে। b.N দ্বারা কতবার টেস্টটি রান করবে তা নির্ধারণ করা হয়।

Benchmark টেস্ট রান করতে:

go test -bench .

এটি পারফরম্যান্স টেস্ট রান করবে এবং ফলাফল দেখাবে।


৬. Test Coverage

Go তে টেস্ট কভারেজ পরিমাপ করতে go test -cover কমান্ড ব্যবহার করা হয়। এটি আপনার কোডের কতটা অংশ টেস্ট করা হয়েছে তা নির্ধারণ করে।

৬.১ Test Coverage Example

go test -cover

এটি টেস্ট রান করার পর, আপনার কোডের কত শতাংশ অংশ টেস্ট হয়েছে তা দেখাবে।


সারসংক্ষেপ

  • Unit Test: Go তে ইউনিট টেস্ট লেখার জন্য testing প্যাকেজ ব্যবহৃত হয়।
  • Error Handling: t.Error() এবং t.Fatal() দিয়ে error handle করা হয়।
  • Table-Driven Tests: একাধিক ইনপুট এবং আউটপুটের জন্য table-driven tests ব্যবহার করা হয়।
  • Benchmark Tests: কোডের পারফরম্যান্স পরীক্ষা করার জন্য benchmark tests ব্যবহার করা হয়।
  • Test Coverage: go test -cover কমান্ড দিয়ে টেস্ট কভারেজ পরিমাপ করা হয়।

Go-তে unit testing খুবই সহজ এবং শক্তিশালী, যা কোডের গুণগত মান এবং কার্যকারিতা নিশ্চিত করতে সাহায্য করে।

Content added By

Go-তে Test Cases এবং Test Functions লেখা

Go তে unit testing করার জন্য testing প্যাকেজ ব্যবহার করা হয়। টেস্ট ফাংশনগুলো সাধারণত একটি ফাংশন বা কোডের একটি নির্দিষ্ট অংশের আচরণ পরীক্ষা করার জন্য লেখা হয়। Go তে টেস্ট ফাংশন লেখার সময় কিছু মৌলিক কনভেনশন অনুসরণ করা হয়, যেমন টেস্ট ফাংশনের নাম Test দিয়ে শুরু করা হয় এবং সেটি t *testing.T প্যারামিটার গ্রহণ করে।

এখানে আমরা দেখব কিভাবে Test Cases এবং Test Functions লেখা হয় এবং কিভাবে এগুলি রান করা হয়।


১. Test Functions (টেস্ট ফাংশন)

Go-তে Test Function হল সেই ফাংশন যা নির্দিষ্ট কোডের কার্যকারিতা পরীক্ষা করার জন্য লেখা হয়। একটি টেস্ট ফাংশন অবশ্যই Test দিয়ে শুরু হবে এবং এটি t *testing.T প্যারামিটার গ্রহণ করবে, যার মাধ্যমে টেস্ট রিপোর্ট এবং ফলাফল সংগ্রহ করা হয়।

১.১ Test Function লেখার সাধারণ রূপ

package main

import (
    "testing"
)

// সাধারণ ফাংশন যা যোগফল ফেরত দিবে
func Add(a, b int) int {
    return a + b
}

// Test Function যা Add ফাংশন পরীক্ষা করবে
func TestAdd(t *testing.T) {
    result := Add(2, 3)
    expected := 5

    if result != expected {
        t.Errorf("Add(2, 3) = %d; want %d", result, expected)
    }
}

এখানে:

  • TestAdd: এটি একটি টেস্ট ফাংশন যা Add ফাংশনের কার্যকারিতা পরীক্ষা করে। যদি ফলাফল প্রত্যাশিত মানের সাথে মিল না খায়, তাহলে t.Errorf ব্যবহার করে একটি ত্রুটি রিপোর্ট করা হয়।
  • t *testing.T: এটি টেস্টিং প্যাকেজের একটি প্যারামিটার, যা টেস্ট ফলাফল রিপোর্ট করতে ব্যবহৃত হয়।

১.২ আরও উদাহরণ

package main

import (
    "testing"
)

// Divide ফাংশন যা দুটি সংখ্যার ভাগফল প্রদান করবে
func Divide(a, b int) (int, error) {
    if b == 0 {
        return 0, fmt.Errorf("cannot divide by zero")
    }
    return a / b, nil
}

// Test Function যা Divide ফাংশন পরীক্ষা করবে
func TestDivide(t *testing.T) {
    tests := []struct {
        a, b     int
        expected int
        err      error
    }{
        {10, 2, 5, nil},
        {20, 4, 5, nil},
        {10, 0, 0, fmt.Errorf("cannot divide by zero")},
    }

    for _, tt := range tests {
        result, err := Divide(tt.a, tt.b)
        if err != nil && err.Error() != tt.err.Error() {
            t.Errorf("Divide(%d, %d) = error: %v; want %v", tt.a, tt.b, err, tt.err)
        }
        if result != tt.expected {
            t.Errorf("Divide(%d, %d) = %d; want %d", tt.a, tt.b, result, tt.expected)
        }
    }
}

এখানে:

  • Divide ফাংশনটি দুটি সংখ্যা ভাগ করে এবং যদি দ্বিতীয় সংখ্যা শূন্য হয়, তবে একটি error ফেরত দেয়।
  • TestDivide ফাংশনে একাধিক test case তৈরি করা হয়েছে যা ভিন্ন ইনপুটের জন্য Divide ফাংশনটি পরীক্ষা করে।

২. Test Cases (টেস্ট কেস)

Test Case হল টেস্ট ফাংশনের মধ্যে আলাদা আলাদা ইনপুট এবং প্রত্যাশিত আউটপুটের সেট। আপনি একাধিক টেস্ট কেস তৈরি করতে পারেন এবং একটি ফাংশনের ভিন্ন ভিন্ন অবস্থায় পরীক্ষা করতে পারেন। এটি টেস্ট ফাংশনের মধ্যে লজিক তৈরি করতে সহায়তা করে।

২.১ Test Case উদাহরণ

package main

import (
    "testing"
)

// Multiply ফাংশন যা দুটি সংখ্যার গুণফল প্রদান করবে
func Multiply(a, b int) int {
    return a * b
}

// Test Function যা Multiply ফাংশন পরীক্ষা করবে
func TestMultiply(t *testing.T) {
    tests := []struct {
        a, b     int
        expected int
    }{
        {2, 3, 6},
        {4, 5, 20},
        {6, 7, 42},
    }

    for _, tt := range tests {
        result := Multiply(tt.a, tt.b)
        if result != tt.expected {
            t.Errorf("Multiply(%d, %d) = %d; want %d", tt.a, tt.b, result, tt.expected)
        }
    }
}

এখানে:

  • Test Cases হিসাবে {2, 3, 6}, {4, 5, 20}, {6, 7, 42} ইত্যাদি ইনপুট এবং প্রত্যাশিত আউটপুটের প্যারামিটার ব্যবহার করা হয়েছে।
  • প্রতিটি টেস্ট কেসের জন্য Multiply ফাংশনটি পরীক্ষা করা হচ্ছে এবং যদি ফলাফল প্রত্যাশিত না হয়, তাহলে ত্রুটি রিপোর্ট করা হচ্ছে।

৩. Test Functions এবং Test Cases চালানো

Go তে টেস্ট চালাতে go test কমান্ড ব্যবহার করা হয়। এটি স্বয়ংক্রিয়ভাবে আপনার টেস্ট ফাইলগুলো পরীক্ষা করে এবং ফলাফল দেখায়।

৩.১ Go Test চালানো

go test

এটি আপনার প্রোজেক্টের সবগুলো টেস্ট ফাংশন চালাবে এবং টেস্ট ফলাফল প্রদর্শন করবে।

৩.২ অন্তর্নিহিত টেস্ট ফলাফল

আপনি টেস্টের বিস্তারিত ফলাফল দেখতে -v ফ্ল্যাগ ব্যবহার করতে পারেন:

go test -v

এটি পরীক্ষিত ফাংশনের নাম এবং তার ফলাফল দেখাবে।

৩.৩ বিশেষ টেস্ট ফাংশন রান করা

আপনি যদি একটি নির্দিষ্ট টেস্ট ফাংশন চালাতে চান, তাহলে -run ফ্ল্যাগ ব্যবহার করতে পারেন:

go test -run TestAdd

এটি শুধুমাত্র TestAdd ফাংশনটি চালাবে।


৪. Benchmarking and Performance Testing

Go-তে আপনি performance testing বা benchmarking করতে পারেন। এটি কোডের কার্যকারিতা পরীক্ষা করে এবং কোন অংশটি অপটিমাইজ করতে হবে তা নির্ধারণ করতে সাহায্য করে। আপনি testing.B প্যারামিটার ব্যবহার করে এটি করতে পারেন।

৪.১ Benchmark Example

package main

import (
    "testing"
)

func BenchmarkAdd(b *testing.B) {
    for i := 0; i < b.N; i++ {
        Add(2, 3)
    }
}

func BenchmarkMultiply(b *testing.B) {
    for i := 0; i < b.N; i++ {
        Multiply(2, 3)
    }
}

এখানে, BenchmarkAdd এবং BenchmarkMultiply ফাংশন দুটি কর্মক্ষমতা পরীক্ষা করতে ব্যবহৃত হবে। b.N মানটি টেস্টের সংখ্যাকে নির্দেশ করে, যা Go স্বয়ংক্রিয়ভাবে সঠিকভাবে নির্ধারণ করবে।

৪.২ Benchmark চালানো

go test -bench .

এটি সব benchmark ফাংশন চালাবে এবং কর্মক্ষমতা ফলাফল প্রদর্শন করবে।


সারসংক্ষেপ

  • Test Functions: Go তে টেস্ট ফাংশনগুলি Test দিয়ে শুরু হয় এবং t *testing.T প্যারামিটার গ্রহণ করে। এগুলি নির্দিষ্ট ফাংশনের কার্যকারিতা পরীক্ষা করে।
  • Test Cases: একাধিক টেস্ট কেস তৈরি করা হয় যা বিভিন্ন ইনপুট এবং প্রত্যাশিত আউটপুটের সাথে পরীক্ষা করে।
  • Benchmarking: Go তে কর্মক্ষমতা পরীক্ষার জন্য benchmarking করা যায়, যা কোডের কার্যকারিতা মূল্যায়ন করতে সাহায্য করে।
  • Go Test: go test কমান্ড ব্যবহার করে টেস্ট চালানো হয় এবং এর ফলাফল পাওয়া যায়।

Go তে ইউনিট টেস্টিং কোডের সঠিকতা নিশ্চিত করার জন্য একটি অত্যন্ত গুরুত্বপূর্ণ পদ্ধতি, এবং এটি আপনাকে কোডের কার্যকারিতা এবং নির্ভুলতা বজায় রাখতে সাহায্য করে।

Content added By

Go-তে Benchmarks এবং Performance Testing (পারফরম্যান্স টেস্টিং)

Benchmarking এবং Performance Testing হলো কোডের কার্যকারিতা (performance) পরিমাপ করার প্রক্রিয়া, যা সাধারণত কোডের কার্যক্ষমতা এবং গতিবেগ বুঝতে সহায়তা করে। Go তে, Benchmarking খুবই সহজ এবং শক্তিশালী। Go তে benchmarks মূলত testing প্যাকেজের মাধ্যমে লেখা হয়, যেখানে আপনি ফাংশনগুলোর কার্যকারিতা পরিমাপ করতে পারেন।


১. Benchmarking এর জন্য Test Function

Go তে benchmarking টেস্টিং করার জন্য একটি বিশেষ ফাংশন ব্যবহার করা হয়, যার নাম **Benchmark**। Benchmark ফাংশনগুলি সাধারণত testing.B প্যারামিটার গ্রহণ করে এবং কোডের কার্যক্ষমতা (performance) পরিমাপ করে।

১.১ Benchmark Function এর সিনট্যাক্স

Go-তে benchmarking ফাংশন লিখতে, আপনাকে testing.B প্যারামিটার ব্যবহার করতে হয় এবং b.N এর সাথে কাজ করতে হয়। b.N হল যে সংখ্যক বার কোডটি চালাতে হবে তা নির্ধারণ করে।

package main

import (
    "fmt"
    "testing"
)

// Add ফাংশনটি benchmarking এর জন্য
func Add(a, b int) int {
    return a + b
}

// Benchmark Function
func BenchmarkAdd(b *testing.B) {
    for i := 0; i < b.N; i++ {
        Add(10, 20)
    }
}

এখানে:

  • BenchmarkAdd ফাংশনটি একটি benchmarking test function।
  • b.N মানে হলো, Go benchmarking ফ্রেমওয়ার্ক কোডটি N সংখ্যক বার চালাবে।
  • testing.B প্যারামিটার ব্যবহার করে আপনি benchmarking এর সময় এবং কার্যক্ষমতা মাপতে পারেন।

২. Benchmarking চালানো

Go তে benchmarking চালানোর জন্য আপনি go test কমান্ড ব্যবহার করেন, তবে -bench ফ্ল্যাগ দিয়ে আপনি benchmarking পরীক্ষাটি চালাতে পারেন।

go test -bench .

এটি সমস্ত benchmarking টেস্ট চালাবে এবং এর ফলাফল দেখাবে। আপনি নির্দিষ্ট benchmark ফাংশনও পরীক্ষা করতে পারেন:

go test -bench BenchmarkAdd

২.১ Benchmarking ফলাফল

যখন আপনি benchmarking চালান, Go একটি টেস্ট চালানোর সময় সময়ের পরিমাপ করে এবং এর ফলাফল প্রদর্শন করে।

আউটপুট উদাহরণ:

goos: linux
goarch: amd64
pkg: example.com/mymodule
cpu: Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz
BenchmarkAdd-8    1000000000  0.26 ns/op
PASS
ok      example.com/mymodule  1.324s

এখানে:

  • BenchmarkAdd-8 হল benchmark ফাংশন এবং 1000000000 মানে হল কতবার এই ফাংশনটি পরীক্ষিত হয়েছে।
  • 0.26 ns/op মানে ফাংশনটি প্রতি অপারেশনে কত সময় নিয়েছে (nanoseconds per operation)।

৩. Benchmarking এর Performance Metrics

Go তে benchmarking থেকে বিভিন্ন পারফরম্যান্স মেট্রিক পাওয়া যায়। এগুলির মধ্যে গুরুত্বপূর্ণ মেট্রিক হলো:

  • ns/op: প্রতি অপারেশন সম্পন্ন করতে কত ন্যানোসেকেন্ড সময় নিয়েছে।
  • B/op: প্রতি অপারেশনে কত বাইট ব্যবহার হয়েছে (উপলব্ধি করতে হলে বাইট সাইজ মাপা হয়)।
  • allocs/op: প্রতি অপারেশন সম্পন্ন করতে কত বার মেমরি অ্যালোকেশন হয়েছে।

৩.১ Benchmarking-এ Memory Allocation মাপা

যদি আপনি মেমরি অ্যালোকেশন সম্পর্কিত পারফরম্যান্স টেস্ট করতে চান, তাহলে b.ReportAllocs() ব্যবহার করতে পারেন:

func BenchmarkAdd(b *testing.B) {
    b.ReportAllocs()  // মেমরি অ্যালোকেশন রিপোর্ট
    for i := 0; i < b.N; i++ {
        Add(10, 20)
    }
}

এটি প্রতিটি অপারেশনে মেমরি ব্যবহারের প্রতিবেদন করবে। উদাহরণস্বরূপ, এটি একটি মেমরি ব্যবহার সংক্রান্ত পরিসংখ্যান দেখাতে পারে, যেমন:

BenchmarkAdd-8       1000000000      0.30 ns/op        0 B/op         0 allocs/op

৪. Parallel Benchmarking

Go তে আপনি parallel benchmarking করতে পারেন, যেখানে একই সময় একাধিক গোরাউটিনের মাধ্যমে benchmarking পরীক্ষা করা হয়। এটি benchmarking এর সময় কমাতে সহায়তা করে এবং কোডের প্রতিটি অংশে কীভাবে পারফর্ম করছে তা বুঝতে সাহায্য করে।

৪.১ Parallel Benchmarking Example

func BenchmarkAddParallel(b *testing.B) {
    b.ReportAllocs()
    b.RunParallel(func(pb *testing.PB) {
        for pb.Next() {
            Add(10, 20)
        }
    })
}

এখানে, b.RunParallel ফাংশনটি একটি গোরাউটিনে কোডটি একাধিক বার চালাবে এবং পারফরম্যান্স পরিমাপ করবে।


৫. Go-তে Performance Testing

Performance Testing মূলত আপনার প্রোগ্রামের পারফরম্যান্স নির্ধারণের জন্য একটি প্রক্রিয়া, যেখানে আপনি কোডের বিভিন্ন অংশের কর্মক্ষমতা এবং কার্যকারিতা মাপেন। এটি কোডের বটমলাইন পারফরম্যান্স এবং দক্ষতা বের করার জন্য গুরুত্বপূর্ণ।

৫.১ Performance Testing এর জন্য Benchmarking

Go তে benchmarking মূলত performance testing এর অংশ। আপনি প্রতিটি ফাংশন বা মেথডের পারফরম্যান্স মাপার জন্য benchmark test লিখে সেই অনুযায়ী কোডের সময় এবং কার্যক্ষমতা পরিমাপ করতে পারেন।


সারসংক্ষেপ

  • Benchmarking: Go তে benchmarking এর মাধ্যমে আপনি কোডের কার্যক্ষমতা মাপতে পারেন। এটি testing.B প্যারামিটার দ্বারা পরিচালিত হয়।
  • Benchmarking Metrics: ns/op, B/op, allocs/op ইত্যাদি মেট্রিক্সের মাধ্যমে benchmarking ফলাফল মাপা হয়।
  • Parallel Benchmarking: b.RunParallel এর মাধ্যমে একাধিক গোরাউটিনে benchmarking করা যায়, যা পারফরম্যান্স টেস্টিং দ্রুত করে।
  • Performance Testing: Go তে performance testing benchmarking এর মাধ্যমে কার্যকরভাবে করা যায়, যেখানে কোডের প্রতিটি অংশের কার্যক্ষমতা পরিমাপ করা হয়।

Go তে Benchmarking এবং Performance Testing কোডের কর্মক্ষমতা নির্ধারণের জন্য গুরুত্বপূর্ণ। এটি আপনার প্রোগ্রামের উন্নতির জন্য একটি শক্তিশালী টুল।

Content added By

Go-তে Mocks এবং Stubs এর ব্যবহার

Mocks এবং Stubs হল সফটওয়্যার টেস্টিং কৌশল, যা সাধারণত ইউনিট টেস্টিংয়ের মধ্যে ব্যবহৃত হয়। এগুলি Test Doubles হিসেবে পরিচিত, যার মাধ্যমে মূল কোডের কিছু অংশকে অস্থায়ীভাবে প্রতিস্থাপন করা হয় যাতে নির্দিষ্ট অংশগুলোর কার্যকারিতা পরীক্ষা করা যায়। Mocks এবং Stubs টেস্টিংয়ের জন্য ব্যবহৃত হলেও, তাদের ভূমিকা এবং ব্যবহারের ধরন কিছুটা ভিন্ন।


১. Stubs কি?

Stub একটি বিশেষ ধরনের Test Double যা একটি নির্দিষ্ট ফাংশন বা মেথডের পূর্বনির্ধারিত আউটপুট প্রদান করে। এটি মূলত একটি সহজ স্থাপন (placeholder) হিসেবে কাজ করে যা মেথড বা ফাংশনের আউটপুট পরিবর্তন না করে শুধু পরীক্ষার জন্য একটি নির্দিষ্ট ফলাফল ফেরত দেয়।

১.১ Stub এর ব্যবহারের উদাহরণ

ধরা যাক, আপনি একটি ফাংশনের উপর টেস্ট করছেন, যা কোনো ডেটাবেস বা এক্সটার্নাল সার্ভিস থেকে ডেটা নেয়। এই ক্ষেত্রে, আপনি ডেটাবেসের পরিবর্তে একটি স্টাব ব্যবহার করতে পারেন যাতে টেস্টটি নির্ভরশীল না হয়ে চলে।

package main

import "fmt"

// Stub: একটি সহজ ফাংশন যা নির্দিষ্ট আউটপুট প্রদান করবে
func GetUserName(id int) string {
    return "Alice" // Stubbed value
}

func main() {
    user := GetUserName(1)
    fmt.Println("User Name:", user) // আউটপুট: User Name: Alice
}

এখানে, GetUserName ফাংশনটি একটি স্টাব হিসেবে কাজ করছে যা নির্দিষ্ট আউটপুট প্রদান করে, যদিও এটি বাস্তব ডেটাবেস বা সার্ভিস থেকে ডেটা না নিয়ে আসে।


২. Mocks কি?

Mock আরও উন্নত এবং কার্যকর Test Double যা শুধুমাত্র আউটপুট না, বরং আর্গুমেন্ট, ফাংশন কল এবং তাদের ফলাফলকে নিয়ন্ত্রণ করে। Mocks সাধারণত বেশি জটিল এবং আপনার টেস্টের মধ্যে নির্দিষ্ট কার্যকলাপ যাচাই করতে সহায়ক। Mocks এর মাধ্যমে আপনি নির্দিষ্ট মেথড বা ফাংশন কতবার কল হয়েছে, কোন আর্গুমেন্টের সাথে কল হয়েছে, এবং ফেরত কেমন হয়েছে তা পরীক্ষা করতে পারেন।

২.১ Mock এর ব্যবহারের উদাহরণ

ধরা যাক, আপনার একটি সার্ভিস ক্লাস আছে যা একটি রিমোট API কল করে এবং আপনি সেই API কলের ফলাফল পরীক্ষা করতে চান। এখানে একটি Mock ব্যবহার করা যেতে পারে যাতে API কলের জন্য আপনি একটি কৃত্রিম (simulated) ফলাফল ব্যবহার করতে পারেন।

package main

import (
    "fmt"
    "testing"
)

// Service Interface
type Service interface {
    FetchData() string
}

// RealService: এটি মূল বাস্তব সেবা
type RealService struct{}

func (r *RealService) FetchData() string {
    return "Real data from external API"
}

// Test for Service
func TestFetchData(t *testing.T) {
    // Mock Service তৈরি
    mockService := &MockService{}
    result := mockService.FetchData()

    // Mocks - Expected Behavior
    expected := "Mocked data"
    if result != expected {
        t.Errorf("Expected %s but got %s", expected, result)
    }
}

// MockService: একটি Mock সার্ভিস যা আমরা টেস্টিংয়ের জন্য তৈরি করেছি
type MockService struct{}

func (m *MockService) FetchData() string {
    return "Mocked data" // Stubbed behavior for testing
}

func main() {
    fmt.Println("Testing Mocks and Stubs in Go")
}

এখানে:

  • RealService হলো মূল সেবা যা বাস্তব API কল করে।
  • MockService হলো মক সার্ভিস যা ফাংশনটি টেস্ট করার জন্য কৃত্রিম আউটপুট প্রদান করে।

এটি আমাদের মূল সেবা RealService এর পরিবর্তে mocked ফলাফল প্রদান করে, যাতে আমরা API বা অন্যান্য ডিপেনডেন্সি ছাড়া শুধু লজিক পরীক্ষা করতে পারি।

আউটপুট:

Testing Mocks and Stubs in Go

এখানে, Mocks ব্যবহার করা হয়েছে ফাংশন কলের আর্গুমেন্ট এবং আউটপুট যাচাইয়ের জন্য।


৩. Mocks এবং Stubs এর মধ্যে পার্থক্য

বিষয়StubsMocks
কাজশুধুমাত্র নির্দিষ্ট আউটপুট প্রদান করে।ফাংশন কল, আর্গুমেন্ট, এবং আউটপুট যাচাই করা।
ব্যবহারছোট টেস্টে ব্যবহৃত হয় যখন নির্দিষ্ট ফলাফল পাওয়া প্রয়োজন।জটিল টেস্টে ব্যবহৃত হয় যখন ফাংশন কলের আচরণ নিরীক্ষণ করতে হয়।
বৈশিষ্ট্যআউটপুট নির্ধারণ করা হয়।ফাংশন কলের বার্তা, আর্গুমেন্ট, এবং ফলাফল যাচাই করা হয়।
উদাহরণডাটাবেস কলের পরিবর্তে একটি নির্দিষ্ট মান ফেরত দেয়া।ফাংশন কলের সংখ্যা এবং আর্গুমেন্ট যাচাই করা।

৪. Mocks এবং Stubs এর প্রয়োগের জন্য টুলস

Go-তে Mocks এবং Stubs তৈরি করার জন্য কয়েকটি টুলস রয়েছে যা টেস্টিং প্রক্রিয়া আরও শক্তিশালী করে তোলে:

৪.১ gomock টুল

gomock একটি জনপ্রিয় Go প্যাকেজ যা Mocks তৈরি করতে সহায়তা করে। এটি আপনাকে mock objects তৈরি করার এবং তাদের কল, আর্গুমেন্ট, এবং রিটার্ন ভ্যালু যাচাই করতে সাহায্য করে।

ইনস্টল করার জন্য:

go get github.com/golang/mock/gomock

৪.২ testify টুল

testify একটি Go টেস্টিং প্যাকেজ, যা Mocks এবং Assertions তৈরিতে ব্যবহৃত হয়। এটি আপনাকে সহজে মক তৈরি এবং টেস্ট লিখতে সহায়তা করে।

ইনস্টল করার জন্য:

go get github.com/stretchr/testify

এটি মক, স্টাব এবং বিভিন্ন টেস্টিং ফিচারের জন্য শক্তিশালী সমর্থন প্রদান করে।


সারসংক্ষেপ

  • Stubs হল সেই টেস্ট ডাবলস যা ফাংশনের আউটপুট প্রদান করে, সাধারণত যখন আপনার অন্য অংশের কার্যকারিতা টেস্ট করতে হয়।
  • Mocks হল আরও জটিল টেস্ট ডাবলস যা ফাংশন কল, আর্গুমেন্ট, কলের সংখ্যা, এবং আউটপুট যাচাই করতে ব্যবহৃত হয়।
  • Go-তে Mocks এবং Stubs ব্যবহারের মাধ্যমে আপনি নির্ভরশীলতা এড়িয়ে আপনার কোডের লজিক নির্ভুলভাবে টেস্ট করতে পারেন।

Mocks এবং Stubs এর মাধ্যমে আপনার ইউনিট টেস্টিংয়ের দক্ষতা এবং ফলস্বরূপ কোডের স্টেবিলিটি এবং রক্ষণাবেক্ষণযোগ্যতা উন্নত হয়।

Content added By
Promotion

Are you sure to start over?

Loading...