كيف تتصل بخدمة الويب المريحة باستخدام JMeter؟ قم بإجراء اختبار تحميل بسيط وأتمتة
نشرت: 2018-02-12لقد حظي النقل التمثيلي للحالة (REST) بقبول واسع عبر الويب كبديل أبسط لخدمات الويب المستندة إلى SOAP ولغة وصف خدمات الويب (WSDL).
الدليل الرئيسي على هذا التحول في تصميم الواجهة هو اعتماد REST من قبل مزودي خدمة Web 2.0 السائد - بما في ذلك Yahoo و Google و Facebook - الذين توقفوا عن استخدام الواجهات المستندة إلى SOAP و WSDL أو قاموا بتمريرها لصالح استخدام أسهل ، نموذج موجه نحو الموارد لفضح خدماتهم. في بعض الأحيان يتعين عليك اختبار خدمة الويب RESTFul الخاصة بك. قد يكون لديك خياران:
- اضغط على WebService باستخدام عنوان URL واحد
- استخدم
JMeter
على WebService في الحلقة. يقوم هذا الاختبار أيضًا بإجراء بعضLoad Test
البسيطة.
هنا في هذا المثال سأشرح لك كيفية إنشاء Simple Hello World WebService
وضرب نفس WebService باستخدام JMeter.
إذا كان لديك أي من الأسئلة الواردة أدناه ، فأنت في المكان الصحيح:
- اختبار SOAP / REST Web Services باستخدام JMeter
- اختبار أداء RESTful API باستخدام JMeter
- Rest API Automation في JMeter - اختبار الأداء
- كيفية اختبار REST API باستخدام JMeter
- استخدام JMeter لاختبار خدمة ويب RESTful (جيرسي)
ملخص العمل:
-
Pre-Requisite:
تنفيذ خدمة RESTFul هذه بالكامل. - قم بإنشاء فئة Java بسيطة: CrunchifyJMeterTest.java (الخدمة التي سنضربها باستخدام JMeter).
- أعد نشر نفس التطبيق على خادم الويب Apache Tomcat.
- قم بتشغيل JMeter وافتح ملف
.jmx
المقدم أدناه - قم بتشغيل الاختبار وتحليله
يجب أن يقرأ آخر:
- SOAP مقابل REST: بروتوكول الوصول إلى الكائنات البسيط مقابل بروتوكول الوصول إلى الكائنات. تحويل الحالة التمثيلية
الخطوة 1
Pre-Requisite:
تنفيذ خدمة RESTFul هذه بالكامل. نشر وتشغيل التطبيق.
اسمحوا لي أن أعرف إذا كنت ترى أي مشكلة في ذلك.
الخطوة 2
قم بإنشاء ملف CrunchifyJMeterTest.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
package com . crunchify . restjersey ; import java . io . FileNotFoundException ; import java . io . IOException ; import javax . ws . rs . GET ; import javax . ws . rs . Path ; import javax . ws . rs . Produces ; /** * @author Crunchify * */ @ Path ( "/index" ) public class CrunchifyJMeterTest { @ GET @ Produces ( "text/html" ) public String checkECV ( ) throws InterruptedException , FileNotFoundException , IOException { String result = "<br><div align='center'><h2>Hey This is Crunchify's JMeter Test...</h2></div>" ; System . out . println ( result ) ; Thread . sleep ( 1000 ) ; return result ; } } |
يجب أن ترى أدناه بنية دليل Eclipse:
الخطوه 3
أعد نشر نفس مشروع CrunchifyRESTJerseyExample على Tomcat. اختبرها من خدمة REST الخاصة بك.
URL:
http: // localhost: 8080 / CrunchifyRESTJerseyExample / crunchify / index /
الخطوة 4
انسخ الكود أدناه إلى ملف واحفظه باسم Crunchify-JMeter-Test.jmx
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 |
<? xml version = "1.0" encoding = "UTF-8" ?> < jmeterTestPlan version = "1.2" properties = "2.4" jmeter = "2.9 r1437961" > < hashTree > < TestPlan guiclass = "TestPlanGui" testclass = "TestPlan" testname = "App Shah Desktop Test" enabled = "true" > < stringProp name = "TestPlan.comments" > < / stringProp > < boolProp name = "TestPlan.functional_mode" > false < / boolProp > < boolProp name = "TestPlan.serialize_threadgroups" > false < / boolProp > < elementProp name = "TestPlan.user_defined_variables" elementType = "Arguments" guiclass = "ArgumentsPanel" testclass = "Arguments" testname = "User Defined Variables" enabled = "true" > < collectionProp name = "Arguments.arguments" / > < / elementProp > < stringProp name = "TestPlan.user_define_classpath" > < / stringProp > < / TestPlan > < hashTree > < ThreadGroup guiclass = "ThreadGroupGui" testclass = "ThreadGroup" testname = "Crunchify's REST Service JMeter Test" enabled = "true" > < stringProp name = "ThreadGroup.on_sample_error" > continue < / stringProp > < elementProp name = "ThreadGroup.main_controller" elementType = "LoopController" guiclass = "LoopControlPanel" testclass = "LoopController" testname = "Loop Controller" enabled = "true" > < boolProp name = "LoopController.continue_forever" > false < / boolProp > < intProp name = "LoopController.loops" > - 1 < / intProp > < / elementProp > < stringProp name = "ThreadGroup.num_threads" > 5 < / stringProp > < stringProp name = "ThreadGroup.ramp_time" > 2 < / stringProp > < longProp name = "ThreadGroup.start_time" > 1367432020000 < / longProp > < longProp name = "ThreadGroup.end_time" > 1367432020000 < / longProp > < boolProp name = "ThreadGroup.scheduler" > false < / boolProp > < stringProp name = "ThreadGroup.duration" > < / stringProp > < stringProp name = "ThreadGroup.delay" > < / stringProp > < / ThreadGroup > < hashTree > < HTTPSamplerProxy guiclass = "HttpTestSampleGui" testclass = "HTTPSamplerProxy" testname = "HTTP Request" enabled = "true" > < boolProp name = "HTTPSampler.postBodyRaw" > true < / boolProp > < elementProp name = "HTTPsampler.Arguments" elementType = "Arguments" > < collectionProp name = "Arguments.arguments" > < elementProp name = "" elementType = "HTTPArgument" > < boolProp name = "HTTPArgument.always_encode" > false < / boolProp > < stringProp name = "Argument.value" > < / stringProp > < stringProp name = "Argument.metadata" > = < / stringProp > < / elementProp > < / collectionProp > < / elementProp > < stringProp name = "HTTPSampler.domain" > localhost < / stringProp > < stringProp name = "HTTPSampler.port" > 8080 < / stringProp > < stringProp name = "HTTPSampler.connect_timeout" > 10000 < / stringProp > < stringProp name = "HTTPSampler.response_timeout" > 10000 < / stringProp > < stringProp name = "HTTPSampler.protocol" > < / stringProp > < stringProp name = "HTTPSampler.contentEncoding" > < / stringProp > < stringProp name = "HTTPSampler.path" > / CrunchifyRESTJerseyExample / crunchify / index < / stringProp > < stringProp name = "HTTPSampler.method" > GET < / stringProp > < boolProp name = "HTTPSampler.follow_redirects" > true < / boolProp > < boolProp name = "HTTPSampler.auto_redirects" > false < / boolProp > < boolProp name = "HTTPSampler.use_keepalive" > true < / boolProp > < boolProp name = "HTTPSampler.DO_MULTIPART_POST" > false < / boolProp > < boolProp name = "HTTPSampler.monitor" > false < / boolProp > < stringProp name = "HTTPSampler.embedded_url_re" > < / stringProp > < / HTTPSamplerProxy > < hashTree / > < ResultCollector guiclass = "StatGraphVisualizer" testclass = "ResultCollector" testname = "Aggregate Graph" enabled = "true" > < boolProp name = "ResultCollector.error_logging" > false < / boolProp > < objProp > < name > saveConfig < / name > < value class = "SampleSaveConfiguration" > < time > true < / time > < latency > true < / latency > < timestamp > true < / timestamp > < success > true < / success > < label > true < / label > < code > true < / code > < message > true < / message > < threadName > true < / threadName > < dataType > true < / dataType > < encoding > false < / encoding > < assertions > true < / assertions > < subresults > true < / subresults > < responseData > false < / responseData > < samplerData > false < / samplerData > < xml > true < / xml > < fieldNames > false < / fieldNames > < responseHeaders > false < / responseHeaders > < requestHeaders > false < / requestHeaders > < responseDataOnError > false < / responseDataOnError > < saveAssertionResultsFailureMessage > false < / saveAssertionResultsFailureMessage > < assertionsResultsToSave > 0 < / assertionsResultsToSave > < bytes > true < / bytes > < / value > < / objProp > < stringProp name = "filename" > < / stringProp > < / ResultCollector > < hashTree / > < ResultCollector guiclass = "StatVisualizer" testclass = "ResultCollector" testname = "Aggregate Report" enabled = "true" > < boolProp name = "ResultCollector.error_logging" > false < / boolProp > < objProp > < name > saveConfig < / name > < value class = "SampleSaveConfiguration" > < time > true < / time > < latency > true < / latency > < timestamp > true < / timestamp > < success > true < / success > < label > true < / label > < code > true < / code > < message > true < / message > < threadName > true < / threadName > < dataType > true < / dataType > < encoding > false < / encoding > < assertions > true < / assertions > < subresults > true < / subresults > < responseData > false < / responseData > < samplerData > false < / samplerData > < xml > false < / xml > < fieldNames > false < / fieldNames > < responseHeaders > false < / responseHeaders > < requestHeaders > false < / requestHeaders > < responseDataOnError > false < / responseDataOnError > < saveAssertionResultsFailureMessage > false < / saveAssertionResultsFailureMessage > < assertionsResultsToSave > 0 < / assertionsResultsToSave > < bytes > true < / bytes > < / value > < / objProp > < stringProp name = "filename" > < / stringProp > < / ResultCollector > < hashTree / > < / hashTree > < / hashTree > < / hashTree > < / jmeterTestPlan > |

الخطوة 5
- تنزيل Apache JMeter.
- قم بتشغيل JMeter باستخدام ملف jmeter.bat أو jmeter.sh
- انقر فوق
File -> Open
- انتقل إلى المجلد حيث قمت بحفظ الملف Crunchify-JMeter-Test.jmx وحدد الملف
الخطوة 6
- الآن قم بتوسيع Crunchify's Rest Service JMeter Test كما ترى في الصورة أدناه
- انقر فوق طلب HTTP
- تأكد من صحة المعلمات أدناه
الخطوة 7
تحليل نتيجة الاختبار الخاصة بك.
بقية أتمتة API في JMeter؟
حسنًا ، بعد كل دورة تطوير ، يمكنك إجراء اختبار قمت بتعريفه بالفعل في ملف JMeter في فترة زمنية محددة.
هناك عدد من الطرق الأخرى التي يمكنك من خلالها تغيير معلمات الاختبار. العب بها وأخبرني كيف ستسير الأمور أو إذا رأيت أي مشكلة في ذلك.