بهبود عملکرد در تست های ادغام با PHP/Laravel
با افزایش برنامه ما، تعداد مهاجرت ها نیز افزایش می یابد. در برخی موارد، در تست های یکپارچه سازی، کل ساختار پایگاه داده در حال آزمایش را انتخاب کردیم، بنابراین در هر آزمون پایگاه داده را ایجاد و حذف کردیم. با این حال، با گذشت زمان، این کار سخت میشود و شروع به تأثیرگذاری بر تأخیر طولانی فرآیند CI برنامه میکند و ناراحتی ایجاد میکند، بهویژه زمانی که ما یک Hotfix داریم که باید در سریعترین زمان ممکن آپلود شود.
معمولاً برای آزمایش یک صفت استفاده می شود RefreshDatabase
، بیایید ببینیم این ویژگی چه می کند.
ببینید که از دستور در صفت استفاده شده است migrate:fresh
، این دستور کل بانک را لغو می کند و دوباره ایجاد می کند، این کار در هر پشته آزمایشی انجام می شود.
من یک پروژه ساده برای تجزیه و تحلیل زمان صرف شده با استفاده از این ویژگی ایجاد کردم RefreshDatabase
با اجرای 11 تست، 1.86 گرفتیم، به نظر خوب است، اما مهاجرت های ما تغییر نمی کند درست است؟ عمدتاً با پروژه ای که قبلاً در حال تولید است، پس چرا همیشه نیاز به ایجاد مجدد پایگاه داده در هر آزمایش داریم؟
بیایید روش دیگری را امتحان کنیم، در لاراول یک ویژگی دیگر به نام داریم DatabaseTransactions
، بیایید نگاهی به آن بیندازیم.
توجه داشته باشید که در این ویژگی ما چیز متفاوتی داریم، در ابتدای تست یک تراکنش بانکی ایجاد می شود و پس از اتمام یک بازگشت داده می شود، بیایید آن را جایگزین کنیم و ببینیم چه می شود.
اوه، ما یک خطا داریم، برای حل این مشکل باید مهاجرت های خود را قبل از آزمایش اجرا کنیم، می توانیم از پیکربندی بوت استرپ phpunit برای آن استفاده کنیم، به طور پیش فرض این پیکربندی به فایل Autoload فروشنده ما اشاره می کند.
برای اطلاعات بیشتر در مورد phpunit bootstrap اینجا را کلیک کنید
بیایید یک فایل بوت استرپ سفارشی ایجاد کنیم.
در فایل بوت استرپ اپلیکیشن را مقداردهی اولیه می کنیم و در پایان دستور را داریم migrate:fresh
، این دستور فقط یک بار در مقداردهی اولیه تست ها اجرا می شود، حال اجازه دهید مسیر بوت استرپ را در پیکربندی phpunit.xml تنظیم کنیم و به فایل جدید اشاره کنیم و دوباره تست ها را اجرا کنیم.
نتیجه
آنچه ما می بینیم یک تفاوت پوچ در عملکرد در تست های ما است. برای یک پروژه بسیار بزرگ با مهاجرت های زیاد از این ویژگی استفاده کنید DatabaseTransactions
تستها را بسیار کارآمدتر کنید، در اینجا چند نمونه از پروژه توسعهیافته در این نسخه نمایشی در Github من، با شعبه با استفاده از RefreshDatabase و با DatabaseTransaction آورده شده است، امیدوارم این پست مفید باشد.