Selenium WebDriver - Metrik uji waktu-nyata menggunakan Grafana dan InfluxDB

Halo semuanya! Minggu depan, kelas dalam grup Java QA Engineer akan dimulai. Ini akan diatur waktunya bertepatan dengan publikasi saat ini.



Ulasan:


Eksekusi harian dari tes regresi otomatis sebagai bagian dari majelis harian tidak dapat dihindari saat ini. Sangat menyenangkan untuk menemukan dan melaporkan bug segera setelah menemukannya. Pada saat yang sama, bermasalah untuk menjalankan ratusan tes otomatis dan eksekusi paralel jarak jauh. Segera setelah Anda memiliki satu set uji regresi otomatis, Anda dapat memecahnya menjadi beberapa set modul bisnis dan menjalankannya secara paralel, sebagai bagian dari uji regresi otomatis harian. Sebagian besar suite tes ini dijalankan pada mesin virtual jarak jauh, dan hasil tes hanya tersedia setelah dijalankan. Jika tidak, Anda dapat melihat ke konsol jenkins untuk melihat log dari proses eksekusi tes. Ini terkadang menjengkelkan. Akan sangat bagus memiliki aplikasi yang akan memberikan informasi tentang lulus tes saat mereka berjalan pada mesin virtual jarak jauh.

Mari kita lihat bagaimana Anda dapat membuat halaman sederhana dengan hasil tes dan dasbor menggunakan InfluxDB dan Grafana.

Tujuan:


Kami akan mengumpulkan semua metrik pengujian yang tersedia, seperti:

  • Status Metode Uji
  • Durasi Metode Uji
  • Status kelas dengan metode tes
  • Uji runtime kelas tunggal
  • Status suite tes
  • Durasi Uji Coba


Kami bisa mendapatkan beberapa indikator secara real time, seperti yang ditunjukkan di bawah ini:

  • Jumlah metode pengujian yang dikelompokkan berdasarkan status (misalnya: Lulus: 30, Gagal: 2, Dilewati: 2) pada hari tertentu.
  • Tren dalam durasi satu set tes selama satu minggu, bulan, tahun, dll.


InfluxDB:


InfluxDB adalah database deret waktu yang digunakan untuk mengumpulkan semua metrik pengujian. InfluxDB memiliki API REST untuk menulis data dan mengirim permintaan. Anda dapat mempelajari lebih lanjut di sini . Di bawah ini saya menggunakan perintah buruh pelabuhan untuk memulai turunan dari InfluxDB.

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


Membuat database:


Kami telah meningkatkan dan meluncurkan basis data InfluxDB. Mari kita buat skema database terpisah untuk mengumpulkan hasil tes Selenium. Di bawah ini saya menjalankan perintah di terminal untuk membuat skema yang disebut "selenium" dalam database. (Periksa URL, ganti localhost dengan hostname / ipaddress jika Anda tidak berjalan di komputer saat ini).

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


TestNG:


Mari kita buat tes testNG sederhana:

 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(){ } } 


Tujuan kami adalah mengumpulkan hasil tes di InfluxDB saat runtime. Jadi, kita membutuhkan driver / library di Java untuk InfluxDB.

Ketergantungan Maven:


Tambahkan dependensi Maven yang ditunjukkan di bawah ini:

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


Siswa:


Pendengar TestNG sangat bagus untuk mendengarkan acara, dan dapat merespons tergantung pada apa yang terjadi. Pertama, mari kita buat kelas sederhana yang bertanggung jawab untuk mengirim hasilnya ke 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); } } 


Sekarang buat kelas lain yang mengimplementasikan antarmuka 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); } } 


Catatan: Gunakan tag opsional yang memenuhi tujuan Anda dalam contoh di atas untuk mengklasifikasikan hasil. Misalnya tag ("skenario", "aliran masuk").

Pendengar dari contoh di atas akan memantau pelaksanaan tes dan segera setelah metode / kelas tes tertentu selesai, itu akan mengirim nama, durasi dan beberapa detail tambahan. Tujuan saya di sini hanya untuk memberi Anda ide. Ubah kode sesuai dengan kebutuhan Anda.

Sekarang tambahkan pendengar ke paket XML atau ke kelas dasar 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> 


Atau yang lain:

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


Grafana:


Kami berhasil mengirim hasilnya ke InfluxDB. Tetapi bagaimana cara meminta hasil dan memvisualisasikan data yang diterima? Untuk ini kita akan menggunakan alat gratis lain yang disebut "Grafana".
Grafana adalah alat visualisasi yang sangat baik untuk data deret waktu, berinteraksi sempurna dengan InfluxDB. Berikut ini adalah perintah buruh pelabuhan untuk membuat instance dari Grafana. [plugin piechart adalah opsional di tim, itu dapat dihapus jika tidak diperlukan]

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


Sumber Data untuk Grafana:


Buka Pengaturan -> Sumber data -> Tambahkan sumber data baru , seperti yang ditunjukkan pada tangkapan layar. Klik tombol 'Simpan & Tes' untuk memastikan Grafana dapat berkomunikasi dengan InfluxDB.
Catatan: Jika Anda menggunakan Grafana dengan Docker dan mencoba mengaksesnya sebagai 'Server default', JANGAN gunakan localhost di string koneksi InfluxDB. Itu karena di sini localhost adalah wadah Grafana, bukan mesin fisik. Karenanya, wadah Grafana tidak akan dapat menemukan InfluxDB.




Membuat dasbor:


Saya ingin Anda menonton video ini, karena tidak mudah untuk menjelaskan semua nuansa dalam artikel. Itu sebabnya saya merekam video hotel.



Demo 2:


Untuk meringkas:


Saya harap mendapatkan hasil waktu nyata menggunakan InfluxDB dan Grafana ternyata menarik dan bermanfaat. Diperlukan perubahan minimal dalam struktur yang ada, karena kami menggunakan pendengar TestNG. Menghapus pendengar dari file kelas set / base sudah cukup untuk menonaktifkan fungsi ini jika Anda tidak membutuhkannya. Pendekatan semacam itu akan membantu untuk menghindari frustrasi dalam tim jika anggotanya hanya terlibat dalam memantau hasil pengujian melalui konsol I / O pada mesin jarak jauh. Artikel ini hanya mengemukakan gagasan utama. Anda dapat meningkatkan pendekatan ini dengan menambahkan lebih banyak informasi, misalnya, lingkungan pengujian, menambahkan filter tambahan untuk memperbarui data dalam bagan untuk lingkungan / pengujian tertentu, dll.

Berikut ini adalah bahan yang singkat namun bermanfaat. Secara tradisional, kami menunggu komentar Anda, serta ingat bahwa hari ini akan menjadi hari terbuka pada tingkat yang dapat didaftarkan oleh siapa pun.

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


All Articles