Selenium WebDriver - متري اختبار في الوقت الحقيقي باستخدام Grafana و InfluxDB

مرحبا بالجميع! في الأسبوع القادم ، ستبدأ الدروس في مجموعة Java QA Engineer . سيتم توقيت هذا ليتزامن مع المنشور الحالي.



لمحة عامة:


التنفيذ اليومي لاختبارات الانحدار الآلي كجزء من التجميع اليومي أمر لا مفر منه في الوقت الحالي. من الجيد العثور على الأخطاء والإبلاغ عنها مباشرة بعد العثور عليها. في الوقت نفسه ، من الصعب إجراء المئات من الاختبارات الآلية والتنفيذ المتوازي عن بعد. بمجرد أن يكون لديك مجموعة من اختبارات الانحدار الآلي ، يمكنك تقسيمها إلى عدة مجموعات من وحدات الأعمال وتشغيلها بشكل متوازٍ ، كجزء من اختبار الانحدار الآلي اليومي. تعمل معظم أجنحة الاختبار هذه على جهاز افتراضي افتراضي ، ولا تتوفر نتائج الاختبار إلا بعد تشغيله. خلاف ذلك ، يمكنك النظر في وحدة التحكم jenkins لمشاهدة سجلات عملية تنفيذ الاختبار. هذا أمر مزعج في بعض الأحيان. سيكون من الرائع أن يكون لديك تطبيق يوفر معلومات حول اجتياز الاختبار أثناء تشغيله على أجهزة افتراضية عن بعد.

دعونا نرى كيف يمكنك إنشاء صفحة بسيطة مع نتائج الاختبار ولوحة القيادة باستخدام InfluxDB و Grafana.

الهدف:


سنجمع جميع مقاييس الاختبار المتاحة ، مثل:

  • حالة طريقة الاختبار
  • طريقة الاختبار المدة
  • حالة الصف مع طرق الاختبار
  • وقت تشغيل اختبار من فئة واحدة
  • حالة جناح الاختبار
  • اختبار المدى التشغيل


يمكننا الحصول على بعض المؤشرات في الوقت الحقيقي ، كما هو مبين أدناه:

  • عدد طرق الاختبار المجمعة حسب الحالة (على سبيل المثال: مرور: 30 ، فشل: 2 ، تم تخطي: 2) في يوم معين.
  • الاتجاه في مدة مجموعة من الاختبارات لمدة أسبوع ، شهر ، سنة ، إلخ.


InfluxDB:


InfluxDB هي قاعدة بيانات للسلاسل الزمنية تُستخدم لجمع جميع مقاييس الاختبار. يحتوي InfluxDB على واجهة برمجة تطبيقات REST لكتابة البيانات وإرسال الطلبات. يمكنك معرفة المزيد هنا . أدناه ، استخدم الأمر docker لبدء مثيل InfluxDB.

sudo docker run -p 8086:8086 -v $PWD:/var/lib/influxdb influxdb 


إنشاء قاعدة بيانات:


لقد قمنا بالفعل برفع وإطلاق قاعدة بيانات InfluxDB. لنقم بإنشاء مخطط قاعدة بيانات منفصل لجمع نتائج اختبار السيلينيوم. أسفل تشغيل أمر في المحطة لإنشاء مخطط يسمى "السيلينيوم" في قاعدة البيانات. (تحقق من عنوان URL ، استبدل مضيف محلي باسم مضيف / ipaddress إذا كنت لا تعمل على الكمبيوتر الحالي).

 curl -i -XPOST http://localhost:8086/query --data-urlencode "q=CREATE DATABASE selenium" 


TestNG:


لنقم بإنشاء اختبار testNG بسيط:

 public class SampleTest { @Test(description = "login") public void login(){ } @Test(description = "search for flights", dependsOnMethods = "login") public void search(){ } @Test(description = "select flight", dependsOnMethods = "search") public void select(){ } @Test(description = "book flight", dependsOnMethods = "select") public void book(){ } @Test(description = "logout", dependsOnMethods = "book") public void logout(){ } } 


هدفنا هو جمع نتائج الاختبار في InfluxDB في وقت التشغيل. لذلك ، نحن بحاجة إلى برنامج تشغيل / مكتبة في Java لـ InfluxDB.

تبعيات مخضرم:


أضف تبعيات Maven الموضحة أدناه:

 <dependency> <groupId>org.influxdb</groupId> <artifactId>influxdb-java</artifactId> <version>2.12</version> </dependency> 


الطلاب:


مستمعو TestNG رائعون للاستماع إلى الأحداث ، وقد يستجيبون حسب ما حدث. أولاً ، دعنا ننشئ فئة بسيطة تكون مسؤولة عن إرسال النتائج إلى InfluxDB.

 import org.influxdb.InfluxDB; import org.influxdb.InfluxDBFactory; import org.influxdb.dto.Point; public class ResultSender { private static final InfluxDB INFLXUDB = InfluxDBFactory.connect("http://localhost:8086", "root", "root"); private static final String DATABASE = "selenium"; static{ INFLXUDB.setDatabase(DATABASE); } public static void send(final Point point){ INFLXUDB.write(point); } } 


الآن قم بإنشاء فئة أخرى تنفذ واجهة ITestListener.

 import org.influxdb.dto.Point; import org.testng.ITestContext; import org.testng.ITestListener; import org.testng.ITestResult; import java.util.concurrent.TimeUnit; public class ExecutionListener implements ITestListener { public void onTestStart(ITestResult iTestResult) { } public void onTestSuccess(ITestResult iTestResult) { this.sendTestMethodStatus(iTestResult, "PASS"); } public void onTestFailure(ITestResult iTestResult) { this.sendTestMethodStatus(iTestResult, "FAIL"); } public void onTestSkipped(ITestResult iTestResult) { this.sendTestMethodStatus(iTestResult, "SKIPPED"); } public void onTestFailedButWithinSuccessPercentage(ITestResult iTestResult) { } public void onStart(ITestContext iTestContext) { } public void onFinish(ITestContext iTestContext) { this.sendTestClassStatus(iTestContext); } private void sendTestMethodStatus(ITestResult iTestResult, String status) { Point point = Point.measurement("testmethod") .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) .tag("testclass", iTestResult.getTestClass().getName()) .tag("name", iTestResult.getName()) .tag("description", iTestResult.getMethod().getDescription()) .tag("result", status) .addField("duration", (iTestResult.getEndMillis() - iTestResult.getStartMillis())) .build(); ResultSender.send(point); } private void sendTestClassStatus(ITestContext iTestContext) { Point point = Point.measurement("testclass") .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) .tag("name", iTestContext.getAllTestMethods()[0].getTestClass().getName()) .addField("duration", (iTestContext.getEndDate().getTime() - iTestContext.getStartDate().getTime())) .build(); ResultSender.send(point); } } 


ملاحظة: استخدم علامة اختيارية تلبي أهدافك في المثال أعلاه لتصنيف النتائج. على سبيل المثال العلامة ("السيناريو" ، "تدفق تسجيل الدخول").

سيقوم المستمع من المثال أعلاه بمراقبة تنفيذ الاختبار وبمجرد اكتمال طريقة / فئة معينة من الاختبار ، سوف يرسل الاسم والمدة وبعض التفاصيل الإضافية. هدفي هنا هو فقط لأعطيك فكرة. تغيير الرمز وفقا لاحتياجاتك.

أضف الآن المستمع إلى حزمة XML أو إلى الفئة الأساسية TestNG.

 <suite name="My suite"> <listeners> <listener class-name="com.tag.realtime.ExecutionListener" /> </listeners> <test name="Test1"> <classes> <class name="com.tag.realtime.SampleTest"/> </classes> </test> <test name="Test2"> <classes> <class name="com.tag.realtime.Sample2Test"/> </classes> </test> </suite> 


أو غير ذلك:

 @Listeners(ExecutionListener.class) public class SampleTest { @Test public void test(){ } } 


Grafana:


تمكنا من إرسال النتائج إلى InfluxDB. ولكن كيف تطلب النتائج وتصور البيانات المستلمة؟ لهذا سنستخدم أداة مجانية أخرى تسمى "Grafana".
Grafana هي أداة تصوير ممتازة لبيانات السلاسل الزمنية ؛ فهي تتفاعل تمامًا مع InfluxDB. فيما يلي أوامر عامل ميناء لإنشاء مثيل من Grafana. [البرنامج المساعد piechart هو اختياري في الفريق ، ويمكن إزالته إذا لم تكن هناك حاجة]

 docker run -d -p 3000:3000 --name=grafana \ -e "GF_INSTALL_PLUGINS=grafana-piechart-panel" \ -v $PWD:/var/lib/grafana \ grafana/grafana 


مصدر البيانات ل Grafana:


انتقل إلى الإعدادات -> مصادر البيانات -> إضافة مصدر بيانات جديد ، كما هو موضح في لقطة الشاشة. انقر فوق الزر "حفظ واختبار" للتأكد من قدرة Grafana على التواصل مع InfluxDB.
ملاحظة: إذا كنت تستخدم Grafana مع Docker وتحاول الوصول إلى "خادم افتراضي" ، فلا تستخدم المضيف المحلي في سلسلة اتصال InfluxDB. ذلك لأن المضيف المحلي هنا هو حاوية غرافانا ، وليس آلة مادية. لذلك ، لن تتمكن حاوية Grafana من العثور على InfluxDB.




إنشاء لوحة معلومات:


أود منك مشاهدة هذا الفيديو ، لأنه ليس من السهل شرح جميع الفروق الدقيقة في المقال. لهذا السبب قمت بتسجيل فيديو فندق.



العرض التوضيحي 2:


لتلخيص:


آمل أن يكون الحصول على نتائج في الوقت الفعلي باستخدام InfluxDB و Grafana أمرًا مثيرًا للاهتمام ومفيدًا. يتطلب تغييرات بسيطة في البنية الحالية ، لأننا نستخدم مستمعي TestNG. تعتبر إزالة المستمع من ملف فئة set / base كافية لتعطيل هذه الوظيفة إذا لم تكن في حاجة إليها. سيساعد مثل هذا النهج في تجنب بعض الإحباط في الفريق إذا كان أعضاؤه يشاركون فقط في مراقبة نتائج الاختبار عبر وحدة الإدخال / الإخراج الموجودة على الجهاز البعيد. هذا المقال يحدد فقط الفكرة الرئيسية. يمكنك تحسين هذا النهج بإضافة المزيد من المعلومات ، على سبيل المثال ، بيئة اختبار ، إضافة عوامل تصفية إضافية لتحديث البيانات في المخططات لبيئة / اختبارات محددة ، إلخ.

هذه مادة قصيرة ولكنها مفيدة للغاية. تقليديًا ، ننتظر تعليقاتك ، ونذكر أيضًا أن اليوم سيكون يومًا مفتوحًا بالمعدل الذي يمكن لأي شخص الاشتراك فيه.

Source: https://habr.com/ru/post/ar452908/


All Articles