تستپلن اجرایی داخل پیام کامیت
خلاصهٔ کاملتر
ولید خان تو پستی که به گفتهٔ خودش با خوندن مطلب Julio Merino دربارهٔ «تستسوئیت مبتنی بر Markdown» جرقه خورده، یه عادت کاری قدیمیش رو توضیح میده: گذاشتن تستپلن قابلاجرا مستقیم داخل پیام کامیت. ایده سادهست — بخش Test Plan که معمولاً یه متن توصیفیه، به شکل بلاک کد با تگ scrut نوشته میشه تا ابزار scrut بتونه دستورهاش رو واقعاً اجرا کنه.
نمونهش تو یه کامیت از پروژهٔ git-branchless اینجوریه که زیر تیتر Test Plan یه بلاک با دستور تست پروژه میاد:
$ cargo nextest run --workspace --no-fail-fast -- 'submodule'نویسنده میگه سه تا سود اصلی داره. اول اینکه تستپلن از حالت تزئینی درمیاد و مخصوصاً تو توسعهٔ تستمحور مطمئن میشی برنامهٔ اعتبارسنجیت واقعاً مشکل رو تشخیص میده. دوم، برای انتقال دانش و آنبوردینگ همتیمیها خوبه. سوم، با git test میشه کل یه استک کامیت رو دوباره اعتبارسنجی کرد — که موقع ریبیس روی تغییرات آپاستریم خیلی بهکار میاد و پیدا کردن اولین کامیت خراب رو ساده میکنه.
برای اجرای این تستها یه اسکریپت کوچیک به اسم git-test-message نوشته که متن کامیت رو میخونه و تستهای scrut رو تو همون working tree مخزن اجرا میکنه. دو تا نکتهٔ تنظیماتی مهمه: scrut بهطور پیشفرض تو یه دایرکتوری موقت کار میکنه، پس با گزینهٔ --work-directory مجبورش کرده تو مسیر فعلی مخزن اجرا بشه؛ و چون فقط فایلهای Markdown رو میگیره، با --match-markdown الگو رو باز گذاشته تا ورودیای که از خروجی git show میاد هم قبول بشه.
تو بخش الگوها چند ترفند عملی هم آورده. scrut بهصورت پیشفرض هم موفقبودن دستور و هم مطابقت stdout رو چک میکنه؛ برای ابزارهایی مثل bazel که خروجی استانداردشون غیرقطعیه، نویسنده خروجی رو به stderr میفرسته تا فقط موقع شکست لاگ بشه ولی assert نشه. برای اعتبارسنجی موردی هم از output expectationهای خود scrut استفاده میکنه، و برای تست تفاضلی رفتار جدید و قدیم رو ضبط و مقایسه میکنه.
یه محدودیت رو هم خودش قبول داره: scrut امکان بهروزرسانی خودکار اسنپشاتها رو داره، ولی نویسنده اون رو یکپارچه نکرده چون نتیجه باید دوباره توی پیام کامیت نوشته بشه. مخاطب این روش هم مشخصه — کسایی که همین الان تستپلن مینویسن و با استکهای کامیت کار میکنن.
نکات کلیدی:
- تستپلن به شکل بلاک scrut داخل پیام کامیت نوشته میشه و قابلاجرا میشه
- اسکریپت git-test-message متن کامیت رو میخونه و تستها رو تو working tree اجرا میکنه
- با git test میشه کل استک کامیتها رو اعتبارسنجی و اولین کامیت خراب رو پیدا کرد
- برای خروجیهای غیرقطعی میشه stdout رو کنار گذاشت و فقط موقع شکست لاگش کرد
- بهروزرسانی خودکار اسنپشاتها هنوز یکپارچه نشده چون باید به پیام کامیت برگرده




