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 তে ইউনিট টেস্টিং কোডের সঠিকতা নিশ্চিত করার জন্য একটি অত্যন্ত গুরুত্বপূর্ণ পদ্ধতি, এবং এটি আপনাকে কোডের কার্যকারিতা এবং নির্ভুলতা বজায় রাখতে সাহায্য করে।
Read more