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)
服务 - >存储
存储 - >模型
核心 - >模型
服务 - >模型
报告 - >读者
报告 - >模型
读者 - >模型
读者 - >存储