Let's Go تست › پروفایل‌سازی پوشش تست
قبلی · محتوا · بعدی
فصل 13.8.

پروفایل‌سازی پوشش تست (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

این یک پنجره مرورگر حاوی نمایشی قابل پیمایش و برجسته از کد شما باز می‌کند، مشابه این:

13.08-01.png

دستورات که در طول تست‌های شما اجرا می‌شوند به رنگ سبز و آن‌هایی که اجرا نمی‌شوند به رنگ قرمز هستند. این کار باعث می‌شود که به راحتی ببینید که کدام کد در حال حاضر توسط تست‌های شما پوشش داده شده است (مگر اینکه کوررنگی قرمز-سبز داشته باشید).

می‌توانید این کار را یک قدم جلوتر ببرید و از گزینه -covermode=count هنگام اجرای go test به این صورت استفاده کنید:

$ go test -covermode=count -coverprofile=/tmp/profile.out ./...
$ go tool cover -html=/tmp/profile.out

به جای فقط برجسته کردن دستورات به رنگ سبز و قرمز، استفاده از -covermode=count باعث می‌شود که پروفایل پوشش تعداد دقیق دفعاتی که هر دستور در طول تست‌ها اجرا می‌شود را ثبت کند.

هنگامی که در مرورگر مشاهده می‌شود، دستورات که بیشتر اجرا می‌شوند در سایه‌ای اشباع‌تر از سبز نشان داده می‌شوند، مشابه این:

13.08-02.png

واژه‌نامه اصطلاحات فنی

اصطلاح فارسی معادل انگلیسی توضیح
پروفایل‌سازی پوشش تست Profiling Test Coverage تحلیل پوشش تست
گزارش پوشش Coverage Report گزارش تست‌ها
تحلیل کد Code Analysis بررسی کد
نقاط کور تست Test Blind Spots بخش‌های تست نشده
بهبود کیفیت Quality Improvement ارتقای کیفیت
نسبت پوشش Coverage Ratio درصد تست شده
گزارش HTML HTML Report گزارش وب
تحلیل عملکرد Performance Analysis بررسی کارایی
بهینه‌سازی Optimization بهبود عملکرد
معیارهای کیفیت Quality Metrics شاخص‌های کیفیت