Go یک بسته تست داخلی عالی برای تأیید برنامه های شما دارد. همچنین میتوانید از این بستههای شخص ثالث برای ارتقای تست خود به سطح بعدی استفاده کنید.
تست نرم افزار فرآیندی است که معیارهای برنامه ها را با استفاده از ابزارها، اسکریپت ها یا به صورت دستی ارزیابی می کند.
تست بخشی جدایی ناپذیر از چرخه توسعه نرم افزار است. آزمایش جامع اطلاعات عمیقی در مورد یکپارچگی برنامه شما ارائه می دهد.
میتوانید با نوشتن تستها، ارزیابی عملکرد برنامه و خودکار کردن گردشهای کاری، از اشکالات جلوگیری و رفع کنید.
شروع با تست کردن در Go
کتابخانه استاندارد Go یک بسته آزمایشی در حال تکامل را ارائه می دهد. بسته آزمایشی دارای ویژگیهای معیار، فازی، پرش، آزمایش فرعی، زیرمعیارسازی و سایر عملکردها است.
تست با این بسته آسان است. در اینجا یک ساختار تست ساده وجود دارد که به عنوان مدلی برای آزمون عمل می کند:
type Cases struct {
// the expected output of the test
expected int
// the output of the function
actual int
// the value you're passing to the function
argument string
}
در اینجا یک تابع ساده وجود دارد که رشته ها را به اعداد صحیح تبدیل می کند. تست شما این تابع را آزمایش خواهد کرد.
import (
"strconv"
)
func StringToInteger(str string) int {
integer, err := strconv.Atoi(str)
if err != nil {
return 0
}
return integer
}
تابع StringToInteger اگر خطایی در تبدیل وجود داشته باشد 0 و اگر خطایی وجود نداشته باشد عدد صحیح را برمیگرداند.
در اینجا یک تابع تست برای StringToInteger آمده است:
func TestStringToInteger(test *testing.T) {
expectedInt := StringToInteger("3")
caseInstance := Cases {
expected: expectedInt,
actual: 3,
}
if caseInstance.expected == caseInstance.actual {
// some code here
} else {
test.Fail()
}
}
تابع تست TestStringToInteger یک شی testing.T را به عنوان آرگومان خود می پذیرد. متغیر expectInt نتیجه تبدیل رشته را نگه می دارد. متغیر caseInstance ساختار Cases نمونه برای آزمایش است. دستور if مقادیر مورد انتظار و واقعی را مقایسه می کند.
اگر مقادیر برابر نباشند، متد Fail یک تست ناموفق را در عبارت else برمیگرداند.
Go یک فرمان آزمایشی برای خودکارسازی و بازیابی اطلاعات بینش در مورد آزمایشها و برنامههای شما ارائه میکند.
go test
go help test
صفحه راهنما اطلاعات دقیقی در مورد نحوه عملکرد تست go ارائه می دهد:
اکوسیستم Go خانه کتابخانه های بسیاری است که آزمایش را در دسترس تر و انعطاف پذیرتر می کنند. عملکردهای زیادی فراتر از بسته آزمایشی، از جمله رگرسیون و تست واحد وجود دارد.
بسته شهادت
بسته Testify یکی از محبوب ترین فریم ورک های Go برای تست بسته ها است. این ابزارهایی را فراهم می کند که برای نوشتن تست های کارآمد، با ادعاهای آسان، تمسخر و آزمایش عملکردهای مجموعه به آن نیاز دارید.
Testify برای توسعه آزمایش محور مناسب است زیرا بسته یک بسته ساختگی ارائه می دهد. این مکانیسمی را برای نوشتن اشیاء ساختگی فراهم می کند که می توانید به جای اشیاء واقعی در آزمایش استفاده کنید.
این بسته همچنین ارائه می دهد:
- یک بسته ادعایی که روشهای مفیدی برای نوشتن تستهای دوستانه و خوانا ارائه میکند.
- یک بسته نیازمندی شبیه به بسته اظهارنظر برای برگرداندن نتایج بولی.
- بسته مجموعه ای برای مجموعه های آزمایشی با ساختار.
Testify روی بسته تست گسترش می یابد و می توانید از دستور go test برای اجرای تست های نوشته شده با بسته Testify استفاده کنید.
Testify از نسخه های Go از 1.13 پشتیبانی می کند. با این دستور می توانید بسته را به عنوان وابستگی پروژه اضافه کنید:
go get github.com/stretchr/testify
در اینجا یک تست ادعای ساده با بسته اظهارنظر بسته Testify آورده شده است:
package main
import (
"testing"
"github.com/stretchr/testify/assert" // assert package only
)
// function name should be "Something" by convention
func TestSomething(t *testing.T) {
// asserting equality
assert.Equal(t, 123, 123, "they should be equal")
// asserting inequality
assert.NotEqual(t, 123, 456, "they should not be equal")
}
تابع تست TestSomething ساختار نوع تست بسته آزمایشی را به عنوان آرگومان می گیرد. متدهای Equal و NotEqual برای ادعاهای مبتنی بر برابری و نابرابری از بسته ادعای Testify هستند.
بسته GoConvey
GoConvey یک ابزار تست Go است که برای بیان بر روی بسته آزمایشی طراحی شده است. این شامل عملکرد تست ترمینال (CLI) و مرورگر (GUI) است.
بسته GoConvey با بسته آزمایشی ادغام می شود و یک رابط کاربری وب برای کار با تست های بومی Go ارائه می دهد. همچنین شامل قابلیت هایی برای تست های رگرسیون، خروجی های قابل تنظیم و تولید کد تست می شود. می توانید تست ها را به صورت خودکار اجرا کنید، به فرمت های پوشش در HTML دسترسی داشته باشید و رابط کاربری گرافیکی را سفارشی کنید.
این دستور را در ترمینال فضای کاری Go خود اجرا کنید تا بسته Go Convey را نصب کنید.
go get github.com/smartystreets/goconvey
در اینجا یک مثال ساده از تست نوشتن با بسته GoConvey آورده شده است.
package main
import (
. "github.com/smartystreets/goconvey/convey"
"testing"
)
func TestSomething(t *testing.T) {
// Only pass t into top-level Convey calls
Convey("Declare variable", t, func() {
x := 1
Convey("increment variable", func() {
x++
Convey("assert equality", func() {
So(x, ShouldEqual, 2)
})
})
})
}
برای آزمایش باید بسته انتقال را با استفاده از نماد نقطه وارد کنید.
تابع Convey از بسته Convey به محدوده آزمایش کمک می کند. آخرین فراخوانی تابع Convey در مثال کد، برابری بین متغیر x و 2 را با استفاده از تابع ShouldEqual بیان می کند.
بسته انتظار HTTP
بسته HTTP Expect یک بسته با کاربری آسان، مختصر و توضیحی برای تست سرتاسر HTTP و REST API Go است. می توانید از آن برای ایجاد درخواست های HTTP به صورت تدریجی و بازرسی پاسخ ها و بارهای پرداختی آنها به صورت بازگشتی استفاده کنید.
بسته httpexpect مجموعهای از سازندههای زنجیرهای برای درخواستها و ادعاهای HTTP در پاسخها و بارهای HTTP است. این بر روی بستههای http، تست و دیگر ساخته شده است. این بسته همچنین با بسته داخلی httptest به خوبی کار می کند.
httpexpect عملکردی را برای ایجاد درخواست با ساخت URL، هدرها، کوکیها و بارگذاریها فراهم میکند. این اظهارات پاسخ، ادعاهای بارگذاری، چاپ زیبا و WebSockets را مدیریت می کند.
این دستور را در ترمینال دایرکتوری کاری خود اجرا کنید تا بسته httpexpect را نصب کنید.
go get github.com/gavv/httpexpect
در اینجا یک مثال ساده از آزمایش یک تابع handler با بسته httpexpect آورده شده است.
package main
import (
"fmt"
"github.com/gavv/httpexpect/v2"
"net/http"
"net/http/httptest"
"testing"
)
func exampleHandler() http.Handler {
return http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) {
fmt.Fprintln(writer, "Hello World")
})
}
func TestexampleHandler(t *testing.T) {
// create http.Handler
handler := exampleHandler()
// run server using httptest
server := httptest.NewServer(handler)
defer server.Close()
// create http expect instance
expect := httpexpect.New(t, server.URL)
// is it working?
expect.GET("/").
Expect().
Status(http.StatusOK).JSON().Array().Empty()
}
تابع handler exampleHandler یک کنترلر HTTP را برای بسته httpexpect برمی گرداند. تابع TestexampleHandler نمونه ای از تابع handler را اعلام می کند. سپس یک سرور جدید برای آزمایش نقطه پایانی با بسته httptest ایجاد می کند.
متغیر انتظار نمونه httpexpect شما است که به مسیر ریشه نقطه پایانی درخواست GET در سرور می رسد. تابع Status در صورت موفقیت آمیز بودن تست، کد وضعیت (در این مورد، 200) را برمی گرداند.
تست های جامع و شهودی بنویسید
تست ها کمک زیادی به ارزیابی یکپارچگی برنامه شما می کنند و الگوها و روش های تست زیادی وجود دارد که می توانید برای برنامه های خود استفاده کنید. در هسته گردش کار تست خود، باید تست های بصری بنویسید که می توانید با تغییر برنامه های خود در طول زمان، آنها را بهبود ببخشید.