تخطيط اختبارات التحميل باستخدام Apache JMeter
في هذا القسم، ستستكشف اختبار التحميل وتتعلم كيفية إضافة اختبارات التحميل إلى البنية الأساسية لبرنامج ربط العمليات التجارية. تستخدم اختبارات التحميل Apache JMeter لمحاكاة العديد من المستخدمين الذين يصلون إلى تطبيق الويب في وقت واحد. تجلب الاختبارات محتوى الويب من التطبيق الذي يعمل على Azure App Service في بيئة التقسيم المرحلي .
يبدأ تيم بإحضار واجهة مستخدم Apache JMeter على كمبيوتر محمول. يدير خطة اختبار أساسية. ثم يقوم تيم ومارا بتصدير خطة الاختبار إلى ملف يمكن تشغيله من سطر الأوامر. وأخيرا، يضيفون المهام إلى Azure Pipelines لتشغيل اختبارات التحميل أثناء التقسيم المرحلي.
إشعار
للإيجاز، لا تحتاج إلى تثبيت Apache JMeter على الكمبيوتر المحلي. يمكنك فقط القراءة على طول.
تشغيل اختبارات التحميل من Apache JMeter
Apache JMeter هي أداة اختبار تحميل مفتوحة المصدر تقوم بتحليل الأداء وقياسه. التقرير الذي ينشئه هو ملف XML.
يمكن ل Azure Pipelines قراءة تقرير Apache JMeter وإنشاء رسم بياني. لا تحتاج إلى أي أجهزة خاصة لتشغيل هذه الاختبارات، حتى تتمكن من استخدام عامل مستضاف من Microsoft لتشغيلها. في سيناريو Space Game، من المحتمل أن تقوم بتشغيل هذه الاختبارات في التقسيم المرحلي.
إنشاء خطة الاختبار
إليك ما يبدو عليه Apache JMeter على كمبيوتر محمول يعمل بنظام Linux:
يمكنك إنشاء ملف خطة اختبار جديدة؛ على سبيل المثال، LoadTest.jmx. ثم تقوم بإضافة مجموعة مؤشرات ترابط إلى الملف. يعمل كل مستخدم محاكاة على مؤشر الترابط الخاص به. تتحكم مجموعة مؤشرات الترابط في عدد المستخدمين وعدد طلبات كل مستخدم.
يوضح المثال التالي 10 مستخدمين محاكاة (مؤشرات الترابط). يقدم كل مستخدم 10 طلبات، بحيث يحصل النظام على إجمالي 100 طلب.
عينة هو طلب واحد قام به JMeter. يمكن ل JMeter الاستعلام عن الخوادم عبر HTTP وFTP وTCP والعديد من البروتوكولات الأخرى. تقوم أدوات العينة بإنشاء النتائج التي تتم إضافتها إلى التقرير.
بعد ذلك، يمكنك إضافة Http Request Defaults ونموذج طلب Http إلى مجموعة مؤشر الترابط. يمكنك توفير اسم مضيف موقع ويب Space Game الذي يعمل في بيئة التشغيل المرحلي على Azure App Service.
ينشئ السيناريو السابق خطة اختبار أساسية.
تشغيل خطة الاختبار
يمكنك JMeter من إجراء العديد من أنواع الاختبارات. من الممكن تشغيل خطة الاختبار الخاصة بك من واجهة المستخدم الرسومية JMeter. ومع ذلك، بالنسبة لاختبارات التحميل، توصي وثائق JMeter بتشغيل خطة الاختبار من سطر الأوامر.
يمكنك تشغيل خطة الاختبار باستخدام هذا الأمر:
apache-jmeter-5.4.1/bin/./jmeter -n -t LoadTest.jmx -o Results.xml
-n
تحدد الوسيطة لتشغيل JMeter في وضع غير واجهة المستخدم الرسومية. يتم تحديد -t
الوسيطة لملف خطة الاختبار LoadTest.jmx. يتم تحديد -o
الوسيطة لملف Results.xml.
يقوم JMeter بتشغيل ملف التقرير وإنتاجه، Results.xml. يعرض هذا المثال من الملف النتائج القليلة الأولى:
<?xml version="1.0" encoding="UTF-8"?>
<testResults version="1.2">
<httpSample t="180" it="0" lt="95" ct="35" ts="1569306009772" s="true" lb="HTTP Request" rc="200" rm="OK" tn="Thread Group 1-1" dt="text" by="40871" sby="144" ng="1" na="1">
<java.net.URL>http://tailspin-space-game-web-staging-1234.azurewebsites.net/</java.net.URL>
</httpSample>
<httpSample t="174" it="0" lt="96" ct="38" ts="1569306009955" s="true" lb="HTTP Request" rc="200" rm="OK" tn="Thread Group 1-1" dt="text" by="40869" sby="144" ng="1" na="1">
<java.net.URL>http://tailspin-space-game-web-staging-1234.azurewebsites.net/</java.net.URL>
</httpSample>
<httpSample t="160" it="0" lt="121" ct="35" ts="1569306010131" s="true" lb="HTTP Request" rc="200" rm="OK" tn="Thread Group 1-1" dt="text" by="40879" sby="144" ng="2" na="2">
<java.net.URL>http://tailspin-space-game-web-staging-1234.azurewebsites.net/</java.net.URL>
</httpSample>
تنتج كل عينة عقدة في التقرير. t
تحدد السمة وقت الاستجابة بالمللي ثانية (مللي ثانية). هنا، ترى ثلاثة طلبات استغرقت 180 مللي ثانية و174 مللي ثانية و160 مللي ثانية.
يجب أن يكون متوسط أوقات الطلب المثالي أقل من ثانية واحدة. يجب ألا يستغرق أكثر من 10 بالمائة من الطلبات أكثر من ثانية واحدة. يمكنك تكوين JMeter للإبلاغ عن إحصائيات مثل الحد الأدنى والحد الأقصى ومتوسط أوقات الاستجابة أو الانحراف المعياري. يمكنك كتابة برنامج نصي للمساعدة في توفير هذه المعلومات.
لتصور نتائج الاختبار، تحتاج إلى توفيرها بتنسيق يفهمه Azure Pipelines. يمكن ل Azure Pipelines تحليل ملف XML الذي يحتوي على نتائج الاختبار، ولكن يجب أن يكون الملف بتنسيق مدعوم. تتضمن التنسيقات المدعومة CTest وJUnit (بما في ذلك PHPUnit) وNUnit 2 وNUnit 3 وVisual Studio Test (TRX) وxUnit 2. يمكنك كتابة ملف XSLT الذي يحول نتائج JMeter إلى JUnit.
تحويل التقرير إلى JUnit
تشير XSLT إلى تحويلات XSL أو تحويلات لغة ورقة أنماط قابلة للتوسيع. يشبه ملف XSLT ملف XML، ولكنه يمكنك من تحويل مستند XML إلى تنسيق XML آخر.
تذكر متطلباتنا لاختبارات التحميل:
- يجب أن يكون متوسط وقت الطلب أقل من ثانية واحدة.
- يجب ألا يستغرق أكثر من 10 بالمائة من الطلبات أكثر من ثانية واحدة.
إليك ما يبدو عليه ملف XSLT الذي يلبي هذه المتطلبات:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:math="http://exslt.org/math">
<xsl:output method="xml" indent="yes" encoding="UTF-8"/>
<xsl:template match="/testResults">
<xsl:variable name="times" select="./httpSample/@t" />
<xsl:variable name="failures" select="./httpSample/assertionResult/failureMessage" />
<xsl:variable name="threshold" select="1000" />
<testsuite>
<xsl:attribute name="tests"><xsl:value-of select="count($times)" /></xsl:attribute>
<xsl:attribute name="failures"><xsl:value-of select="count($failures)" /></xsl:attribute>
<testcase>
<xsl:variable name="avg-time" select="sum($times) div count($times)" />
<xsl:attribute name="name">Average Response Time</xsl:attribute>
<xsl:attribute name="time"><xsl:value-of select="format-number($avg-time div 1000,'#.##')"/></xsl:attribute>
<xsl:if test="$avg-time > $threshold">
<failure>Average response time of <xsl:value-of select="format-number($avg-time,'#.##')"/> exceeds <xsl:value-of select="$threshold"/> ms threshold.</failure>
</xsl:if>
</testcase>
<testcase>
<xsl:variable name="exceeds-threshold" select="count($times[. > $threshold])" />
<xsl:attribute name="name">Max Response Time</xsl:attribute>
<xsl:attribute name="time"><xsl:value-of select="math:max($times) div 1000"/></xsl:attribute>
<xsl:if test="$exceeds-threshold > count($times) * 0.1">
<failure><xsl:value-of select="format-number($exceeds-threshold div count($times) * 100,'#.##')"/>% of requests exceed <xsl:value-of select="$threshold"/> ms threshold.</failure>
</xsl:if>
</testcase>
</testsuite>
</xsl:template>
</xsl:stylesheet>
لن نتعمق في كيفية عمل XSL هنا. ولكن للتلخيص، يجمع هذا الملف أولا البيانات التالية من إخراج JMeter:
كل وقت طلب HTTP.
يجمع هذه البيانات عن طريق تحديد السمة
t
من كلhttpSample
عنصر. (./httpSample/@t
)كل رسالة فشل.
يجمع هذه البيانات عن طريق تحديد كافة
failureMessage
العقد من المستند. (./httpSample/assertionResult/failureMessage
)
يعين ملف XSLT أيضا قيمة الحد إلى 1000 مللي ثانية. وقت الاستجابة هذا هو الحد الأقصى الذي حددناه سابقا.
نظرا لهذه المتغيرات، يوفر ملف XSLT العدد الإجمالي للاختبارات والعدد الإجمالي للفشل. ثم يوفر حالتي الاختبار هاتين:
- متوسط وقت الاستجابة، والفشل إذا تجاوز المتوسط عتبة 1000 مللي ثانية.
- الحد الأقصى لوقت الاستجابة، والفشل إذا تجاوز أكثر من 10 بالمائة من الطلبات حد 1000 مللي ثانية.
تتطابق نتائج XSLT مع تنسيق JUnit، الذي تفهمه Azure Pipelines. يمكنك تسمية ملف XSLT JMeter2JUnit.xsl.
بعد ذلك، ستحتاج إلى معالج XSLT. في هذا المثال، سنستخدم xsltproc، وهي أداة سطر أوامر لتطبيق أوراق أنماط XSLT على مستندات XML.
يمكنك تثبيت xsltproc كما يلي:
sudo apt-get install xsltproc
بعد ذلك، يمكنك تشغيل xsltproc لتحويل تقرير JMeter إلى JUnit:
xsltproc JMeter2JUnit.xsl Results.xml > JUnit.xml
فيما يلي ملف JUnit الناتج، JUnit.xml:
<?xml version="1.0" encoding="UTF-8"?>
<testsuite xmlns:math="http://exslt.org/math" tests="100" failures="0">
<testcase name="Average Response Time" time="0.17"/>
<testcase name="Max Response Time" time="0.373"/>
</testsuite>
في هذا المثال، متوسط وقت الاستجابة هو 170 مللي ثانية. الحد الأقصى لوقت الاستجابة هو 373 مللي ثانية. لا تنشئ حالة الاختبار فشلا، لأن كلتا المرتين أقل من عتبة 1000 مللي ثانية.
قريبا، ستقوم بإجراء هذه الاختبارات في البنية الأساسية لبرنامج ربط العمليات التجارية. يمكنك التفكير في Results.xml، الملف الذي يكتبه JMeter، كملف وسيط لم يتم نشره في نتائج اختبار المسار. JUnit.xml هو ملف التقرير النهائي. يتم نشر هذا الملف إلى البنية الأساسية لبرنامج ربط العمليات التجارية بحيث يمكن للفريق تصور النتائج.