تصدير شجرة الاختبار من جيميتر إلى النص

مرحبا يا هبر!


أنا أعمل على مشروع تكامل كبير (IBM WAS و WebSphere MQ و Oracle) وألف مشروعنا الدموي بشبكة من الاختبارات الوظيفية في JMeter ، والتي تعمل على منضدة اختبار وتستيقظ عند استدعاء Jenkins بعد نشر بنية جديدة. مع زيادة عدد الاختبارات ، واجهت مشكلة في الحفاظ على تحديث وثائق الاختبار.


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


والنتيجة صورة دقيقة إلى حد ما:


الصورة

ومع ذلك ، ليس كل مدير جاهزًا لإطلاق JMeter في المنزل لعرض الوضع في مجال ضمان الجودة. تاريخيا ، يتم الاحتفاظ بجميع وثائق المشروع في Confluence.
لم أكن مستعدًا لنسخ وصف حالات الاختبار يدويًا إلى صفحة Confluence بعد تطويرها في JMeter. لم يعط googling اليائس نتيجة - لم أجد حلاً جاهزًا وسهلًا لتصدير شجرة من الكائنات من JMeter إلى نص ( إذا كان هناك واحد ، اكتب عنه في التعليقات ، من فضلك ، وسوف أرش الرماد على رأسي من أداة "يمكنني google" ).


بعد النظر داخل ملف JMX (الامتداد القياسي لخطة اختبار JMeter) ، وجدت أن جميع الكائنات التي تهمني تم تمييزها بسمة testname :


نموذج لشريحة ملف JMX
<AuthManager guiclass="AuthPanel" testclass="AuthManager" testname="1.4.2   " enabled="true"> <collectionProp name="AuthManager.auth_list"> <elementProp name="" elementType="Authorization"> <stringProp name="Authorization.url">http://${ipKvp}:${portKvp}/TKVPImportTemporary</stringProp> <stringProp name="Authorization.username">${userKvp}</stringProp> <stringProp name="Authorization.password">${passKvp}</stringProp> <stringProp name="Authorization.domain">${domainKvp}</stringProp> <stringProp name="Authorization.realm"></stringProp> </elementProp> </collectionProp> <boolProp name="AuthManager.clearEachIteration">true</boolProp> </AuthManager> 

الشيء الوحيد المتبقي هو كتابة محلل ، والذي:


  1. النص المطلوب مع وصف الخطوة \ اختبار \ مجموعة من ملف JMX
  2. يرمي الأسطر مع وصف الكائنات غير المثيرة للاهتمام (المؤكد ، المؤقتات ، إلخ.)
  3. سيكتب كل شيء من أجل ملف بحيث يتضمن تحديث المستند لصق ونسخ واحد وحيد

تم التعامل مع الفقرة 1 بنجاح من خلال التعبير العادي:


(؟ <= testname = \ ") (. *) (؟ = \")

المنعكس بعدم استخدام xpath المكتسب في عملية كتابة محددات اختبارات السيلينيوم أنقذني من استخدام محدد xpath.


نظرًا لعدم ترقيم كائنات الخدمة في الشجرة ، تم تنفيذ البند 2 دون مشاكل في حلقة حيث:


  • أحصل على الحرف الأول من السلسلة
  • أحمل إلى int
  • إذا نجحت كتابة سطر إلى القائمة
  • تجاهل خلاف ذلك
      try (BufferedReader br = new BufferedReader(new FileReader(JMX_FILE))) { String line; while ((line = br.readLine()) != null) { Matcher m1 = p.matcher(line); if (m1.find()) { try { Integer.parseInt(m1.group().substring(0, 1)); matchd.add(m1.group()); } catch (NumberFormatException e) { System.out.println(m1.group().substring(0, 1) + ": excluding non-number string"); } } } } 

وبما أن الملف يتم معالجته بالتتابع من الأعلى إلى الأسفل + يتبع ترقيم الكائنات في الشجرة منطقًا واضحًا ، فلا داعي لاختراع أي شيء رهيب للعنصر 3 أيضًا:


  FileWriter writer = null; try { writer = new FileWriter(RESULT_FILE); for (String str : matchd) { writer.write(str + "\n"); } } finally { if (writer != null) { writer.close(); } } 

تلائم النتيجة النهائية فئة صغيرة (~ 50 سطر):


كود المصدر
 import java.io.*; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; public class App { private static final String SAMPLER_NAME_REGEXP = "(?<=testname=\")(.*)(?=\" )"; private static final File JMX_FILE = new File("C:\\temp\\Test-plan.jmx"); private static final File RESULT_FILE = new File("C:\\temp\\output.txt"); public static void main(String[] args) throws IOException { Pattern p = Pattern.compile(SAMPLER_NAME_REGEXP); List<String> matchd = new ArrayList<>(); try (BufferedReader br = new BufferedReader(new FileReader(JMX_FILE))) { String line; while ((line = br.readLine()) != null) { Matcher m1 = p.matcher(line); if (m1.find()) { try { Integer.parseInt(m1.group().substring(0, 1)); matchd.add(m1.group()); } catch (NumberFormatException e) { System.out.println(m1.group().substring(0, 1) + ": excluding non-number string"); } } } } if (RESULT_FILE.delete()) { System.out.println("Deleting previous result file"); } else { System.out.println("Creating new result file"); } FileWriter writer = null; try { writer = new FileWriter(RESULT_FILE); for (String str : matchd) { writer.write(str + "\n"); } } finally { if (writer != null) { writer.close(); } } } } 

كتجربة ، حاولت دمج هذا الرمز مباشرة في خطة اختبار JMeter ، ولكن واجهت مشاكل في سوء فهم الأدوية العامة والواردات ، وقررت حتى الآن أن أكون راضيًا عن الاتصال بمصدر الشجرة الناتج في IDEA.


اعتني بوقتك. وشكرا على المشاهدة.


الصورة

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


All Articles