Qacover - это компонент для оценки охвата тестовых данных в отношении запросов SQL, которые выполняются в приложении Java или .net. Покрытие измеряется в соответствии с критерием полного предиката SQL (SQLFPC), вариантом MCDC, адаптированного к запросам SQL. Критерий определяет интересующие ситуации (элементы охвата тестирования), чтобы проверить запрос SQL на тестовую базу данных. Эти ситуации представлены как набор правил охвата . Существует также возможность измерить охват мутантов для запросов SQL (критерий SQLMution).
Каждый раз, когда приложение выполняет запрос, 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 из 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 под группой ID io.github.giis-uniovi . Есть два разных артефакта:
qacover-core : основной артефакт для использования в качестве зависимости AA в вашем приложении (как показано в быстром старте).qacover-model : она включает только модель и классы для отчетности и осмотра правил охвата. Используйте его, если вам нужен доступ только к ранее сгенерированным правилам покрытия (например, для генерации отчетов из программы).У каждого из них есть еще одна загружаемая банка, которая включает в себя дополнительный квалификатор:
qacover-core Uber Jar. Он включает в себя все необходимые зависимости (за исключением slf4j ), и они затенены (т.е. переименовано в другое пространство имен, чтобы избежать конфликтов зависимости):-uber , если по какой -либо причине вы не можете использовать его в качестве зависимости в вашем приложении (например, для развертывания на сервере приложений). Вам просто нужно поместить JAR в библиотеку вашей сервера и установить конфигурацию для использования Qacover.<qualifier>uber</qualifier> в объявление зависимости.qacover-model Standalone Reporter: Загрузите артефакт с отборочным квалификатором -report для создания отчетов из командной строки, как показано в быстром старте.Выпуски для платформы .NET публикуются в 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 проверяет стек вызовов в точке фактического выполнения и последовательно исключает каждый вызов, сделанный в любом пакете Framework, пока он не найдет точку взаимодействия базы данных в вашем методе.
Qacover исключает пакеты систем, такие как Java, System, P6spy или пакеты Qacover, но в зависимости от структуры, вы должны настроить дополнительные исключения, установив свойство qacover.stack.exclusions в файле qacover.properties .
Пример : папка 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 для получения более подробной информации.
spy.properties доступные в папке qacover-core в этом репо содержит минимальную конфигурацию, требуемую P6spy:
modulelist=giis.qacover.driver.InterceptorFactory всегда должен присутствовать, чтобы указать точку, в которой P6spy передает контроль в Qacover См. Файл spy.properties или P6Spy documentation для получения более подробной информации.
Конфигурация для проекта .NET Используйте те же qacover.properties , что и Java, но не использует spy.properties . Вместо этого это требует некоторого кодирования:
DbContext , см. EG EF2InterceptorContext.cs Регистрация может быть настроена для пакетов, начиная с giis.qacover. :
В дополнение к стандартным журналам, другие папки log-* создаются в папке rules для отображения дополнительной информации отладки о оцененных запросах, схеме базы данных и правилах покрытия.
Генерация отчетов создает набор статических 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 объявлена как зависимость, выполните метод 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 , установите параметры как . /app (значение /app позволяет разрешить относительный путь каждого исходного файла из папки проекта). См. Общие политики и руководящие принципы для GIIS-Uniovi в Anplying.md.
Теперь мы включаем некоторую дополнительную фоновую техническую информацию:
Qacover использует P6spy для перехвата вызовов JDBC, TDRULE, чтобы получить схему базы данных и вывести службу SQLRULES для генерации правил покрытия. Выполнение всего производится в локальном уровне против базы данных, настроенной в строке подключения.
Внутренняя структура основных пакетов Qacover (префикс giis.qacover. ) Показана ниже (префиксы пропущены для простоты):
core Module : содержит пакеты driver , core и core.sevices .model : содержит пакеты model , storage , reader и report .Это зависимости между пакетами:
Блок -схема TD
драйвер -> ядро
Core -> Services (core.services)
Услуги -> хранение
Хранение -> модель
ядро -> модель
Услуги -> Модель
Отчет -> Читатель
Отчет -> модель
Читатель -> модель
Читатель -> хранение