یکی از ویژگیهای حرفهای زبان Go، پشتیبانی قوی از تستنویسی و ابزارهای دیباگ است. اگر بخوای برنامهای مطمئن، پایدار و بدون باگ بنویسی، باید بتونی بهدرستی اون رو تست و اشکالزدایی کنی. در این بخش با ابزارهای اصلی Go برای تست و دیباگ آشنا میشیم.
testing packageزبان Go بهصورت داخلی ابزار تستنویسی داره و با استفاده از testing package میتونی خیلی راحت تستهای خودت رو بنویسی و اجرا کنی.
ساخت یک فایل تست:
هر فایل تست باید با پسوند _test.go باشه.
مثال ساده:
// math.gopackage mymathfunc Add(a, b int) int {return a + b}
// math_test.gopackage mymathimport "testing"func TestAdd(t *testing.T) {result := Add(2, 3)if result != 5 {t.Errorf("انتظار داشتیم 5 باشد، اما %d دریافت شد", result)}}
اجرای تست:
go test
تست یونیت: بررسی یک تابع یا واحد خاص از برنامه بهصورت جداگانه.
تست اینتگریشن: بررسی تعامل بین بخشهای مختلف برنامه (مثلاً اتصال به دیتابیس یا APIها).
برای تست اینتگریشن میتونید توابع تستی جداگانه ایجاد کنید که به صورت واقعی یک سرویس یا عملیات ترکیبی رو بررسی کنن.
در Go مرسومه که تستها رو بهصورت Table Driven بنویسن؛ یعنی مجموعهای از ورودی و خروجی رو در قالب جدول تعریف میکنی و همه رو در یک حلقه تست میکنی.
مثال:
func TestAddTableDriven(t *testing.T) {tests := []struct {a, b, expected int}{{1, 2, 3},{5, 5, 10},{-1, 1, 0},}for _, tt := range tests {result := Add(tt.a, tt.b)if result != tt.expected {t.Errorf("برای %d + %d انتظار %d داشتیم، اما %d دریافت شد", tt.a, tt.b, tt.expected, result)}}}
در تستهایی که وابسته به دیتابیس، API یا فایل هستند، معمولاً نیاز به Mock داریم. یعنی بهجای استفاده از نسخه واقعی، یک نسخه شبیهسازی شده میسازیم تا رفتار اصلی رو تقلید کنه.
مثال ساده از Mock اینترفیس:
type Notifier interface {Send(msg string) error}type MockNotifier struct{}func (m MockNotifier) Send(msg string) error {fmt.Println("ارسال پیام (شبیهسازی شده):", msg)return nil}
در تست میتونی از MockNotifier استفاده کنی تا مطمئن بشی تابع درست کار میکنه بدون اینکه پیام واقعی ارسال بشه.
Delve ابزار اصلی دیباگ در Go هست که بهصورت خط فرمانی یا داخل VS Code قابل استفادهست.
نصب Delve:
go install github.com/go-delve/delve/cmd/dlv@latest
اجرای برنامه با Delve:
dlv debug
با استفاده از Delve میتونی breakpoint بزاری، متغیرها رو ببینی، قدم به قدم اجرا کنی و راحتتر باگها رو پیدا کنی.
در این بخش یاد گرفتیم چطور کدهای Go رو تست کنیم، از تکنیکهای مدرن مثل Table Driven Test و Mock استفاده کنیم، و با ابزارهای دیباگ مثل Delve راحتتر کدها رو اشکالزدایی کنیم.