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 খুবই সহজ এবং শক্তিশালী, যা কোডের গুণগত মান এবং কার্যকারিতা নিশ্চিত করতে সাহায্য করে।
Read more