معمولا وقتی پروژه یکمی بزرگ میشه و در جوارش تست ها هم زیاد میشن طبیعتا حافظه ای که برای اجرای اون تست ها هم لازمه زیادتر میشه. اینجاست که مشکل تخصیص حافظه به PHPUnit رخ میده. یه چیزی مثل این:
PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 1052672 bytes) in
برای رفع این مشکل دو راه پیشنهاد میدم:
1. افزایش محدودیت حافظه PHP
2. تغییر کانفیگ PHPUnit
هر کدوم از این راه ها نقطه قوت و نقطه ضعف خودشون رو دارن.
(همه توضیحات بر مبنای ست آپ لوکال خودم، ویندوز 10 و php 7.4.3 هست).
برای این کار باید در پوشه نصب PHPتون و در فایل php.ini این رو سرچ کنید:
memory_limit
نکته: در صورت استفاده از bash میتونید از دستور زیر برای پیدا کردن مسیر نصب PHPتون استفاده کنید:
which php
به صورت پیشفرض حداکثر حافظه ای که یک اسکریپت PHP میتونه استفاده کنه 128M هست که باید اون رو به میزانی که نیاز دارید به صورت زیر افزایش بدید. در اکثر مواقع 2G باید کافی باشه.
memory_limit = 2G
استفاده از این روش مشکل استفاده لوکالمون که زیاد محدودیت حافظه نداریم رو حل می کنه ولی وقتی داریم از سیستم های Continuous Integration مثل TravisCI استفاده می کنیم و همه تست ها در سرور هم اجرا میشن به دلیل اینکه معمولا مقدار حافظه ای که در سرور در دسترسمون هست محدود هست باز هم به همین مشکل بر می خوریم. اینجاست که راه دوم به کمکمون میاد.
در فایل phpunit.xml این کانفیگ رو به این شکل اضافه و یا تغییر بدید:
processIsolation="true"
این کانفیگ به PHPUnit میگه که هر تست رو به صورت ایزوله انجام بده. اینکار باعث میشه که بعد از اجرا شدن هر تست حافظه مورد استفاده اون آزاد بشه ولی هزینه ای که بابتش پرداخت می کنیم این هست که با فعال کردنش تست ها بسیار کند تر از قبل اجرا میشن. مزیت این روش این هست که میتونیم با خیال راحت تست ها رو دپلوی کنیم بدون اینکه به مشکل کمبود حافظه در سرور بر بخوریم. سرور هم میشینه آروم آروم برای خودش تست ها رو اجرا می کنه ^^
خلاصه اینکه در نوشتن تست فراز و نشیب زیاد هست ولی ارزشش رو داره :) به امید روزی که کد بدون تست نبینیم 3>