دانستنی‌ها

راهی جدید برای تست برنامه‌های چندریسه‌ای با استفاده از JUNIT

یکی از معروف‌ترین ابزارهای تست برنامه‌های جاوا JUNIT است اما سخت‌ترین قسمت تست مربوط به آزمون برنامه‌های چندریسه‌ای (multithread) است. در این مطلب سعی می‌کنیم با یک مثال نحوه تست این گونه برنامه‌ها را نشان دهیم.

 

در برنامه زیر یک شمارنده داریم که قراراست به طور موازی با منطق کلی برنامه اجرا شود. پس یک کلاس Counter به شکل زیر داریم:

و یک کلاس TestCounter به شکل زیر تعریف می‌کنیم:

 

با استفاده از نماد RunWith در JUnit ، تست‌ها با استفاده از ConcurrentTestRunner اجرا خواهند شد. این اجرا کننده تست‌ها، متدی که با Test نمادگذاری شده باشد را در چهار ریسه موازی اجرا می‌کند. بعد از آن متدی که با After نمادگذاری شده باشد در ریسه اصلی (main) اجرا خواهد شد.

اگر که تست کیس‌‌ را با یک race condition catcher مانند vmlens اجرا کنیم خواهیم دید:

یک race condition در دسترسی به فیلد count مشاهده می‌شود. برای حل این موضوع این فیلد را به صورت volatile تعریف می‌کنیم و تست‌ها را اجرا می‌کنیم.

و الان است که تست کیس با موفقیت اجرا می‌شود. اگر چندبار این تست کیس را اجرا کنیم خواهیم دید که گاها با خطا روبرو می‌شود. برای این که ببینیم چه اتفاقی می‌افتد آن را با فعال کردن قابلیت “Delay synchronization for unit tests” در vmlens اجرا می‌کنیم آنگاه همواره خطای زیر را خواهیم دید:

در حقیقت count++ یک عملیات نیست و ۶ عملیات در بایت کد را شامل می‌شود که یکی از آن‌ها خواندن و دیگری نوشتن در فیلد count است:

با تعریف تاخیر بین این عملیات ها مطمئن خواهیم بود که دو ریسه این عملیات‌ها را موازی انجام می‌دهند. وقتی به طور موازی انجام می‌شوند پس count همواره از ۴ کمتر خواهد بود. گاهی سه و گاهی ۲ می‌باشد.

برای حل این مشکل لازم است متدها به صورت اتمیک تعریف شوند. برای اینکار از java.util.concurrent.atomic.AtomicInteger استفاده می‌کنیم:

 

به این ترتیب تست کیس همواره با موفقیت اجرا خواهد شد. (در این آموزش برای اجرای تست‌ها از ابزار concurrent-junit و برای بررسی شرایط race از  ابزار vmlens استفاده گردید.)

این آموزش روی یک مثال ساده انجام شد و می‌دانیم که در این نوع تست‌ها فوت و فن‌هایی به خصوص زمانی که برنامه‌ها و کلاس‌های بزرگ و پیچیده را تست می‌کنیم وجود خواهد داشت پس درصورتی که سوالی بود در قسمت نظرات همین مطلب بفرمایید. 

منبع:

https://dzone.com/articles/a-new-way-to-junit-test-your-multithreaded-java-co

 

 

 

 

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا