پروفایلسازی پوشش تست (Profiling Test Coverage)
در این بخش، نحوه پروفایلسازی پوشش تست (Profiling Test Coverage) را بررسی میکنیم. این شامل گزارش پوشش (Coverage Report) و تحلیل کد (Code Analysis) میشود.
همچنین با نقاط کور تست (Test Blind Spots) و بهبود کیفیت (Quality Improvement) آشنا خواهیم شد.
یکی از ویژگیهای عالی ابزار go test، متریکها و تجسمهایی است که برای پوشش تست ارائه میدهد.
بروید و تستها را در پروژه ما با استفاده از فلگ -cover به این صورت اجرا کنید:
$ go test -cover ./...
? snippetbox.alexedwards.net/ui [no test files]
ok snippetbox.alexedwards.net/cmd/web 0.013s coverage: 45.7% of statements
snippetbox.alexedwards.net/internal/models/mocks coverage: 0.0% of statements
snippetbox.alexedwards.net/internal/validator coverage: 0.0% of statements
snippetbox.alexedwards.net/internal/assert coverage: 0.0% of statements
ok snippetbox.alexedwards.net/internal/models 0.128s coverage: 11.3% of statements
از نتایج اینجا میتوانیم ببینیم که 46.9% از دستورات در بسته cmd/web ما در طول تستها اجرا میشوند، و برای بسته internal/models این رقم 11.3% است.
ما میتوانیم با استفاده از فلگ -coverprofile یک تجزیه و تحلیل دقیقتر از پوشش تست توسط روش و تابع دریافت کنیم:
$ go test -coverprofile=/tmp/profile.out ./...
این تستهای شما را به صورت عادی اجرا میکند و — اگر همه تستهای شما پاس شوند — سپس یک پروفایل پوشش را به مکان خاصی مینویسد. در مثال بالا، ما به آن دستور دادهایم که پروفایل را به /tmp/profile.out بنویسد.
سپس میتوانید پروفایل پوشش را با استفاده از دستور go tool cover به این صورت مشاهده کنید:
$ go tool cover -func=/tmp/profile.out snippetbox.alexedwards.net/cmd/web/handlers.go:15: home 0.0% snippetbox.alexedwards.net/cmd/web/handlers.go:31: snippetView 92.9% snippetbox.alexedwards.net/cmd/web/handlers.go:62: snippetCreate 0.0% snippetbox.alexedwards.net/cmd/web/handlers.go:88: snippetCreatePost 0.0% snippetbox.alexedwards.net/cmd/web/handlers.go:131: userSignup 100.0% snippetbox.alexedwards.net/cmd/web/handlers.go:137: userSignupPost 88.5% snippetbox.alexedwards.net/cmd/web/handlers.go:192: userLogin 0.0% snippetbox.alexedwards.net/cmd/web/handlers.go:198: userLoginPost 0.0% snippetbox.alexedwards.net/cmd/web/handlers.go:256: userLogoutPost 0.0% snippetbox.alexedwards.net/cmd/web/handlers.go:277: ping 100.0% snippetbox.alexedwards.net/cmd/web/helpers.go:17: serverError 0.0% snippetbox.alexedwards.net/cmd/web/helpers.go:30: clientError 100.0% snippetbox.alexedwards.net/cmd/web/helpers.go:37: notFound 100.0% snippetbox.alexedwards.net/cmd/web/helpers.go:41: render 58.3% snippetbox.alexedwards.net/cmd/web/helpers.go:62: newTemplateData 100.0% snippetbox.alexedwards.net/cmd/web/helpers.go:73: decodePostForm 50.0% snippetbox.alexedwards.net/cmd/web/helpers.go:102: isAuthenticated 75.0% snippetbox.alexedwards.net/cmd/web/main.go:35: main 0.0% snippetbox.alexedwards.net/cmd/web/main.go:100: openDB 0.0% snippetbox.alexedwards.net/cmd/web/middleware.go:11: commonHeaders 100.0% snippetbox.alexedwards.net/cmd/web/middleware.go:26: logRequest 100.0% snippetbox.alexedwards.net/cmd/web/middleware.go:41: recoverPanic 66.7% snippetbox.alexedwards.net/cmd/web/middleware.go:61: requireAuthentication 16.7% snippetbox.alexedwards.net/cmd/web/middleware.go:83: noSurf 100.0% snippetbox.alexedwards.net/cmd/web/middleware.go:94: authenticate 38.5% snippetbox.alexedwards.net/cmd/web/routes.go:12: routes 100.0% snippetbox.alexedwards.net/cmd/web/templates.go:23: humanDate 100.0% snippetbox.alexedwards.net/cmd/web/templates.go:40: newTemplateCache 83.3% snippetbox.alexedwards.net/internal/models/snippets.go:31: Insert 0.0% snippetbox.alexedwards.net/internal/models/snippets.go:60: Get 0.0% snippetbox.alexedwards.net/internal/models/snippets.go:97: Latest 0.0% snippetbox.alexedwards.net/internal/models/users.go:34: Insert 0.0% snippetbox.alexedwards.net/internal/models/users.go:66: Authenticate 0.0% snippetbox.alexedwards.net/internal/models/users.go:98: Exists 100.0% total: (statements) 38.1%
یک روش جایگزین و بصریتر برای مشاهده پروفایل پوشش استفاده از فلگ -html به جای -func است.
$ go tool cover -html=/tmp/profile.out
این یک پنجره مرورگر حاوی نمایشی قابل پیمایش و برجسته از کد شما باز میکند، مشابه این:
دستورات که در طول تستهای شما اجرا میشوند به رنگ سبز و آنهایی که اجرا نمیشوند به رنگ قرمز هستند. این کار باعث میشود که به راحتی ببینید که کدام کد در حال حاضر توسط تستهای شما پوشش داده شده است (مگر اینکه کوررنگی قرمز-سبز داشته باشید).
میتوانید این کار را یک قدم جلوتر ببرید و از گزینه -covermode=count هنگام اجرای go test به این صورت استفاده کنید:
$ go test -covermode=count -coverprofile=/tmp/profile.out ./... $ go tool cover -html=/tmp/profile.out
به جای فقط برجسته کردن دستورات به رنگ سبز و قرمز، استفاده از -covermode=count باعث میشود که پروفایل پوشش تعداد دقیق دفعاتی که هر دستور در طول تستها اجرا میشود را ثبت کند.
هنگامی که در مرورگر مشاهده میشود، دستورات که بیشتر اجرا میشوند در سایهای اشباعتر از سبز نشان داده میشوند، مشابه این:
واژهنامه اصطلاحات فنی
| اصطلاح فارسی | معادل انگلیسی | توضیح |
|---|---|---|
| پروفایلسازی پوشش تست | Profiling Test Coverage | تحلیل پوشش تست |
| گزارش پوشش | Coverage Report | گزارش تستها |
| تحلیل کد | Code Analysis | بررسی کد |
| نقاط کور تست | Test Blind Spots | بخشهای تست نشده |
| بهبود کیفیت | Quality Improvement | ارتقای کیفیت |
| نسبت پوشش | Coverage Ratio | درصد تست شده |
| گزارش HTML | HTML Report | گزارش وب |
| تحلیل عملکرد | Performance Analysis | بررسی کارایی |
| بهینهسازی | Optimization | بهبود عملکرد |
| معیارهای کیفیت | Quality Metrics | شاخصهای کیفیت |