Qacover هو مكون لتقييم تغطية بيانات الاختبار فيما يتعلق باستعلامات SQL التي يتم تنفيذها في تطبيق Java أو .NET. يتم قياس التغطية وفقًا لمعيار تغطية SQL الكاملة (SQLFPC) ، وهو متغير من MCDC مصمم خصيصًا لاستعلامات SQL. يحدد المعيار مواقف الاهتمام (عناصر التغطية الاختبار) لاختبار استعلام SQL مقابل قاعدة بيانات الاختبار. يتم تمثيل هذه المواقف كمجموعة من قواعد التغطية . هناك أيضًا خيار لقياس تغطية المسوخ لاستفسارات SQL (معيار SQLMTATTION).
في كل مرة يقوم فيها التطبيق بتنفيذ استعلام ، يعترض Qacover على تنفيذ الاستعلام ، ويقوم بإنشاء وتقييم قواعد التغطية ، ويخزن النتائج في بيئة التنمية المحلية.
في نهاية الاختبارات ، يمكنك الحصول على ملخص وتقارير تفصيلية لتغطية بيانات الاختبار. هذا مثال على التقرير الموجز لجلسة الاختبار:

مثال على جافا:
qacover-core التبعية إلى pom.xml الخاص بكqacover.properties و spy.properties من مجلد qacover-core إلى جذر مشروعك.jdbc:sqlite:./target/TestDB.db سلسلة اتصال التطبيق jdbc:p6spy:sqlite:./target/TestDB.db بك وإدراج :p6spy afer jdbc (على سبيل المثال هذا ينشئ target/qacover/rules التي تحتوي على البيانات الداخلية حول تقييم التغطية. لإنشاء تقرير HTML:
qacover-model-<VERSION>-report.jar من Maven Central (انتقل إلى الإصدارات ثم تصفح الإصدار المحدد للتنزيل).java -jar qacover-model- < VERSION > -report.jar target/qacover/rules target/qacover/reportsindex.html الذي ستجده في مجلد target/qacover/reports . إذا وجدت أن أسماء الفصول ليست هي تلك الموجودة في نقطة التفاعل التي تنفذ الاستعلام ، فستحتاج إلى تعديل التكوين لتضمين بعض الاستثناءات لحزمها (انظر لاحقًا) ، وإزالة المجلد target/qacover وتكرارها مرة أخرى.
يحتوي المجلد مع حزمة الاختبار على QacoverSample على مثال على كيفية استخدام معلومات التغطية لتحسين بيانات الاختبار وحالات الاختبار للكشف عن الأخطاء المخفية. أنه يحتوي على ثلاثة سيناريوهات متسلسلة:
يتم نشر إصدارات القطع الأثرية Java (Java 8 أو أعلى) في Maven Central بموجب المجموعة io.github.giis-uniovi . هناك نوعان من القطع الأثرية:
qacover-core : القطع الأثرية الرئيسية لاستخدامها كاعتماد AA في التطبيق الخاص بك (كما هو موضح في البداية السريعة).qacover-model : لا يشمل إلا النموذج والفصول للقيام بالإبلاغ وفحص قواعد التغطية. استخدمه إذا كنت بحاجة فقط إلى الوصول إلى قواعد التغطية التي تم إنشاؤها مسبقًا (على سبيل المثال لإنشاء تقارير من البرنامج).كل واحد منهم لديه جرة أخرى قابلة للتنزيل تتضمن تصفيات إضافية:
qacover-core UBER JAR. ويشمل جميع التبعيات المطلوبة (باستثناء slf4j ) وهي مظللة (أي إعادة تسميتها في مساحة اسم مختلفة لتجنب تعارضات التبعية):-uber إذا لم تتمكن لأي سبب من الأسباب كاعتماد في التطبيق الخاص بك (على سبيل المثال للنشر في خادم التطبيق). تحتاج ببساطة إلى وضع الجرة في مكتبة الخادم الخاصة بك وتعيين التكوين لاستخدام Qacover.<qualifier>uber</qualifier> إلى إعلان التبعية.qacover-model Standalone Reporter: قم بتنزيل Artifact مع مؤهل -report لإنشاء التقارير من سطر الأوامر كما هو موضح في البداية السريعة.يتم نشر إصدارات .NET Platform في Nuget. كما هو الحال بالنسبة لـ Java ، هناك حزمتان مختلفتان:
QACover : الحزمة الرئيسية (NetStandard2.9) لتضمين كمرجع حزمة في تكوين المشروع الخاص بك (على سبيل المثال ملف .csproj إذا كنت تستخدم C#).QACoverReport : أداة dotnet (netcore2.0) لإنشاء التقارير من سطر الأوامر: قم بتثبيت الأداة باستخدام dotnet tool install QACoverReport وتنفيذها كأمر QACoverReport <rules folder> <reports folder> . على Java ، تحتاج إلى وجود ملفين تكوين لتقييم التغطية: qacover.properties و spy.properties وتخصيص برنامج تشغيل JDBC. على .NET ، تحتاج فقط إلى الأول مع بعض التعليمات البرمجية الإضافية لاعتراض الاستعلامات.
Qacover يبحث عن qacover.properties بهذا الترتيب:
تحتوي qacover.properties المتوفرة في وحدة qacover-core لهذا الريبو على تكوين عام مناسب للسيناريوهات المشتركة ، ولكن في بعض الأحيان يجب تخصيصه. راجع الملف للحصول على تفاصيل حول كل معلمة تكوين. بعد ذلك ، نسلط الضوء على أهم المعايير التي تعتبر معايير التضمين والاستبعاد.
عندما ينفذ سطر طريقة في التطبيق الخاص بك استعلام SQL ( نقطة التفاعل ) ، يتم تنفيذ سلسلة من المكالمات لطرق إطارك حتى الوصول إلى طريقة السائق التي تنفذ بالفعل الاستعلام. فيما يلي النقطة التي يتم فيها اكتشاف التنفيذ الفعلي للاستعلام ، ولكن ما نريده هو تحديد نقطة التفاعل في التطبيق. لتحقيق ذلك ، يتحقق Qacover من مكدس المكالمات عند نقطة التنفيذ الفعلي ويستبعد على التوالي كل مكالمة تم إجراؤها في أي حزمة إطارية حتى تحدد نقطة تفاعل قاعدة البيانات في طريقتك.
يستبعد Qacover حزم النظام مثل Java أو System أو P6spy أو Qacover Packages ، ولكن بناءً على الإطار ، يجب عليك تكوين استثناءات إضافية عن طريق تعيين خاصية qacover.stack.exclusions في ملف qacover.properties .
مثال : يحتوي المجلد على it/spring-petclinic-main على عينة نموذجية من Boot Spring. تم الإعلان عن الاستبعاد على النحو التالي:
qacover.stack.exclusions=org.springframework.,org.hibernate.,com.zaxxer.hikari.,com.sun.,sun.reflect.
هذا يزيل فئات الإطار التي نريد تخطيها لتحديد موقع نقطة التفاعل الموجودة في فئة org.springframework.samples.petclinic.PetclinicIntegrationTests .
ومع ذلك ، في هذه الحالة بالذات ، تكون نقطة التفاعل تحت org.springframework . يجب أن نضيف معلمة الإدراج لضمان أن org.springframework.samples. لم يتم استبعاده:
qacover.stack.inclusions=org.springframework.samples.
هناك معلمات أخرى لتكوين معايير التضمين للحزم ، ومعايير الاستبعاد لأسماء الفصول أو أسماء الجدول. انظر qacover.properties لمزيد من التفاصيل.
يحتوي spy.properties المتوفرة في المجلد qacover-core لهذا الريبو على الحد الأدنى من التكوين المطلوب بواسطة P6Spy:
modulelist=giis.qacover.driver.InterceptorFactory يجب أن يكون موجودًا دائمًا للإشارة إلى النقطة التي يمرر بها p6spy عنصر التحكم إلى Qacover راجع ملف spy.properties أو P6Spy documentation لمزيد من التفاصيل.
التكوين لمشروع .NET استخدم نفس qacover.properties من Java ، ولكنه لا يستخدم spy.properties . بدلاً من ذلك ، يتطلب بعض الترميز:
DbContext ، انظر على سبيل المثال ef2InterceptorContext.cs يمكن تكوين التسجيل للحزم التي تبدأ بـ giis.qacover. :
بالإضافة إلى السجلات القياسية ، يتم إنشاء log-* أخرى في مجلد rules لعرض معلومات تصحيح إضافية حول الاستعلامات التي يتم تقييمها ، ومخطط قاعدة البيانات ، وقواعد التغطية.
يقوم جيل التقرير بإنشاء مجموعة من ملفات HTML الثابتة في المجلد المحدد ، لتفقد الملخص بسهولة وتفاصيل بيانات التغطية.
لإنشاء تقارير لديك ثلاثة خيارات:
qacover-model المستقل كما هو موضح في البداية السريعة والتنفيذ: java -jar qacover-model- < VERSION > -report.jar target/qacover/rules target/qacover/reportsqacover-model في classpath: new giis . qacover . report . ReportManager (). run ( "target/qacover/rules" , "target/qacover/rules" );qacover-model على أنها تبعية ، فانتقل طريقة ReportMain باستخدام 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 > يحتوي ملف index.html على ملخص تغطية بيانات الاختبار لكل فئة:
أين:
يمكن للنقر على كل اسم فئة لعرض تقرير يحتوي على تفاصيل الاستعلامات التي تم تقييمها. يشبه التقرير عن الفصل:
... 
يوسع النقر فوق السهم لأسفل بالقرب من تغطية النسبة المئوية عند الاستعلام الذي تم تقييمه تفاصيل كل قاعدة تغطية (مغطاة باللون الأخضر ، المكشوف باللون الأصفر):
يحتوي بناء الجملة العام لمولد التقرير على أربعة معلمات (لا يلزم سوى المعلمات الأولى إذا لم تقم بتضمين الكود المصدري للفئات قيد الاختبار):
<rules-folder> <reports-folder> [<source-folders> [<project-folder>]]
على Java ، إذا كنت ترغب في تضمين الكود المصدري في التقارير ، فيجب عليك تعيين قيمة للمعلمة الثالثة <source-folders> لتضمين قائمة مفصولة بالفاصلة للمسار (المسارات) لتحديد موقع المصادر. على سبيل المثال:
src/main/java .module1/src/main/java,module2/src/main/java . على .NET ، يجب عليك تعيين قيمة لكل من المعلمات الثالثة والرابعة: <source-folders> و <project-folder> . والسبب هو أن موقع ملفات مصدر .NET لا يتطابق تمامًا مع مساحات الأسماء ، بحيث تخزن قواعد تغطية FPC المسار المطلق لملفات مصدر الفئة التي يجب حلها إلى مسار نسبي قبل توليد الإبلاغ. على سبيل المثال:
.../../../.. (لأن الدليل الافتراضي الذي يتم تشغيل الاختبارات هو أربعة مستويات في مجلد الحل)/app ، قم بتعيين المعلمات AS . /app (تسمح قيمة /app بحل المسار النسبي لكل ملف مصدر من مجلد المشروع). انظر سياسات وإرشادات المساهمة العامة لـ GIIS-uniovi في المساهمة.
الآن نقوم بتضمين بعض المعلومات الفنية الخلفية الإضافية:
يستفيد Qacover من P6Spy لاعتراض مكالمات JDBC ، Tdrules للحصول على مخطط قاعدة البيانات واستدعاء خدمة SQLRules لإنشاء قواعد التغطية. يتم تنفيذ كل شيء في محلي مقابل قاعدة البيانات التي تم تكوينها في سلسلة الاتصال.
يظهر أدناه الهيكل الداخلي لحزم Qacover الرئيسية (البادئة giis.qacover. ) أدناه (يتم حذف البادئات من أجل البساطة):
core : يحتوي على حزم driver core core.sevices .model : تحتوي على حزم model storage reader report .هذه هي التبعيات بين الحزم:
مخطط انسيابي TD
سائق -> جوهر
Core -> الخدمات (Core.services)
الخدمات -> التخزين
التخزين -> الطراز
Core -> نموذج
الخدمات -> النموذج
تقرير -> القارئ
تقرير -> النموذج
القارئ -> النموذج
القارئ -> التخزين