Qacover是評估與Java或.NET應用程序執行的SQL查詢有關的測試數據覆蓋範圍的組件。根據SQL全謂詞覆蓋率(SQLFPC)標準測量覆蓋範圍,這是針對SQL查詢量身定制的MCDC的變體。該標準確定了對測試數據庫測試SQL查詢的關注情況(測試覆蓋項)。這些情況表示為一組覆蓋規則。還可以選擇測量SQL查詢突變體的覆蓋率(SQLMANT CRITERION)。
每當應用程序執行查詢時,Qacover都會攔截查詢執行,生成和評估覆蓋範圍規則,並將結果存儲在本地開發環境中。
在測試結束時,您可以獲取測試數據覆蓋率的摘要和詳細報告。這是測試會話的摘要報告的一個示例:

Java的示例:
qacover-core添加到您的pom.xmlqacover.properties和spy.properties從qacover-core文件夾到項目的根源。:p6spy afer jdbc (例如,如果您的連接字符串為jdbc:sqlite:./target/TestDB.db它必須成為jdbc:p6spy:sqlite:./target/TestDB.db )。這創建了包含有關覆蓋範圍評估的內部數據的文件夾target/qacover/rules 。生成HTML報告:
qacover-model-<VERSION>-report.jar (轉到版本,然後瀏覽所選版本以下載)。java -jar qacover-model- < VERSION > -report.jar target/qacover/rules target/qacover/reportstarget/qacover/reports文件夾中找到的index.html 。如果您發現類名稱不是執行查詢的交互點處的名稱,則需要調整配置以包含其包裝的一些排除(請參見稍後),請刪除target/qacover文件夾,然後再次重複。
帶有測試包QAcoverSample的文件夾包含一個示例,說明如何使用覆蓋範圍信息來改進測試數據和測試用例以揭示隱藏的錯誤。它包含三個順序場景:
Java工件的釋放(Java 8或更高)在Maven Central下出版了ID io.github.giis-uniovi 。有兩種不同的人工製品:
qacover-core :應用程序中用作AA依賴性的主要工件(如快速啟動中所示)。qacover-model :它僅包括進行報告和檢查覆蓋規則的模型和類。如果您只需要訪問先前生成的覆蓋規則(例如,從程序生成報告),請使用它。他們每個人都有另一個可下載的罐子,其中包括其他預選賽:
qacover-core Uber Jar。它包括所有必需的依賴項(不包括slf4j ),它們被陰影(即以不同的名稱空間重命名以避免依賴關係衝突):-uber預選程序下載工件。您只需要將JAR放入服務器庫中,並設置配置以使用QACOVER即可。<qualifier>uber</qualifier>在依賴項聲明中。qacover-model獨立記者:使用-report預選程序下載工件,以從命令行生成報告,如快速啟動中所示。.NET平台的發行版在Nuget上發布。與Java相同,有兩個不同的軟件包:
QACover :主包(NetStandAndard2.9)將作為軟件包參考在您的項目配置中包含(例如,如果使用C#,則.csproj文件)。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軟件包等系統軟件包,但根據框架,您必須通過在文件qacover.properties中設置qacover.stack.exclusions屬性來配置其他排除。
示例:文件夾it/spring-petclinic-main包含Spring Boot的典型樣本。排除被宣佈為:
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 。
此存儲庫的qacover-core文件夾中可用的spy.properties包含P6Spy所需的最小配置:
modulelist=giis.qacover.driver.InterceptorFactory必須始終存在,以指示P6Spy將控件傳遞到QACOVE的點有關更多詳細信息,請參見spy.properties文件或P6Spy documentation 。
.NET項目的配置使用與Java相同的qacover.properties ,但不使用spy.properties 。相反,它需要一些編碼:
DbContext繼承的自定義上下文,請參閱EG EF2interceptorcontext.cs 可以從giis.qacover. :
除標準日誌外,在rules文件夾中創建了其他文件log-* ,以顯示有關所評估的查詢,數據庫架構和覆蓋範圍規則的其他調試信息。
報告的一代在指定文件夾中創建了一組靜態HTML文件,以輕鬆檢查摘要和覆蓋範圍數據的詳細信息。
為了生成報告,您有三個選擇:
qacover-model獨立記者,如快速啟動並執行: java -jar qacover-model- < VERSION > -report.jar target/qacover/rules target/qacover/reportsqacover-model程序或測試中: new giis . qacover . report . ReportManager (). run ( "target/qacover/rules" , "target/qacover/rules" );qacover-model聲明為依賴項,請使用exec-maven-plugin執行ReportMain方法: < 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> and <project-folder> 。原因是.NET源文件的位置與名稱空間不完全匹配,因此FPC覆蓋範圍規則存儲了必須解決的類源文件的絕對路徑,這些路徑必須解決到報告生成之前的相對路徑。例如:
.../../../.. (因為測試運行的默認目錄是解決方案文件夾的四個級別)/app文件夾下運行服務器應用程序的容器中生成的報告,請將參數設置為. /app ( /app值允許從項目文件夾中解析每個源文件的相對路徑)。 請參閱Giis-Uniovi的一般貢獻政策和指南。
現在,我們包括一些其他背景技術信息:
Qacover利用P6SPY攔截JDBC調用,TDRULES獲取數據庫架構並調用SQLRULES服務以生成覆蓋範圍規則。所有內容的執行是在本地進行的,針對在連接字符串中配置的數據庫。
主Qacover軟件包的內部結構(前綴giis.qacover. )如下所示(為簡單起見,省略了前綴):
core模塊:包含driver程序, core和core.sevices 。model模塊:包含model , storage , reader和report軟件包。這些是包裝之間的依賴性:
流程圖TD
驅動器 - >核心
核心 - >服務(Core.Services)
服務 - >存儲
存儲 - >模型
核心 - >模型
服務 - >模型
報告 - >讀者
報告 - >模型
讀者 - >模型
讀者 - >存儲