Ekspor pohon uji dari JMeter ke teks

Halo, Habr!


Saya bekerja pada proyek integrasi besar (IBM WS, WebSphere MQ, Oracle) dan membungkus perusahaan berdarah kami dengan web tes fungsional di JMeter, yang berjalan di bangku tes dan bangun di panggilan Jenkins setelah penyebaran membangun baru. Ketika jumlah tes meningkat, saya mengalami masalah menjaga agar dokumentasi tes tetap mutakhir.


Pohon tes itu sendiri di JMeter pada dasarnya adalah dokumen - perdagangan memecah fungsionalitas menjadi potongan logis, pengontrol berisi tes di dalam perdagangan, dan setiap sampler di dalam pengontrol adalah langkah terpisah. Hirarki objek diberi nomor jelas, dengan pengecualian potongan layanan seperti menegaskan, timer, dan hal-hal lain yang kurang menarik dari sudut pandang logika bisnis.


Hasilnya adalah gambaran yang cukup akurat:


gambar

Namun, tidak semua manajer siap meluncurkan JMeter di rumah untuk melihat situasi di bidang QA. Secara historis, semua dokumentasi proyek dikelola di Confluence.
Saya tidak siap untuk menyalin deskripsi kasus uji secara manual ke halaman Confluence setelah mengembangkannya di JMeter. Googling putus asa tidak memberikan hasil - Saya tidak menemukan solusi yang siap pakai dan mudah untuk mengekspor pohon objek dari JMeter ke teks ( jika ada, tuliskan di komentar, tolong, dan saya akan menaburkan abu di kepala saya dari widget "Saya bisa google" ).


Setelah melihat ke dalam file JMX (ekstensi standar dari rencana pengujian JMeter), saya menemukan bahwa semua objek yang menarik minat saya ditandai dengan atribut testname :


Contoh irisan file 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> 

Satu-satunya yang tersisa adalah menulis parser, yang:


  1. Teks yang diinginkan dengan deskripsi grup step \ test \ dari file JMX
  2. Melempar garis dengan deskripsi objek yang tidak menarik (dinyatakan, timer, dll.)
  3. Ini akan menulis semuanya untuk sebuah file sehingga pembaruan dokumen termasuk satu copy-paste kesepian

Poin 1 berhasil ditangani oleh ekspresi reguler:


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

Refleks untuk tidak menggunakan xpath yang diperoleh dalam proses penulisan penyeleksi untuk tes Selenium menyelamatkan saya dari menggunakan pemilih xpath.


Karena saya tidak memberi nomor objek layanan di pohon, item 2 diimplementasikan tanpa masalah dalam satu lingkaran di mana:


  • Saya mendapatkan karakter pertama dari string
  • Saya bawa ke int
  • jika berhasil, tulis baris ke daftar
  • jika tidak, abaikan
      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"); } } } } 

Dan karena file diproses secara berurutan dari atas ke bawah + penomoran objek dalam pohon mengikuti logika yang jelas, tidak perlu menemukan sesuatu yang mengerikan untuk item 3 baik:


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

Hasil akhir cocok dalam satu kelas kecil (~ 50 baris):


Kode sumber
 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(); } } } } 

Sebagai percobaan, saya mencoba mengintegrasikan kode ini langsung ke dalam rencana pengujian JMeter, tetapi mengalami masalah dengan kesalahpahaman obat generik dan impor, dan sejauh ini memutuskan untuk puas dengan memanggil eksportir pohon yang dihasilkan di IDEA.


Jaga waktu Anda. Dan terima kasih sudah menonton.


gambar

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


All Articles