[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"post:jmeter-assertions":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},717,"qs19cmo8r3b93x4whafa6ktm","آشنایی با Assertion در جی‌میتر","این مقاله به آموزش Assertion در جی‌میتر می‌پردازد.  Assertion ابزاری برای بررسی صحت پاسخ‌های دریافتی از سرور است و در تست‌های کارایی بسیار مفید می‌باشد.  انواع مختلف Assertion مانند Response Assertion، JSON Assertion و JSR223 Assertion  و نحوه استفاده از آن‌ها در جی‌میتر به همراه مثال‌های عملی تشریح شده‌اند.\n","پس از ضبط کردن سناریوی مورد نظر، پارامتربندی، اجرای تست و دریافت پاسخ از سرور، نیاز است تا از درستی پاسخ دریافت شده اطمینان حاصل کنیم. وقتی درخواستی اجرا می‌شود می‌توان با بررسی کد و پاسخ دریافت شده از سرور متوجه شد که درخواست با موفقیت اجرا شده است یا خیر. گاهی اوقات بررسی کد و پیام پاسخ دریافتی کافی نیست. به عنوان مثال، ممکن است با وجود دریافت کد 200 و پیام OK، پاسخ دریافت شده با پاسخ مورد انتظار ما متفاوت باشد و یا گاهی نیاز است که فیلدهای مختلف در بدنه پاسخ و یا موارد دیگری مانند مدت زمان دریافت پاسخ و … را بررسی کنیم تا مطمئن شویم که پاسخ دریافتی مورد انتظار است. جی‌میتر و ابزارهای دیگر به تنهایی نمی‌توانند این گونه خطاها را تشخیص دهند، زیرا در بعضی مواقع تعیین درستی پاسخ به شما بستگی دارد. بدین منظور عنصری به نام Assertion در جی‌میتر طراحی شده است تا با استفاده از آن بتوان درستی پاسخ دریافتی از سرور را بررسی کرد که در این مقاله به آموزش آن می‌پردازیم.\n\n## Assertion در جی‌میتر چیست؟\nAssertion یکی از مهمترین بخش‌های جی‌میتر است که کاربران با استفاده از آن‌ها می‌توانند درستی پاسخ دریافتی از سرور را بررسی کنند. به خصوص در تست کارایی بسیار کاربردی هستند، زیرا که با استفاده از آن‌ها می‌توانیم بررسی کنیم که همه درخواست ها به درستی اجرا شده‌اند و تحت تاثیر بار زیاد قرار نگرفته‌اند. در واقع Assertion‌ها پس از اجرای درخواست و دریافت پاسخ از سرور، اجرا می‌شوند، سپس نتایج واقعی را با نتایج مورد انتظار ما مقایسه کرده و در نهایت مشخص می‌کنند که این مقادیر با هم برابر هستند و یا خیر.\n\n## انواع Assertion\nدر جی‌میتر Assertionهای مختلفی وجود دارند که هر کدام برای هدف خاصی طراحی شده‌اند و کاربر براساس نیاز خود می‌تواند از هر کدام از آن‌ها استفاده کند.برخی از Assertion هایی که در پکیج جی‌میتر وجود دارند، عبارت اند از:\n1. **Response Assertion:** بررسی مقادیری مانند کد و پیام پاسخ دریافتی\n2. **JSON Assertion:** ارزیابی پاسخ دریافتی از سرور که به صورت JSON است.\n3. **JSR223 Assertion:** بررسی پاسخ دریافتی با استفاده از اسکریپت نویسی با زبان های java، groovy  و …\n4. **XPath Assertion:** ارزیابی پاسخ دریافتی XML با استفاده از عبارت های XPath\n\n\n## نحوه استفاده از Assertionها در جی‌میتر\nپیش از استفاده از Assertion به موارد زیر توجه کنید:\n1. **هزینه Assertion**\n   \n   هر Assertionای هزینه متفاوتی دارد، به عبارتی میزان مصرف منابعی مانند حافظه، CPU و … متفاوت است. بعضی از Assertionها مانند Response Assertion، Duration Assertion و … منابع کمتر و Assertionهایی مانند Compare Assertion، XPath Assertion و … منابع بیشتری مصرف می‌کنند.\n\n2. **حوزه تعریفی Assertion**\n\n   می‌توان Assertion ها را به عنصرهای مختلف اضافه کرد. در نتیجه فقط بر روی بخش‌هایی که در scope آن‌ها قرار دارند اعمال می‌شوند.\n   برای درک بهتر به مثال‌های زیر توجه کنید:\n   \n![Assertion Scope](.\u002Fresources\u002Fassertion-scope.png?raw=true \"Assertion Scope\")\n   \n   در شکل بالا، چهار Assertion در حوزه‌های مختلف تعریف شدند؛ بنابراین هر کدام برای درخواست‌های متفاوتی اعمال می‌شوند:\n   * **Assertion 1:** به GET \u002Fcategories Sampler اضافه شده است، بنابراین تنها بر روی درخواست GET \u002Fcategories اعمال میشود.\n   * **Assertion 2:** به GET \u002Fads Sampler اضافه شده است، بنابراین تنها بر روی درخواست GET \u002Fads اعمال میشود.\n   * **Assertion 3:** به Get Categories اضافه شده است، بنابراین بر روی تمام Sampler هایی که در حوزه آن قرار دارند اعمال می‌شود. (یعنی بر روی GET \u002Fcategories و GET \u002Fads)\n   * **Assertion 4:** به Create a new Ad اضافه شده، بنابراین بر روی تمام Sampler هایی که در حوزه آن قرار دارند اعمال می‌شود. (یعنی بر روی GET \u002Fads ،GET \u002Fcategories و POST \u002Fongoingposts)\n\nبنابراین Assertion می‌تواند بر اساس جایگاه خود بر روی درخواست‌های مختلفی اعمال شود. به عنوان مثال در اینجا Fail شدن 3 Assertion باعث می‌شود کل transaction controllerای که Assertion در آن تعریف شده است fail شده و آنالیز تست و پیدا کردن مشکل زمانبرتر می‌شود.، بنابراین موقع اضافه کردن Assertion توجه کنید که به کدام کامپوننت اضافه می‌کنید. توصیه می‌شود که برای هر درخواست Assertionهای جداگانه تعریف کنید، زیرا که هم قابل فهم‌تر می‌شود و هم در آینده راحت‌تر می‌توانید طراحی خود را ویرایش کنید.\n\n**عناصر والد یک Assertion**\n* Test Plan\n* Thread Group\n* Test Fragment\n* Sampler\n* Logic Controller\n* Non-Test Element\n\n> در نظر داشته باشید که هیچ عنصری را نمی‌توان به Assertion اضافه کرد، بنابراین فرزندی نخواهد داشت.\n\n3. **استفاده همزمان از چندین Assertion**\n   \n   می‌توانید برای اطمینان بیشتر از درستی پاسخ دریافتی از چندین Assertion به صورت همزمان استفاده کرده و موارد متفاوتی را همزمان چک کنید.\n\n**چهار گام برای استفاده از Assertionها در طول تست**\n\nچهار گام استفاده از هر کدام از Assertionها به شرح زیر است:\n\n1. **اضافه کردن Assertion مورد نظر**\n\n   براساس نیاز خود یک یا چندین Assertion را به عنصر مورد نظر خود اضافه کنید. بر روی عنصری که می‌خواهید Assertion را به آن اضافه کنید، کلیک راست کرده و از منوی باز شده گزینه Assertions را انتخاب کرده و Assertion مورد نظر خود را اضافه کنید:\n   \n   ![Add Assertion](.\u002Fresources\u002Fadd-assertion.png?raw=true \"Add Assertion\")\n   \n2. **اضافه کردن فیلد و الگویی که باید تست شود**\n\n   مشخص کنید که قصد دارید کدام فیلد و چه بخشی از پاسخ دریافتی (به عنوان مثال کد پاسخ، پیام پاسخ، زمان پاسخ و … ) را بررسی کنید.\n   \n3. **اضافه کردن مقدار مورد انتظار**\n \n مقادیر مورد انتظار خود را برای فیلدهایی که در بالا مشخص کردید وارد کنید. به عنوان مثال انتظار دارید که کد پاسخ دریافتی 202 باشد.\n \n4. **اضافه کردن Listener مناسب و اجرای تست**\n\nListener مناسب را اضافه و تست را اجرا کنید. سپس نتایج اجرای Assertionها را با استفاده از Listener مناسب مشاهده کنید.\n\nدر حالت GUI، برای مشاهده نتیجه اجرای Assertionها می‌توانید از Listenerهای زیر استفاده کنید:\n* View Results Tree Listener\n* Assertion Result Listener\n\nدر ادامه این آموزش، هر 4 مرحله را برای رایج‌ترین و پرکاربردترین Assertionها به طور کامل بررسی می‌کنیم.\n\n\n## Assertion های کاربردی و مهم جی‌میتر\nدر این بخش قصد داریم چند نمونه از مهمترین Assertion ها را با ذکر مثال بررسی کنیم.\n\n### 1. Response Assertion\n\nResponse Assertion یکی از رایج‌ترین Assertionهاست که از آن برای ارزیابی بخش‌های مختلف پاسخ دریافتی از سرور مانند بدنه، کد، پیام، header و … استفاده می‌شود.\n\n   ![Response Assertion](.\u002Fresources\u002Fresponse-assertion.png?raw=true \"Response Assertion\")\n\nاین assertion شامل موارد زیر است که براساس نیاز خود می‌توانیم آن‌ها را تغییر دهیم:\n* **Apply to:** مشخص کنید که فقط نمونه اصلی، sub-sampleها و یا … چک شوند.\n* **Field to Test:** با استفاده از این بخش می‌توان مشخص کرد که کدام فیلد بررسی شود.\n* **Ignore Status:** همان‌طور که می‌دانید، درخواست‌های HTTP در بازه **4 و **5 به عنوان خطا شناخته می‌شوند. گاهی اوقات نیاز است تا negative scenario اجرا کنیم، یعنی اگر کد پاسخ درخواستی در بازه **4 و **5 بود، آن را pass در نظر بگیریم. بنابراین اگر این گزینه را تیک نزنیم و تست را اجرا کنیم با وجود اینکه مقدار مورد انتظار ما برای کد پاسخ در بازه **4 یا **5 بوده است Assertion با شکست مواجه می‌شود. اما اگر این مقدار را تیک بزنیم این Assertion با موفقیت اجرا خواهد شد.\n* **Pattern Matching Rules و Patterns to Test:** با استفاده از این دو مورد مشخص می‌کنیم که فیلد مورد نظر بر اساس چه الگویی تست شود.\n  \nبه عنوان مثال درخواست صفحه اول سایت گزمه را در نظر بگیرید:\n\nhttps:\u002F\u002Fgazmeh.ir\n\nقصد داریم با استفاده از این Assertion بررسی کنیم که آیا بخش \"خدمات ما\" در پاسخ دریافتی وجود دارد یا خیر. بنابراین طبق مراحل زیر پیش می‌رویم:\n1. یک Response Assertion به GET \u002Fhome اضافه می‌کنیم.\n2. می‌خواهیم عبارتی را در نمونه اصلی بررسی کنیم. بنابراین در قسمت apply to فیلد Main sample only و فیلد Text Response در بخش Field to Test را انتخاب می‌کنیم.\n3. در این مثال انتظار داریم عبارت \"خدمات ما\" در بدنه اصلی پاسخ دریافتی وجود داشته باشد. بنابراین از قسمت Pattern Matching Rules فیلد Contains را انتخاب می‌کنیم. در بخش Patterns to Test با استفاده از دکمه Add یک ردیف ایجاد کرده و مقدار آن را برابر \"خدمات ما\" قرار می‌دهیم.\n   \n   ![Response Assertion Sample](.\u002Fresources\u002Fresponse-assertion-sample.png?raw=true \"Response Assertion Sample\")\n\n4. تست را اجرا می‌کنیم و با استفاده از View Results Tree Listener نتیجه اجرای تست را بررسی می‌کنیم. اگر عبارت مورد نظر در متن پاسخ وجود نداشته باشد، این Assertion با شکست مواجه می‌شود و نمونه مورد نظر با رنگ قرمز نمایش داده می‌شود.\n   \n   ![Response Assertion Failure](.\u002Fresources\u002Fresponse-assertion-failure.png?raw=true \"Response Assertion Failure\")\n\nو اگر عبارت مورد نظر در پاسخ وجود داشته باشد Assertion با موفقیت اجرا شده و درخواست با رنگ سبز مشخص می‌شود.\n\n   ![Response Assertion Pass](.\u002Fresources\u002Fresponse-assertion-pass.png?raw=true \"Response Assertion Pass\")\n\nبرای بررسی موارد دیگر مانند Response Message، Response Code نیز براساس نیاز خود، به همین صورت عمل می‌کنیم.\n\n### 2. JSON Assertion\n\nبا استفاده از JSON Assertion می‌توان پاسخ دریافتی که به صورت JSON است را ارزیابی کرد.\n\n   ![JSON Assertion](.\u002Fresources\u002Fjson-assrtion.png?raw=true \"JSON Assertion\")\n\n* **Assert JSON Path exists:** مسیر فیلد مورد نظر که می‌خواهیم مقدار آن را بررسی کنیم.\n* **Additionally assert value:** اگر می‌خواهید مقدار فیلد مشخص شده در پاسخ دریافتی از سرور را با مقداری که خود تعیین می‌کنید مقایسه کنید، این مورد را تیک بزنید.\n* **Expected Value:** مقدار و یا عبارت مورد انتظاری که قصد دارید با فیلد مشخص شده در پاسخ مقایسه کنید را در این قسمت وارد کنید.\n* **Expect null:** اگر توقع دارید فیلد مشخص شده در پاسخ null باشد، این گزینه را تیک بزنید.\n* **Invert assertion (will fail if above conditions met):** در صورتی که این مورد را تیک بزنید، اگر شرط مشخص شده برقرار باشد این Assertion با خطا مواجه می‌شود.\n\nدر صورتی که Assertion تعریفی شما یکی از شرایط زیر را داشته باشد، با خطا مواجه خواهد شد:\n* اگر پاسخ دریافتی شما JSON نباشد.\n  \n   ![Json Assertion - Response Not Json](.\u002Fresources\u002Fjson-assertion-response-not-json.png?raw=true \"Json Assertion - Response Not Json\")\n  \n* اگر مسیری که در قسمت Assert JSON Path exists وجود نداشته باشد.\n  \n   ![JSON Assertion - Response No Field](.\u002Fresources\u002Fjson-assertion-response-no-field.png?raw=true \"JSON Assertion - Response No Field\")\n  \n* اگر فیلد مورد نظر در مسیر مشخص شده با مقداری که در Expected Value تعریف کرده‌اید برابر نباشد.\n  \n   ![JSON Assertion - Response Not Match](.\u002Fresources\u002Fjson-assertion-response-not-match.png?raw=true \"JSON Assertion - Response Not Match\")\n\nبه عنوان مثال درخواست ورود در سایت گزمه را در نظر بگیرید. حال قصد داریم با استفاده از JSON Assertion مقدار فیلد confirmed موجود در بدنه پاسخ را با مقدار مورد انتظار خود (true) مقایسه کنیم:\n1. یک JSON Assertion به POST \u002Fcreate new ad اضافه میکنیم.\n2. برای ارزیابی فیلد confirmed، در قسمت Assert JSON Path exists، مسیر آن را مشخص می‌کنیم. (پیش از مسیر فیلد، عبارت $. را وارد می کنیم.)\n3. در این مثال برای فیلد confirmed، مقدار مورد انتظار ما true است. بنابراین مورد Additionally assert value را تیک می‌زنیم و در بخش Expected Value مقدار true را وارد می‌کنیم.\n   \n   ![JSON Assertion Sample](.\u002Fresources\u002Fjson-assertion-sample.png?raw=true \"JSON Assertion Sample\")\n\n4. تست را اجرا می‌کنیم و پاسخی مانند شکل زیر دریافت می‌کنیم:\n   \n   ![JSON Assertion Failure Response](.\u002Fresources\u002Fjson-assertion-failure-response.png?raw=true \"JSON Assertion Failure Response\")\n\nهمانطور که در شکل بالا مشخص است، درخواست با مشکل مواجه شده و فیلد confirmed در پاسخ وجود ندارد، بنابراین Assertion با خطا مواجه شده و با رنگ قرمز نمایش داده می‌شود. همچنین در listener پیغامی مبنی بر عدم وجود فیلد مورد نظر نمایش داده می‌شود.\n\n   ![JSON Assertion Failure](.\u002Fresources\u002Fjson-assertion-failure.png?raw=true \"JSON Assertion Failure\")\n\nاگر درخواست با موفقیت اجرا شود و مقدار دریافتی با مقدار مورد انتظار برابر باشد، assertion با موفقیت اجرا شده و درخواست با رنگ سبز مشخص می‌شود.\n\n   ![JSON Assertion Pass](.\u002Fresources\u002Fjson-assertion-pass.png?raw=true \"JSON Assertion Pass\")\n\n### 3. JSR223 Assertion\n\nبا استفاده از JSR223 Assertion و اسکریپت‌نویسی می‌توان پاسخ دریافتی مورد نظر را بررسی و ارزیابی کرد. گاهی اوقات لازم است موارد خاص و پیچیده‌تری را بررسی کرد. استفاده از JSR223 Assertion نیازمند دانش استفاده از زبان‌های اسکریپت‌نویسی مانند groovy و … است.\n\nمیزان مصرف منابعی مانند CPU و حافظه بستگی به اسکریپتی که نوشته شده دارد، بنابراین سعی کنید اسکریپی که می‌نویسید پیچیدگی کمتری داشته باشد.\n\nJSR223 Assertion نسبت به BeanShell Assertion انعطاف‌پذیری بالاتری دارد، منابع کمتری مصرف می‌کند و سریع‌تر است.\n\nاین Assertion شامل بخش‌های زیر است:\n* **Language:** زبانی که قصد دارید با استفاده از آن اسکریپت‌نویسی کنید.\n* **Parameters:** پارامترهایی که میخواهید به اسکریپت خود ارسال کنید.\n* **Script file:** فایل حاوی اسکریپت برای اجرا\n* **Script:** اسکریپتی که می‌خواهید اجرا شود را در این بخش بنویسید. این بخش در صورتی که در قسمت Script file فایلی را مشخص نکرده باشید اجباری است.\n  \nدر ادامه چند مورد از متغیر هایی که میتوانید در اسکریپت خود استفاده کنید را بررسی میکنیم:\n* **log:** برای نوشتن در لاگ فایل\n* **vars:** برای گرفتن دسترسی خواندن\u002Fنوشتن متغیرها\n* **sampler:** گرفتن دسترسی برای Sampler جاری\n* **AssertionResult:** نتیجه Assertion\n\nبرای درک بهتر، در ادامه قصد داریم برای درخواست دریافت لیست آموزش‌های جی‌میتر در سایت گزمه، با استفاده از JSR233 Assertion پاسخ دریافتی را بررسی کنیم. وقتی API مربوطه را اجرا می‌کنیم، آرایه ای از اشیا دریافت می‌کنیم که شامل اطلاعات مربوط به آموزش‌ها مانند مواردی مانند ، tagName title و … هستند. \n\n   ![Gazmeh Jmeter Posts](.\u002Fresources\u002Fgazmeh-jmeter-posts.png?raw=true \"Gazmeh Jmeter Posts\")\n\nبه عنوان مثال اسکریپتی با استفاده از groovy می‌نویسیم تا به کمک آن بررسی کنیم فیلد tagName تمامی آموزش‌ها برابر با \"جی‌میتر\" باشد:\n```groovy\nimport groovy.json.JsonSlurper\n\nerror=false; msg=\"\";\n\ntry{\n   jsonSlurper = new JsonSlurper();\n   _jsonObj = jsonSlurper.parseText(prev.getResponseDataAsString());\n\n\n   for(int i=0 ; i\u003C_jsonObj.items.size() ; i++)\n   {\n       if(!_jsonObj.items[i].tags[0].tagName.equals(\"جی‌میتر\"))\n           {\n               error=true;\n               msg=msg+ \"\\n post \" + _jsonObj.items[i].id + \": the tag name is incorrect,\" + \" the expected is جی‌میتر but actual tag name is: \" + _jsonObj.items[i].tags[0].tagName;\n           }\n   }\n}\n\ncatch(Exception ex){\n   error=true;\n   msg=msg+\"\\nException: \"+ex.getMessage();   \n}\n\nif(error){\n   AssertionResult.setFailure(true);\n    AssertionResult.setFailureMessage(msg);\n}\n```\n\nاگر شرط مورد نظر برقرار باشد، این Assertion با موفقیت اجرا می‌شود و نتیجه آن در View Results Tree Listener به صورت زیر خواهد بود:\n\n   ![JSR223 Assertion Pass](.\u002Fresources\u002Fjsr223-assertion-pass.png?raw=true \"JSR223 Assertion Pass\")\n\nحال اگر در پاسخ دریافتی مقدار tagName برابر با جی‌میتر نباشد، این Assertion با شکست مواجه می‌شود:\n\n   ![JSR223 Assertion Failure](.\u002Fresources\u002Fjsr223-assertion-fail.png?raw=true \"JSR223 Assertion Failure\")\n\n\n### 4. Duration Assertion\n\nبا استفاده از این Assertion می‌توان مشخص کرد که آیا سرور در زمان مشخص شده پاسخ داده است یا خیر. بنابراین برای درخواست‌هایی از Duration Assertion استفاده می‌کنیم که ارزیابی زمان پاسخ مهم است. استفاده از این Assertion برای تست کارایی و سنجش عملکرد سیستم توصیه می‌شود.\n\n   ![Duration Assertion](.\u002Fresources\u002Fduration-assertion.png?raw=true \"Duration Assertion\")\n\n* **Duration in Milliseconds:** بیشترین مدت زمانی که مجاز است تا پاسخ از سرور دریافت شود. (بر حسب میلی‌ثانیه)\n  \nاگر پاسخ در مدت زمانی بیشتر از مدت زمان مشخص شده از سرور دریافت شود، این Assertion با خطا مواجه می‌شود.\n\n   ![Response Time Schematic](.\u002Fresources\u002Fresponse-time-schematic.png?raw=true \"Response Time Schematic\")\n\nبه عنوان مثال چندین کاربر همزمان، درخواست دریافت لیست آموزش‌های جی‌میتر سایت گزمه را اجرا می‌کنند. حال می‌خواهیم بررسی کنیم که آیا سرور هر درخواست را در کمتر از 450 میلی‌ثانیه پاسخ می‌دهد و یا تحت تاثیر بار زیاد قرار گرفته و مدت زمان ارسال پاسخ افزایش می‌یابد. بنابراین مقدار Duration in millisecond را برابر با 450 قرار می‌دهیم:\n\n   ![Duration Assertion Sample](.\u002Fresources\u002Fduration-assertion-sample.png?raw=true \"Duration Assertion Sample\")\n\nپس از اجرا اگر مدت زمان دریافت پاسخ کمتر از 450 میلی‌ثانیه باشد، با موفقیت اجرا می‌شود. همانطور که در شکل زیر مشاهده می‌کنید، پاسخ در مدت زمان 441 میلی‌ثانیه دریافت شده، بنابراین این Assertion در View Result Tree Listener با رنگ سبز مشخص می‌شود:\n\n   ![Duration Assertion Pass](.\u002Fresources\u002Fduration-assertion-pass.png?raw=true \"Duration Assertion Pass\")\n\nAssertion درخواست هایی که پاسخ آن‌ها در مدت زمانی بیشتر از 450 میلی ثانیه دریافت شود، با خطا مواجه شده و با رنگ قرمز مشخص می‌شوند. در شکل زیر پاسخ درخواستی در 511 میلی‌ثانیه دریافت شده، بنابراین این Assertion با شکست مواجه می‌شود.\n\n   ![Duration Assertion Failure](.\u002Fresources\u002Fduration-assertion-failure.png?raw=true \"Duration Assertion Failure\")\n\n## Plugin ها\n\nAssertion‌های دیگری نیز در پکیج اصلی خود جی‌میتر وجود دارند که می‌توانید براساس نیاز خود، هر کدام را اضافه و استفاده کنید.\n\n\n\n \n","https:\u002F\u002Fraw.githubusercontent.com\u002Fgazmeh-site\u002Fposts\u002Frefs\u002Fheads\u002Fmain\u002Ffa\u002Fjmeter\u002Fassertions\u002Fresources\u002FimageCover.png?raw=true","https:\u002F\u002Fraw.githubusercontent.com\u002Fgazmeh-site\u002Fposts\u002Frefs\u002Fheads\u002Fmain\u002Ffa\u002Fjmeter\u002Fassertions\u002Fresources\u002FimageThumbnail.png?raw=true",null,"jmeter-assertions","2025-12-11T14:51:01.321Z","https:\u002F\u002Fraw.githubusercontent.com\u002Fgazmeh-site\u002Fposts\u002Fmain\u002Ffa\u002Fjmeter\u002Fassertions\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"]