[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"post:jmeter-listeners":3},{"id":4,"documentId":5,"title":6,"desc":7,"content":8,"image":9,"imageCard":10,"imageBackground":11,"slug":12,"publishedAt":13,"baseUrl":14,"tags":15,"writer":31,"editors":40,"organization":11,"vars":41},721,"uz7g4wwqo7144u92l5vv01s2","لیسنرها در جی‌میتر","این مقاله به بررسی Listenerها در نرم‌افزار جی‌میتر می‌پردازد.  Listenerها ابزاری برای جمع‌آوری و نمایش نتایج تست‌های عملکردی و کارایی هستند که اطلاعاتی مانند زمان پاسخ و توان عملیاتی را ارائه می‌دهند.  انواع مختلف Listenerها مانند View Results Tree، Summary Report و Aggregate Report  و نحوه استفاده از آن‌ها در جی‌میتر به همراه مثال‌های عملی تشریح شده است.\n","## ماهیت شنودگرها یا Listenerها\nپس از ضبط و طراحی سناریوهای آزمون‌های عملکردی یا کارایی در جی‌میتر و اعمال پیکربندی‌های مورد نیاز، با اجرای تست، جی‌میتر درخواست‌ها را به سمت سرور ارسال می‌کند. سپس باید نتیجه اجرای هر دستور مورد بررسی قرار گیرد که آیا درخواست‌ها با موفقیت اجرا شده‌اند یا خیر؟ همچنین در تست کارایی، باید بعضی فاکتورها ذخیره، تجزیه و تحلیل شوند تا بتوان از مشخصه‌های عملکردی سیستم مطلع شد. به عنوان مثال فاکتورهایی مانند:\n* **Throughput:** که در فارسی به آن «توان عملیاتی» می‌گوییم که برابر با تعداد درخواست‌های پردازش‌شده در واحد زمان است.\n* **Response Time:** در فارسی به آن «زمان‌پاسخ» می‌گوییم و تعیین کننده زمان لازم برای پردازش درخواست ارسالی توسط سرور است. به عبارتی دیگر هنگامی که درخواستی به سمت سرور ارسال می‌شود، مدت زمانی که طول می‌کشد تا پاسخ از سرور دریافت شود را زمان پاسخ در نظر می‌گیریم که یکی از معیارهای مهم در تست کارایی است. \n\nعلاوه بر دو فاکتور بالا، موارد مفید دیگری نیز وجود دارند که محاسبه‌ آن‌ها ممکن است کاری دشوار و زمان‌بر باشد. بدین منظور مولفه‌ای به نام Listener در جی‌میتر طراحی شده است تا بتوان با استفاده از انواع مختلف آن، نتایج تست را از جنبه‌های مختلف، محاسبه و بررسی کرد. در واقع با استفاده از Listenerها می‌توان پاسخ‌ها و نتایج تست را از نمونه‌گیر یا همان Sampler دریافت کرده و اطلاعات مورد نیاز را نمایش داد، که در ادامه به آموزش آن می‌پردازیم.\n\n## انواع Listener در جی‌میتر\nدر جی‌میتر Listener‌های مختلفی وجود دارند که هر کدام برای هدف خاصی طراحی شده‌اند و کاربر براساس نیاز خود می‌تواند از هر کدام از آنها استفاده کند. \n\nطبق شکل زیر، Listener نتایج را در قالب گراف، درخت، لاگ فایل و جدول ذخیره کرده و نمایش می‌دهد:\n\n![Types of Listener](.\u002Fresources\u002Ftypes-of-listeners.png?raw=true \"Types of Listener\")\n\nListener‌های متنوعی در پکیج جی‌میتر وجود دارند و همراه جی‌میتر نصب شده‌اند. برخی از پرکاربردترین آن‌ها عبارتند از:\n1. **View Results Tree:** نمایش درختی درخواست‌های ارسال شده و پاسخ‌های دریافتی\n2. **Summary Report:** نمایش مواردی مانند حداقل زمان دریافت پاسخ و … در قالب جدول\n3. **Aggregate Report:** این listener مانند summary report خلاصه نتایج تست را نمایش می‌دهد. در این نوع گزارش نتایج تجمیع شده به تفکیک تراکنش‌های مختلف ارائه می‌شود.\n4. **Aggregate Graph:** اطلاعاتی مانند Aggregate Report را به صورت آماری و گرافیکی نمایش می‌دهد.\n5. **Assertion Results:** نمایش نتیجه اجرای Assertion‌ها\n6. **Generate Summary Results:** ذخیره خلاصه ای از اجرای تست در یک فایل لاگ\n7. **Response Time Graph:** ارائه یک گراف از زمان دریافت پاسخ\n8. **Save Responses to a file:** ذخیره نتایج تست در یک یا چند فایل\n9. **View Results in Table:** نمایش بدنه و header پاسخ دریافتی در قالب جدول\n\n> در جی‌میتر listenerهای دیگری مانند JSR223 Listener و BeanShell Listener  وجود دارند که می‌توان با اسکریپت نویسی نتایج استخراج شده را پردازش کرد و بر اساس نیاز خود یک listener شخصی شده ساخت.\n\n## نحوه استفاده از listener‌ها در جی‌میتر\nمی‌توان listener‌ها را به کامپوننت‌های مختلفی اضافه کرد. در نتیجه فقط نتایج بخش‌هایی که در حوزه آن‌ها قرار دارند را نمایش می‌دهند. برای فهم بهتر این موضوع مثال زیر در جی‌میتر را در نظر بگیرید.\n\n![Listeners Scope](.\u002Fresources\u002Flisteners-scope.png?raw=true \"Listeners Scope\")\n\nدر شکل بالا، سه listener در حوزه‌های مختلف تعریف شدند؛ بنابراین هر کدام نتایج و داده‌های مختلفی نمایش می‌دهند:\n* listener 1: نمایش نتایج مربوط به درخواست GET \u002Fads\n* listener 2: نمایش نتایج مربوط به ترد گروپ Get Ads\n* listener 3: نمایش نتایج مربوط به Test Plan. یعنی این listener نتایج اجرای همه ی عناصری که در این تست پلن قرار دارند را نمایش می‌دهد.\n\nبنابراین listener می‌تواند بر اساس جایگاه خود موارد مختلفی را جمع آوری کرده و نشان دهد. به عبارتی listener‌ها نتایج را از عناصر هم سطح خود و سطوح داخلی جمع آوری کرده و نمایش می‌دهند. به همین خاطر، توصیه می‌شود که listener در سطح تست پلن تعریف شود تا نتیجه همه thread group‌ها و عناصر داخلی آن‌ها را بتوان جمع آوری و ذخیره کرد.\n\n### عناصر والد یک listener\nlistener‌ها را می‌توان به عناصر زیر اضافه کرد:\n* Test Plan\n* Thread Group\n* Test Fragment\n* Sampler\n* Logic Controller\n* Non-Test Element\n\n> در نظر داشته باشید که هیچ عنصری را نمی‌توان به listener اضافه کرد، بنابراین فرزندی نخواهد داشت.\n\nبرای اضافه کردن یک listener در جی‌میتر، با توجه به نیاز خود روی Test Plan، Thread Group، Samplers و یا … کلیک راست کنید و از منوی باز شده گزینه listener را انتخاب کرده و در نهایت listener‌های مورد نیاز خود را اضافه کنید. \n\n![Add Listeners](.\u002Fresources\u002Fadd-listeners.png?raw=true \"Add Listeners\")\n\n## listener‌های کاربردی و مهم جی‌میتر\nدر این بخش با ذکر یک مثال به بررسی انواع listenerهای مختلف و کاربرد آنها در جی‌میتر می‌پردازیم. در این مثال سعی داریم درخواست‌های زیر را اجرا کرده و نتایج را مشاهده کنیم:\n* دریافت لیست آگهی‌های مربوط به آپارتمان در سایت دیوار \n\n![Divar Real Estate](.\u002Fresources\u002Fdivar-real-estate.png?raw=true \"Divar Real Estate\")\n\n* دریافت اطلاعات کامل مربوط به یک آگهی\n\n![Divar House Detail](.\u002Fresources\u002Fdivar-house-detail.png?raw=true \"Divar House Detail\")\n\n1. **View Results Tree**\n\nView Results Tree یکی از مهم‌ترین و پرکاربردترین listener‌هایی است که در جی‌میتر استفاده می‌شود. این listener درخواست‌ها و پاسخ‌های آنها را به صورت درخت نمایش می‌دهد. در واقع View Results Tree درخواست ارسالی به سمت سرور، پاسخ دریافتی از سرور، header‌ها و به طور کلی یک ارزیابی از API را نمایش می‌دهد. \n\nبا استفاده از قسمت drop down می‌توان پاسخ API را در قالب فرمت‌های زیر مشاهده کرد: \n\n![View Results Tree Formats](.\u002Fresources\u002Ftypes-of-view-result-tree.png?raw=true \"View Results Tree Formats\")\n\n* **Text:** نمایش به صورت متن خام و بدون فرمت\n* **Boundary Extractor Tester:** با استفاده از Boundary Extractor می‌توان بخشی از پاسخ دریافتی را استخراج و به عنوان متغیر ذخیره کرد و در درخواست های بعدی و یا برای اعتبارسنجی پاسخ از آن استفاده کرد. با استفاده از این فرمت و با مشخص کردن Left Boundary و Right Boundary می‌توان نحوه استخراج کردن بخش مورد نظر از پاسخ دریافتی را تست کرد. \n* **HTML:** نمایش پاسخ با فرمت HTML\n* **JSON:** نمایش به صورت فرمت json\n\nدر View Results Tree، اگر درخواست به درستی ارسال نشود و یا پاسخ دریافتی با پاسخ مورد انتظار ما متفاوت باشد با رنگ قرمز و در غیر این صورت با رنگ سبز مشخص می‌شود:\n\n![View Results Tree Error](.\u002Fresources\u002Fview-results-tree-error.png?raw=true \"View Results Tree Error\")\n\nدر تصویر بالا، درخواست اول به درستی اجرا شده (رنگ سبز) و برای درخواست دوم خطای \" 404 Not Found\" دریافت شده است که با رنگ قرمز نمایش داده شده است.\n\nهمچنین این listener شامل تب‌های زیر است:\n* **تب Sampler result:** شامل کد پاسخ (response code)، پیام پاسخ (response message) و اطلاعاتی در مورد زمان ارسال درخواست، تاخیر، سایز پاسخ به بایت و … است.\n\n![View Results Tree Sampler Tab](.\u002Fresources\u002Fview-results-tree-sampler-tab.png?raw=true \"View Results Tree Sampler Tab\")\n\n* **تب Request:** شامل جزئیات درخواستی است که جی‌میتر به سمت سرور ارسال می‌کند. در واقع اطلاعاتی مانند URL، header، بدنه درخواست و کوکی‌هاست.\n\n![View Results Tree Request Tab](.\u002Fresources\u002Fview-results-tree-request-tab.png?raw=true \"View Results Tree Request Tab\")\n\n* **تب Response:** شامل اطلاعات دریافتی از سرور است، مانند بدنه پاسخ و header\n\n![View Results Tree Response Tab](.\u002Fresources\u002Fview-results-tree-response-tab.png?raw=true \"View Results Tree Response Tab\")\n\nمی‌توانید نتیجه تست شامل مواردی مانند URL، Response Code، Response Message و … را در یک فایل ذخیره کنید. با کلیک روی Browse… فایلی را که می‌خواهید نتایج تست روی آن ذخیره شوند را انتخاب کنید. سپس مشخص کنید که می‌خواهید خطاها و یا نتایج درخواست‌های با اجرای موفق را ذخیره کنید. همچنین با استفاده از دکمه Configure می‌توانید موارد بیشتری را انتخاب کنید که در فایل مورد نظر ذخیره شوند:\n\n![View Results Tree Save Results](.\u002Fresources\u002Fview-results-tree-save-results.png?raw=true \"View Results Tree Save Results\") \n\n**مزیت:**\n\nمزیت این listener این است که می‌توانیم با استفاده از آن همزمان جزئیات درخواست ارسال شده و پاسخ دریافت شده را مشاهده کنیم که این باعث می‌شود هر گاه تستی به درستی اجرا نشد، علت آن را پیدا کنیم.\n\n**عیب:**\n\nاین listener برای تست‌های load\u002Fstress که چندین کاربر همزمان سناریوها را اجرا می‌کنند مناسب نیست. در واقع این listener حافظه و CPU بسیاری را مصرف می‌کند زیرا همه نتایج را در حافظه اصلی نگه می‌دارد. \n\n> بنابراین این listener برای دیباگ کردن مناسب است، که با استفاده از آن می‌توان مطمئن شد که درخواست درستی به سمت سرور ارسال شده و پاسخ درستی نیز از سمت سرور دریافت شده است. بنابراین در اجرای نهایی باید این listener را حذف یا غیرفعال کرد.\n\n2. **Save Response to a file**\n\nبا استفاده از save response to a file می‌توان به راحتی نتایج تست را در یک یا چندین فایل ذخیره کرد. طبق شکل زیر، می‌توانید تنظیمات مربوطه را انجام دهید تا فقط نتایج مورد انتظار شما در فایل ذخیره شود:\n* **Name:** یک نام برای listener انتخاب کنید.\n* **Filename prefix (can include folders):** پیشوند نام فایل‌های ایجاد شده\n* **save conditions:** می‌توانید با استفاده از گزینه‌های زیر مشخص کنید که کدام نتایج (پاسخ‌های با اجرای موفق\u002Fناموفق) ذخیره شوند:\n  * Save Successful Responses only\n  * Save Failed Responses only\n  * Don’t save Transaction Controller SampleResult\n* **Variable Name containing saved file name:** نام متغیری که در آن نام فایل ایجاد شده ذخیره می‌شود.\n* **Don’t add number to prefix:** اگر این مورد را انتخاب کنید، هیچ عددی به پیشوند اسم فایل ایجاد شده اضافه نمی‌شود. یعنی یک فایل ایجاد می‌شود و اگر چندین درخواست داشته باشید، نتایج هر درخواست روی نتایج درخواست قبلی ذخیره می‌شود.\n* **Don’t add content type suffix:** در صورت انتخاب این گزینه، پسوندی مبنی بر نمایش نوع محتوای فایل به نام فایل ذخیره شده اضافه نمی‌شود.\n* **Add timestamp:** با انتخاب این مورد، تاریخ با فرمت yyyyMMdd-HHmm به اسم فایل اضافه می‌شود.\n\nبرای درک بهتر به شکل‌های زیر توجه کنید:\n\n![Save Response To a File](.\u002Fresources\u002Fsave-response-to-file.png?raw=true \"Save Response To a File\")\n\nاگر در قسمت Filename prefix مسیر ذخیره فایل را مشخص نکنید و تنها پیشوند نام فایل‌ها را وارد کنید، فایل‌ها در دایرکتوری bin جی‌میتر ذخیره خواهند شد. در این جا مسیر ذخیره فایل‌ها را مشخص کردیم و طبق شکل زیر در همین مسیر ذخیره شدند:\n\n![Save Response To a File (Results)](.\u002Fresources\u002Fsave-response-to-file-result.png?raw=true \"Save Response To a File (Results)\")\n\nهمانطور که پیش‌تر گفتیم، در مثال این آموزش 2 API داریم؛ بنابراین پس از اجرا، طبق تنظیماتی که در بالا انجام دادیم، برای هر درخواست یک فایل مجزا ایجاد شده که حاوی نتیجه اجرای این درخواست‌هاست.\n\nهمچنین در تنظیمات این listener گزینه‌های Don’t add number to prefix و Don’t add content type suffix را تیک نزده ایم. بنابراین همانطور که در شکل بالا مشخص است، در ادامه پیشوند اسم فایل، عدد و نوع محتوای فایل را هم داریم.\n\nاگر گزینه Add timestamp را انتخاب کرده باشید، تاریخ لحظه اجرای درخواست‌ها را هم در ادامه پیشوند اسم فایل‌ها خواهید داشت:\n\n![Save Response To a File (TimeStamp)](.\u002Fresources\u002Fsave-response-to-file-result-timestamp.png?raw=true \"Save Response To a File (TimeStamp)\") \n\nسپس می‌توانید این فایل‌ها را با استفاده از notepad++، مرورگر و … باز کنید و محتوای آن‌ها را مشاهده و استفاده کنید:\n\n![Show Response in firefox](.\u002Fresources\u002Fresponse-in-firefox.png?raw=true \"Show Response in firefox\")  \n\n\n3. **Summary Report**\n\nSummary Report نتایج مورد نیاز برای تجزیه و تحلیل تست را در قالب جدول نمایش می‌دهد. اطلاعاتی مانند:\n\n![Summary Repoer](.\u002Fresources\u002Fsummary-report.png?raw=true \"Summary Repoer\")\n\n* **Label:** اسم درخواست یا تراکنش را نمایش می‌دهد.\n* **#Samples:** تعداد sample‌ها تعداد تراکنش‌ها یا درخواست‌های اجرا شده است. در شکل بالا درخواست های Get House List  و Get House Detail هر کدام 7 بار اجرا شده‌اند.\n* **Average:** میانگین زمان پاسخ (Response Time) مصرف شده توسط همه sample‌ها برای اجرای label مورد نظر است. به عنوان مثال در عکس بالا، average time برای تراکنش Get House List برابر با 3373 میلی‌ثانیه است.\n* **Min:** حداقل زمانی است که برای اجرای یک درخواست مصرف می‌شود. در شکل بالا برای تراکنش Get House List از 7 تا درخواستی که اجرا شده، یکی از درخواست‌ها در کمترین زمان یعنی 2865 میلی ثانیه اجرا شده است.\n* **Max:** حداکثر زمانی که برای اجرای یک درخواست مصرف می‌شود. در شکل بالا برای تراکنش Get House List از 7 تا درخواستی که اجرا شده، یکی از درخواست‌ها در بیشترین زمان یعنی 3618 میلی ثانیه اجرا شده است.\n* **Std. Dev.:** میزان انحراف استاندارد از متوسط زمان پاسخ. \n* **Error %:** درصد درخواست‌های با اجرای ناموفق \n* **Throughput:** توان عملیاتی تعداد درخواست‌هایی است که در واحد زمان (ثانیه) توسط سرور پردازش می‌شود. این زمان از شروع اولین sample تا پایان اجرای آخرین sample محاسبه می‌شود. هر چه این مقدار بیشتر باشد بیانگر آن است که سیستم کارایی بهتری دارد.\n* **Recieved KB\u002FSec:** نمایش دهنده میزان داده‌های دانلود شده در طول تست است.\n* **Sent KB\u002FSec:** نمایش دهنده میزان داده‌های ارسال شده در طول تست است.\nدر این listener هم مانند View Results Tree می‌توان نتایج را در یک فایل ذخیره کرد.\n\n\n4. **Aggregate Report**\n\nAggregate Report همانند Summary Report نتایج را در قالب جدول نمایش می‌دهد. با این تفاوت که حافظه مصرفی این Listener از Summary Report بیشتر است، زیرا یک کپی از هر نمونه را در حافظه ذخیره می‌کند. بنابراین توصیه می‌شود برای تست کارایی از Aggregate Report استفاده نشود.\n\nهمانطور که در شکل زیر مشاهده می‌کنید، aggregate report اطلاعات زیر را نمایش می‌دهد:\n\n![Aggregate Repoer](.\u002Fresources\u002Faggregate-report.png?raw=true \"Aggregate Repoer\")\n\n* **Label:** اسم درخواست یا تراکنش را نمایش می‌دهد.\n* **#Samples:** تعداد sample‌ها تعداد تراکنش‌ها یا درخواست‌های اجرا شده است. در این‌جا درخواست های Get House List  و Get House Detail هر کدام 7 بار اجرا شده‌اند.\n* **Average:** میانگین زمان صرف شده توسط همه sample‌ها برای اجرای label مورد نظر است. به عنوان مثال در عکس بالا، average time برای تراکنش GET House List برابر با 3373 میلی ثانیه است.\n* **Min:** حداقل زمانی که برای اجرای یک درخواست صرف می‌شود. در شکل بالا برای تراکنش GET House List از 7 تا درخواستی که اجرا شده، یکی از درخواست‌ها در کمترین زمان یعنی 2865 میلی ثانیه اجرا شده است.\n* **Max:** حداکثر زمانی که برای اجرای یک درخواست صرف می‌شود. در شکل بالا برای تراکنش GET House List از 7 تا درخواستی که اجرا شده، یکی از درخواست‌ها در بیشترین زمان یعنی 3618 میلی ثانیه اجرا شده است.\n* **Error%:** درصد درخواست‌های با اجرای ناموفق \nThroughput: توان عملیاتی تعداد درخواست‌هایی است که در واحد زمان (ثانیه) توسط سرور پردازش می‌شود. این زمان از شروع اولین sample تا پایان اجرای آخرین sample محاسبه می‌شود. هر چه این زمان بیشتر باشد بهتر است.\n* **Recieved KB\u002FSec:** نمایش دهنده میزان داده‌های دانلود شده در طول تست است.\n* **Sent KB\u002FSec:** نمایش دهنده میزان داده‌های ارسال شده در طول تست است.\n* **Median:**  میانه یک معیار آماری استاندارد است. به عبارتی sample‌ها را به دو قسمت مساوی تقسیم می‌کند، نیمی از آن‌ها کوچکتر از میانه و نیمی دیگر بزرگتر از میانه است. بنابراین در اینجا median نشان دهنده این است که 50٪ درخواست‌ها در کمتر یا برابر این زمان اجرا شدند. \n* **90%Line:** ۹۰٪ درخواست‌ها کمتر یا برابر این زمان هستند. (90امین صدک)\n* **95%Line:** ۹۵٪ درخواست‌ها کمتر یا برابر این زمان هستند. (95امین صدک)\n* **99%Line:** ۹۹٪ درخواست‌ها کمتر یا برابر این زمان هستند. (99امین صدک)\n\n> معمولا از median به عنوان میانه زمان پاسخ و از 99 یا 95 درصد به عنوان بیشینه زمان پاسخ در نتایج تست‌های کارایی استفاده می‌شود.\n\nدر این listener هم مانند View Result Tree می‌توان نتایج را در یک فایل ذخیره کرد.\n\n## Plugin‌ها\nlistener‌های دیگری نیز طراحی شده‌اند که در پکیج اصلی خود جی‌میتر وجود ندارند و می‌توانید آنها را به راحتی به جی‌میتر اضافه و استفاده کنید. \nپلاگین‌هایی مانند:\n* **PerfMon Metrics Collector:** برای مانیتور کردن منابعی مانند CPU، حافظه و …\n* **Response Codes per Second:** مشخص می‌کند که در طول اجرای تست چه response code هایی دریافت شده است.\n* **Response Times Over Time Listener:** نمایش میانگین زمان پاسخ برای هر نمونه در طول تست (میلی ثانیه)\n","https:\u002F\u002Fraw.githubusercontent.com\u002Fgazmeh-site\u002Fposts\u002Frefs\u002Fheads\u002Fmain\u002Ffa\u002Fjmeter\u002Flisteners\u002Fresources\u002FimageCover.png?raw=true","https:\u002F\u002Fraw.githubusercontent.com\u002Fgazmeh-site\u002Fposts\u002Frefs\u002Fheads\u002Fmain\u002Ffa\u002Fjmeter\u002Flisteners\u002Fresources\u002FimageThumbnail.png?raw=true",null,"jmeter-listeners","2025-12-11T14:54:50.995Z","https:\u002F\u002Fraw.githubusercontent.com\u002Fgazmeh-site\u002Fposts\u002Fmain\u002Ffa\u002Fjmeter\u002Flisteners\u002F",[16,21,26],{"id":17,"documentId":18,"name":19,"localeName":20},3,"v628n6eaz9upwxva2fi013js","jmeter","جی‌میتر",{"id":22,"documentId":23,"name":24,"localeName":25},10,"xxaw54iwv8oi6z7sx5ua6hju","performance test","تست کارایی",{"id":27,"documentId":28,"name":29,"localeName":30},4,"szefdrf8dqsu6ul557hbcizz","automation","خودکارسازی",{"id":32,"documentId":33,"username":34,"displayName":35,"avatar":36},2,"zr70b3gsysk6j1ctzl60j14z","faranak","فرانک",{"id":37,"documentId":38,"url":39},7,"jk1loch4szj3101o5byhtv4t","\u002Fuploads\u002Ffarank_resize_6f3b068418.jpg",[],{"SITE_URL":42,"PAGES_URL":43,"POSTS_URL":44},"https:\u002F\u002Fgazmeh.ir\u002Ffa","https:\u002F\u002Fgazmeh.ir\u002Ffa\u002Fpages","https:\u002F\u002Fgazmeh.ir\u002Ffa\u002Fposts"]