مرحبا يا هبر!
أنا أعمل على مشروع تكامل كبير (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>
الشيء الوحيد المتبقي هو كتابة محلل ، والذي:
- النص المطلوب مع وصف الخطوة \ اختبار \ مجموعة من ملف JMX
- يرمي الأسطر مع وصف الكائنات غير المثيرة للاهتمام (المؤكد ، المؤقتات ، إلخ.)
- سيكتب كل شيء من أجل ملف بحيث يتضمن تحديث المستند لصق ونسخ واحد وحيد
تم التعامل مع الفقرة 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.
اعتني بوقتك. وشكرا على المشاهدة.