Qacover adalah komponen untuk mengevaluasi cakupan data uji sehubungan dengan kueri SQL yang dieksekusi dalam aplikasi Java atau .net. Cakupan diukur sesuai dengan kriteria SQL Full Predicate Coverage (SQLFPC), varian MCDC yang disesuaikan dengan kueri SQL. Kriteria menentukan situasi yang menarik (item cakupan uji) untuk menguji kueri SQL terhadap database uji. Situasi ini direpresentasikan sebagai seperangkat aturan cakupan . Ada juga opsi untuk mengukur cakupan mutan untuk kueri SQL (kriteria SQLMutation).
Setiap kali aplikasi menjalankan kueri, Qacover mencegat eksekusi kueri, menghasilkan dan mengevaluasi aturan cakupan, dan menyimpan hasilnya di lingkungan pengembangan lokal.
Di akhir tes Anda bisa mendapatkan ringkasan dan detail laporan cakupan data uji. Ini adalah contoh dari laporan ringkasan sesi tes:

Contoh untuk Java:
qacover-core ketergantungan ke pom.xml Andaqacover.properties and spy.properties dari folder qacover-core ke akar proyek Anda.:p6spy afer jdbc (mis. Jika string koneksi Anda adalah jdbc:sqlite:./target/TestDB.db itu harus menjadi jdbc:p6spy:sqlite:./target/TestDB.db ). Ini menciptakan target/qacover/rules yang berisi data internal tentang evaluasi cakupan. Untuk menghasilkan laporan HTML:
qacover-model-<VERSION>-report.jar dari Maven Central (buka versi dan kemudian telusuri versi yang dipilih untuk diunduh).java -jar qacover-model- < VERSION > -report.jar target/qacover/rules target/qacover/reportsindex.html yang akan Anda temukan di folder target/qacover/reports . Jika Anda menemukan bahwa nama kelas bukan yang ada di titik interaksi yang mengeksekusi kueri, Anda perlu mengubah konfigurasi untuk memasukkan beberapa pengecualian untuk paket mereka (lihat nanti), hapus folder target/qacover dan ulangi lagi.
Folder dengan Paket Tes Contoh QACOVERSOVER berisi contoh cara menggunakan informasi cakupan untuk meningkatkan data uji dan kasus uji untuk mengungkapkan bug tersembunyi. Ini berisi tiga skenario berurutan:
Rilis artefak Java (Java 8 atau lebih tinggi) diterbitkan di Maven Central di bawah ID grup io.github.giis-uniovi . Ada dua artefak yang berbeda:
qacover-core : Artefak utama untuk digunakan sebagai ketergantungan AA dalam aplikasi Anda (seperti yang ditunjukkan pada awal yang cepat).qacover-model : Ini hanya mencakup model dan kelas untuk melakukan pelaporan dan untuk memeriksa aturan cakupan. Gunakan jika Anda hanya perlu akses ke aturan cakupan yang dihasilkan sebelumnya (misalnya untuk menghasilkan laporan dari suatu program).Masing -masing memiliki toples lain yang dapat diunduh yang mencakup kualifikasi tambahan:
qacover-core Uber Jar. Ini termasuk semua dependensi yang dibutuhkan (tidak termasuk slf4j ) dan mereka teduh (yaitu dinamai namespace yang berbeda untuk menghindari konflik ketergantungan):-uber jika karena alasan apa pun Anda tidak dapat menggunakannya sebagai ketergantungan dalam aplikasi Anda (misalnya untuk digunakan di server aplikasi). Anda hanya perlu meletakkan toples di perpustakaan server Anda dan mengatur konfigurasi untuk menggunakan QACOVER.<qualifier>uber</qualifier> ke Deklarasi Ketergantungan.qacover-model Standalone Reporter: Unduh artefak dengan kualifikasi -report untuk menghasilkan laporan dari baris perintah seperti yang ditunjukkan pada awal yang cepat.Rilis untuk platform .NET diterbitkan di Nuget. Sama seperti untuk Java, ada dua paket yang berbeda:
QACover : Paket utama (netstandard2.9) untuk disertakan sebagai referensi paket dalam konfigurasi proyek Anda (misalnya file .csproj jika Anda menggunakan C#).QACoverReport : Alat dotnet (netcore2.0) untuk menghasilkan laporan dari baris perintah: Instal alat dengan dotnet tool install QACoverReport dan jalankan sebagai perintah QACoverReport <rules folder> <reports folder> . Di Java, Anda harus memiliki dua file konfigurasi untuk mengevaluasi cakupan: qacover.properties dan spy.properties dan untuk menyesuaikan driver JDBC. Pada .net Anda hanya perlu yang pertama bersama dengan beberapa kode tambahan untuk mencegat kueri.
QACOVER Mencari qacover.properties Dalam urutan ini:
qacover.properties yang tersedia dalam modul qacover-core dari repo ini berisi konfigurasi umum yang cocok untuk skenario umum, tetapi kadang-kadang harus disesuaikan. Lihat file untuk detail pada setiap parameter konfigurasi. Selanjutnya, kami menyoroti yang paling penting yang merupakan kriteria inklusi dan eksklusi.
Ketika baris metode dalam aplikasi Anda mengeksekusi kueri SQL ( titik interaksi ), rantai panggilan ke metode kerangka kerja Anda dieksekusi hingga mencapai metode driver yang benar -benar menjalankan kueri. Berikut adalah titik di mana eksekusi kueri yang sebenarnya terdeteksi, tetapi yang kita inginkan adalah menentukan titik interaksi dalam aplikasi. Untuk mencapai hal ini, Qacover memeriksa tumpukan panggilan pada titik eksekusi yang sebenarnya dan secara berturut -turut mengecualikan setiap panggilan yang dilakukan dalam paket kerangka apa pun hingga menempatkan titik interaksi basis data dalam metode Anda.
QACOVER mengecualikan paket sistem seperti Java, System, P6Spy atau paket QACOVER, tetapi tergantung pada kerangka kerja Anda harus mengkonfigurasi pengecualian tambahan dengan mengatur properti qacover.stack.exclusions di file qacover.properties .
Contoh : Folder it/spring-petclinic-main berisi sampel khas dari Spring Boot. Pengecualian dinyatakan sebagai:
qacover.stack.exclusions=org.springframework.,org.hibernate.,com.zaxxer.hikari.,com.sun.,sun.reflect.
Itu menghilangkan kelas kerangka yang ingin kami lewati untuk menemukan titik interaksi yang ada di org.springframework.samples.petclinic.PetclinicIntegrationTests kelas.
Namun, dalam kasus khusus ini, titik interaksi berada di bawah org.springframework . Kita harus menambahkan parameter inklusi untuk memastikan org.springframework.samples. tidak dikecualikan:
qacover.stack.inclusions=org.springframework.samples.
Ada parameter lain untuk mengonfigurasi kriteria inklusi untuk paket, dan kriteria pengecualian untuk nama kelas atau nama tabel. Lihat qacover.properties untuk lebih jelasnya.
spy.properties yang tersedia di folder qacover-core dari repo ini berisi konfigurasi minimal yang diperlukan oleh P6Spy:
modulelist=giis.qacover.driver.InterceptorFactory harus selalu hadir untuk menunjukkan titik di mana p6spy meneruskan kontrol ke qacover Lihat file spy.properties atau P6Spy documentation untuk lebih jelasnya.
Konfigurasi untuk proyek .NET Gunakan qacover.properties yang sama dari java, tetapi tidak menggunakan spy.properties . Sebaliknya, itu membutuhkan beberapa pengkodean:
DbContext , lihat misalnya EF2InterCeptorContext.cs Pencatatan dapat dikonfigurasi untuk paket yang dimulai dengan giis.qacover. :
Selain log standar, log-* dibuat di folder rules untuk menampilkan informasi debug tambahan tentang kueri yang dievaluasi, skema basis data, dan aturan cakupan.
Pembuatan laporan membuat satu set file HTML statis di folder yang ditunjuk, untuk dengan mudah memeriksa ringkasan dan detail data cakupan.
Untuk menghasilkan laporan, Anda memiliki tiga opsi:
qacover-model seperti yang ditunjukkan pada start cepat dan jalankan: java -jar qacover-model- < VERSION > -report.jar target/qacover/rules target/qacover/reportsqacover-model di classpath: new giis . qacover . report . ReportManager (). run ( "target/qacover/rules" , "target/qacover/rules" );qacover-model dinyatakan sebagai ketergantungan, jalankan metode ReportMain menggunakan exec-maven-plugin : < plugin >
< groupId >org.codehaus.mojo</ groupId >
< artifactId >exec-maven-plugin</ artifactId >
< version >1.6.0</ version >
< executions >
< execution >
< id >qacover-report</ id >
< phase >post-integration-test</ phase >
< goals >
< goal >java</ goal >
</ goals >
< configuration >
< classpathScope >test</ classpathScope >
< classpath />
< mainClass >giis.qacover.report.ReportMain</ mainClass >
< arguments >
< argument >target/qacover/rules</ argument >
< argument >target/qacover/reports</ argument >
</ arguments >
</ configuration >
</ execution >
</ executions >
</ plugin > File index.html berisi ringkasan cakupan data uji untuk setiap kelas:
Di mana:
Setiap nama kelas dapat diklik untuk menampilkan laporan yang berisi detail untuk kueri yang telah dievaluasi. Laporan untuk kelas terlihat seperti:
... 
Mengklik panah bawah di dekat persentase cakupan pada kueri yang dievaluasi memperluas rincian setiap aturan cakupan (ditutupi hijau, terbuka dengan warna kuning):
Sintaks umum dari generator laporan memiliki empat parameter (hanya dua yang pertama diperlukan jika Anda tidak memasukkan kode sumber kelas yang sedang diuji):
<rules-folder> <reports-folder> [<source-folders> [<project-folder>]]
Di Java, jika Anda ingin memasukkan kode sumber dalam laporan, Anda harus menetapkan nilai untuk parameter ketiga <source-folders> untuk memasukkan daftar jalur yang dipisahkan koma untuk menemukan sumber. Misalnya:
src/main/java .module1/src/main/java,module2/src/main/java . Pada .NET, Anda harus menetapkan nilai untuk parameter ketiga dan keempat: <source-folders> dan <project-folder> . Alasannya adalah bahwa lokasi file sumber .NET tidak persis cocok dengan ruang nama, sehingga, aturan cakupan FPC menyimpan jalur absolut dari file sumber kelas yang harus diselesaikan ke jalur relatif sebelum pembuatan laporan. Misalnya:
.../../../.. (karena direktori default di mana tes berjalan adalah empat level di folder solusi)/app , atur parameter sebagai . /app (nilai /app memungkinkan untuk menyelesaikan jalur relatif dari setiap file sumber dari folder proyek). Lihat kebijakan dan pedoman kontribusi umum untuk GIIS-UNIOVI di Contributing.md.
Sekarang kami menyertakan beberapa informasi teknis latar belakang tambahan:
Qacover memanfaatkan p6spy untuk mencegat panggilan JDBC, tdrules untuk mendapatkan skema basis data dan memohon layanan SQLRULES untuk menghasilkan aturan cakupan. Eksekusi semuanya dibuat di lokal terhadap database yang dikonfigurasi dalam string koneksi.
Struktur internal paket Qacover utama (awalan giis.qacover. ) Ditunjukkan di bawah ini (awalan dihilangkan untuk kesederhanaan):
core : Berisi paket driver , core dan core.sevices .model : Berisi paket model , storage , reader , dan report .Ini adalah ketergantungan antar paket:
Flowchart TD
Driver -> Core
Core -> Services (Core.Services)
Layanan -> Penyimpanan
Penyimpanan -> Model
Core -> Model
Layanan -> Model
Laporan -> Pembaca
Laporan -> Model
Pembaca -> Model
Pembaca -> Penyimpanan