در این مقاله میخواهیم به موضوع تست نویسی در زبان برنامه نویسی گولنگ بپردازیم و انواع تست های ممکن برای کدها را بررسی کنیم. در دنیای Go (Golang) تستنویسی به شکل پیشفرض و با پکیج داخلی testing پشتیبانی میشود. ینی برای نوشتن و اجرای تست ها نیازی به نصب پکیج اضافی ندارید. قاعده ی ساده ای برای نامگذاری فایل های تست وجود دارد، هر فایل کد از پروژه میتواند یک فایل همنام با پسوند _test.go در کنار خودش داشته باشد. در این صورت وقتی از دستور go test استفاده کنیم، به صورت خودکار این فایل ها اجرا میشوند و میتوانیم نتیجه تست ها را مشاهده کنیم
نوشتن تست برای یک تابع در گولنگ
برای درک بهتر، به نمونه کد زیر دقت کنید:
package math
// Sum returns a + b.
func Sum(a, b int) int {
return a + b
}
این کد یک تابع خیلی ساده برای جمع زدن دو عددی است که در ورودی دریافت میکند. فرض کنید این فایل را با نام sum.go ذخیره کرده ایم. برای نوشتن تست برای این تابع، تنها کافیست فایلی با نام sum_test.go در کنار همین فایل ایجاد کنیم و این کد را داخلش قرار دهیم:
package math
import (
"fmt"
"testing"
)
// ----- Unit test -----
func TestSum(t *testing.T) {
//Arrange
a,b := 2,3
//Act
got := Sum(a, b)
//Assert
if got != 5 {
t.Fatalf("Sum(2,3) = %d; want 5", got)
}
}
همانطور که در کد بالا مشاهده میشود، یک تابع با نام TestSum داریم که ورودی آن t *testing.T است. در مورد این ورودی در این حد بدانید که ابزاری هست که به شما امکان می دهد تا با موتور تست Go تعامل کنید. در ابتدای تست نویسی، امکاناتی که از این ابزار مورد استفاده قرار میدهیم متدهای زیر هستند که وضعیت نهایی تست را مشخص میکنند:
-
t.Error(...)→ پیام خطا چاپ میکند ولی تست را ادامه میدهد. -
t.Errorf(...)→ مثل بالا ولی با فرمتدهی (fmt.Sprintf). -
t.Fail()→ علامت میزند که تست fail شده ولی ادامه میدهد. -
t.Fatal(...)→ پیام خطا چاپ میکند و فوراً تست را متوقف میکند. -
t.Fatalf(...)→ مثل بالا ولی با فرمتدهی.
تستی که نوشته ایم، تابع Sum که در فایل sum.go قرار دارد را با ورودیهای ۲ و ۳ اجرا میکند، سپس بررسی میکند اگر خروجی تابع عدد ۵ نبود، خطای fatal بدهد و الباقی تست ها را اجرا نکند. البته ما فعلا فقط یک تست داریم. اما در پروژه های واقعی معمولا تعداد تست ها زیاد است و برای اینکه در زمان اجرای تست ها زمان هدر نرود، معمولا وقتی یک تست مهم pass (قبول) نشود، فرآیند تست را متوقف میکنند تا زمان و منابع برای اجرای الباقی تست ها هدر نرود.
برای اجرای تست و مشاهده نتیجه آن کافیست در دایرکتوری پروژه، دستور زیر را در ترمینال اجرا کنید:
go test ./...
الگوی تست نویسی Arrange – Act – Assert
نکته دیگری که در تست بالا باید به آن دقت کرد، تقسیم بندی کد تست به سه قسمت هست:
//Arrange
a,b := 2,3
//Act
got := Sum(a, b)
//Assert
if got != 5 {
t.Fatalf("Sum(2,3) = %d; want 5", got)
}
این همان الگوی معروف Arrange – Act – Assert (گاهی بهش AAA میگن) هست که در تستنویسی، چه در گولنگ چه در زبانهای دیگه، خیلی استفاده میشود. استفاده از این روش خوانایی کدهای تست را افزایش میدهد و به سایر برنامه نویسان کمک میکند تا تست های شما را بهتر درک کنند. به طور کلی اقداماتی که در این ۳ بخش صورت میگیرد به این صورت است:
۱) Arrange (آمادهسازی)
در این بخش ورودیها، پیشنیازها و محیط تست رو آماده میکنیم:
-
ساخت دادههای آزمایشی
-
مقداردهی اولیه متغیرها یا structها
-
تنظیم mock/fake برای وابستگیها
مثال:
a,b := 2,3
۲) Act (اجرا)
فقط عملی که میخواهیم تست کنیم را اجرا میکنیم، بدون دخالت چیزهای دیگر.
-
صدا زدن تابع یا متد هدف
-
نگهداری نتیجه برای بررسی بعدی
مثال:
got := Sum(a, b)
۳) Assert (سنجش نتیجه)
بررسی میکنیم آیا نتیجه با انتظار ما یکسان هست یا نه:
-
مقایسه خروجی با مقدار مورد انتظار
-
بررسی خطا (وجود داشتن یا نداشتن)
-
اگر مطابقت ندارد → fail دادن تست
مثال:
if got != 5 {
t.Fatalf("Sum(2,3) = %d; want 5", got)
}
تبریک میگویم. ما اولین Unit Test خود را نوشتیم. در پست های بعدی در مورد این نوع از تست بیشتر خواهیم آموخت.
موفق و پیروز باشد.