تست در مسیر Go

بیاموزید چطور تمرین‌های Go خود را در Exercism تست کنید.


می‌توانید تمرین‌های Go را در پوشه‌ی پروژه‌ی exercism خود، با رفتن به پوشه‌ی تمرین و اجرای go test اجرا کنید.

cd exercism/project/directory/go/leap
go test

Tests با شناساگر رقابت داده

علاوه بر اجرای go test، برخی تمرین‌ها را باید با یک پرچم برای شناساگر رقابت داده اجرا کرد تا بررسی شود که راه‌حل شما bugهای رقابت داده ایجاد نمی‌کند. در تمرین‌های مربوطه یادآوری‌ای می‌بینید که tests را با پرچم -race شناساگر رقابت داده اجرا کنید. برای بررسی رقابت داده، go test -race را اجرا کنید. برای نمونه:

cd exercism/project/directory/go/bank-account
go test -race

اجرای بنچمارک‌ها

بیشتر تمرین‌ها شامل بنچمارک‌هایی هستند که می‌توانید با آن‌ها تعیین کنید تغییرات در راه‌حل شما چه تأثیری بر عملکردش دارند. برای اجرای بنچمارک‌های یک تمرین، دستور go test -v --bench . --benchmem را داخل پوشه‌ی تمرین اجرا کنید.

این خروجی را در نظر بگیرید.

BenchmarkReverse-16       403594              2537 ns/op             176 B/op         34 allocs/op

این یعنی بنچمارک برای اینکه زمانش به‌طور قابل‌اعتماد اندازه‌گیری شود، ۴۰۳۵۹۴ بار اجرا شده است. میانگین سرعت ۲۵۳۷ نانوثانیه در هر حلقه بوده است. در هر عملیات ۳۴ تخصیص حافظه رخ داده است، با میانگین ۱۷۶ بایت.

نمونه‌های قابل test

tests نمونه‌ای در برخی تمرین‌ها به کار می‌روند و همراه با tests استاندارد تمرین اجرا می‌شوند. این نمونه‌ها برای مستندسازی و بررسی API تمرین به کار می‌روند و می‌توانند در تشخیص API مورد انتظار تمرین مفید باشند.

Go fmt

لطفاً پیش از ارسال، go fmt را روی code خود اجرا کنید.

نکته‌ها و راهنمایی‌ها

نوشتن code تمرین

README.md هر تمرین یک توضیح کلی می‌دهد، اما برنامه‌ی test در Go بسیار جزئی و مشخص خواهد بود. برنامه‌ی test را باز کنید و نگاهی سریع به آن بیندازید؛ حتی اگر به نظرتان شبیه تقلب بیاید، باز هم این کار را بکنید. به دنبال کامنت‌های مفید، داده‌های test و حتی اسم توابع test بگردید. پیش از آنکه چیزی بنویسید، go test را اجرا کنید و ببینید آیا پیام‌های خطا سرنخی از نقطه‌ی شروع به شما می‌دهند یا نه.

هدف اول شما این است که چیزی را به مرحله‌ی کامپایل برسانید، حتی اگر tests را پاس نکند. برای این کار باید توابع را «خالی» بگذارید. یعنی بدنه‌ی تابع را خالی بگذارید، مگر برای چیزی که باید برگرداند. فقط برای اینکه کامپایل شود، return 0 یا return "" یا هر چیزی بنویسید. گاهی برای فهمیدن امضای توابع باید به برنامه‌ی test برگردید و با دقت بیشتری آن را بخوانید. وقتی همه‌ی امضاهای لازم توابع را فهمیدید، برنامه‌ی test شکایت می‌کند که ۰ پاسخ اشتباه است. حالا شروع کنید به پر کردن بدنه‌ی توابع.

رفع خطا

tests اغلب در نخستین خطا متوقف می‌شوند. همان یکی را درست کنید و این کار را تکرار کنید تا دیگر خطایی نماند. go test گزینه‌های مفیدی دارد. go test -v خروجی مفصل‌تری می‌دهد. go test -run <regexp> فقط آن دسته از tests را اجرا می‌کند که اسمشان با <regexp> مطابقت دارد.

وقتی panic رخ می‌دهد، خروجی زیادی تولید می‌شود. ممکن است در ابتدا ترسناک به نظر برسد، اما شجاع باشید. به بالاترین بخش خروجی panic نگاه کنید تا پیام panic را پیدا کنید. آن پیام توضیح کلی‌ای از مشکل به شما می‌دهد. سپس بقیه‌ی آن را بخوانید و به دنبال نخستین اشاره به code خود بگردید. آن اشاره اغلب مستقیماً به مشکل اشاره می‌کند.

برای پیدا کردن مشکل‌های برنامه‌های هم‌روند، go test -race را امتحان کنید.

مرتب کردن code

بیایید دوباره بگوییم: go fmt را اجرا کنید. Golint می‌تواند شما را از مشکلات سبک در code شما آگاه کند که go fmt آن‌ها را نمی‌گیرد. ممکن است نگاهی هم به go vet بیندازید، که درباره‌ی مشکل‌های احتمالی code شما هشدار می‌دهد. کامنت‌های پرتکرار در بازبینی code را بخوانید و به آن‌ها عمل کنید. برای تمرینی که هم‌روندی در آن دخیل است، go test -race را امتحان کنید، حتی اگر tests آن را پاس کرده باشد. حتی وقتی برای عملکرد در بنچمارک بهینه‌سازی می‌کنید، خوانایی را در نظر داشته باشید. گاهی بهینه‌سازی می‌تواند به شما کمک کند راه‌حل‌هایی مختصر و خوانا کشف کنید، اما ممکن است وسوسه شوید که در پی عملکرد، خوانایی را کنار بگذارید.

tests امتیاز

چند تمرین tests امتیاز دارند که فقط با go test اجرا نمی‌شوند. اگر علاوه بر تمرین عادی، تمرین امتیاز را نیز حل می‌کنید، باید go test -tags bonus یا دستور مشابهی را که در مستندات برنامه‌ی test آمده تایپ کنید.