Nano Hash - криптовалюты, майнинг, программирование

SonarQube - Java - Сканер сонара не анализирует папки src / test / java

Я загрузил SonarQube 7.0 и настроил проект Maven для использования сканера Sonar. Файл pom.xml выглядит следующим образом:

<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.github.jitpack</groupId>
<artifactId>maven-simple</artifactId>
<version>0.2-SNAPSHOT</version>
<packaging>jar</packaging>

<name>Simple Maven example</name>
<url>https://jitpack.io/#jitpack/maven-simple/0.1</url>

<properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <mavenSurefireVersion>2.20</mavenSurefireVersion>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <src.dir>src/main/java</src.dir>
    <sonar.sources>pom.xml,src/main/java</sonar.sources>
    <mavenSurefireVersion>2.20</mavenSurefireVersion>
</properties>

<dependencies>
    <dependency>
        <groupId>org.testng</groupId>
        <artifactId>testng</artifactId>
        <version>6.8</version>
        <scope>test</scope>
    </dependency>
</dependencies>

<profiles>
    <profile>
        <id>sonarLocal</id>
        <activation>
            <activeByDefault>false</activeByDefault>
        </activation>
        <properties>
            <sonar.host.url>http://localhost:9000</sonar.host.url>
        </properties>
    </profile>
</profiles>

<build>
    <sourceDirectory>${src.dir}</sourceDirectory>
    <testResources>
        <testResource>
            <directory>${project.basedir}</directory>
            <filtering>true</filtering>
        </testResource>
    </testResources>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.3</version>
            <configuration>
                <source>${maven.compiler.source}</source>
                <target>${maven.compiler.source}</target>
                <encoding>${project.build.sourceEncoding}</encoding>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <version>3.0.2</version>
            <configuration>
                <encoding>${project.build.sourceEncoding}</encoding>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-checkstyle-plugin</artifactId>
            <version>3.0.0</version>
            <executions>
                <execution>
                    <id>validate</id>
                    <phase>validate</phase>
                    <configuration>
                        <includeTestSourceDirectory>true</includeTestSourceDirectory>
                        <configLocation>google_checks.xml</configLocation>
                        <encoding>${project.build.sourceEncoding}</encoding>
                        <consoleOutput>true</consoleOutput>
                        <failsOnError>true</failsOnError>
                        <failOnViolation>true</failOnViolation>
                        <violationSeverity>warning</violationSeverity>
                    </configuration>
                    <goals>
                        <goal>check</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>${mavenSurefireVersion}</version>
        </plugin>
        <plugin>
            <groupId>org.sonarsource.scanner.maven</groupId>
            <artifactId>sonar-maven-plugin</artifactId>
            <version>3.4.0.905</version>
        </plugin>
    </plugins>
</build>

My structure of the project looks like below:

src / main / java -> Содержит код приложения.

src / test / java -> Содержит весь тестовый код.

Я использую команду "mvn clean install sonar: sonar -PsonarLocal" для запуска Sonar.

Теперь я заметил, что Sonar никогда не анализирует все файлы .java в папке src / test / java.

Чтобы доказать это, я добавил неиспользуемую переменную в один из тестовых классов, и Sonar ее не уловил. Если я сделаю то же самое в любом файле в папке src / main / java, Sonar поймает это.

Что-то мне не хватает?


Ответы:


1

Используя следующие команды, вы можете анализировать код как в src/main/java , так и src/test/java в одном проекте Sonar:

  1. Сначала создайте свое приложение и сохраните его покрытие кода с помощью JaCoCo:

mvn clean org.jacoco:jacoco-maven-plugin:prepare-agent install -Dmaven.test.failure.ignore=false

  1. Затем загрузите результаты в Sonar:

mvn sonar:sonar -Dsonar.host.url=http://localhost:9000 -Dsonar.login=<a valid token> -Dsonar.sources=src -Dsonar.test.inclusions=src/test/java/*

Обратите внимание, что свойство -Dsonar.login=<a valid token> необходимо только в том случае, если http://localhost:9000 (или любой другой URL-адрес хоста) требует аутентификации. Замените действующим токеном.

Однако я рекомендую сканировать ваш src/test/java код в отдельном проекте Sonar, потому что такие показатели, как покрытие кода, теряются при сканировании тестового кода вместе с кодом приложения (поскольку Sonar сообщит 0% покрытие на всех самих тестовых классах). Чтобы сканировать отдельно:

Для кода приложения (src/main/java) запустите:

mvn sonar:sonar -Dsonar.host.url=http://localhost:9000 -Dsonar.login=<a valid token>

Для тестового кода (src/test/java) запустите:

mvn sonar:sonar -Dsonar.projectKey=<my project>-tests -Dsonar.host.url=http://localhost:9000 -Dsonar.login=<a valid token> -Dsonar.sources=src/test -Dsonar.test.inclusions=src/test/java/*

Обновите -Dsonar.projectKey=<my project>-tests именем вашего проекта, чтобы у вас был уникальный ключ проекта для тестового сканирования.

Для этого подхода в pom.xml не нужно вносить никаких специфических для Sonar / JaCoCo дополнений.

Обратите внимание, что mvn clean с JaCoCo (шаг 1. выше) должен выполняться до mvn sonar:sonar... всякий раз, когда вы вносите обновления в свой код, чтобы эти обновления отражались в Sonar.

Я тестировал это с помощью SonarQube 6.6 и Sonar Scanner 3.0.3.778.

10.04.2018
  • metrics like code coverage get thrown off when scanning test code alongside application code Спасибо за этот совет! 11.06.2019

  • 2

    Вы ожидаете, что к тестам будут применяться «обычные» правила. Сегодня это не так. Вместо этого применяется только подмножество правил для конкретных тестов. Вместо этого попробуйте пометить тест @Ignored. Тогда вы должны увидеть проблему.

    Чтобы перепроверить без дополнительного анализа, взгляните на кодовую страницу проекта. Вы должны увидеть перечисленные там тестовые файлы, и если вы перейдете к одному из них, вы сможете получить доступ к показателям, специфичным для файла, с помощью значка «гамбургер-меню» в правом верхнем углу средства просмотра файлов.

    В настоящее время, чтобы запустить обычные правила для исходных файлов, вам нужно будет провести второй, отдельный анализ (обязательно укажите другой ключ проекта с помощью -Dsonar.projectKey, иначе вы наложите свой обычный анализ) и укажите свой каталог тестов в качестве источников ( sonar.sources=relative/path/to/tests).

    21.03.2018
  • Здравствуйте, Г. Энн, я использую TestNG в своем проекте Maven. Когда я пытаюсь добавить аннотацию @Ignore, она показывает, что import org.junit.Ignore; нужно импортировать. Это правильный способ сделать это? Если нет, как мне добавить игнорирование для тестов TestNG? 21.03.2018
  • Пожалуйста, не обращайте внимания на мой вышеупомянутый комментарий. Когда я добавляю @Ignore, я вижу, что в Sonar появляется неправильная ошибка. Я получаю сообщение об ошибке. Исправьте или удалите этот пропущенный модульный тест вместо отображения неиспользуемой переменной. Есть ли способ запустить анализ сонара на тестах? 21.03.2018
  • Смотрите мое расширение @JohnSmith. 21.03.2018
  • Хорошо, я тоже попытался реализовать это. Я ввел команду mvn clean install sonar:sonar -PsonarLocal -Dsonar.projectKey=com.github.jitpack:maven-simple -Dsonar,sources=src/test/java/com/github/jitpack, но она по-прежнему не сканировала папку с тестами. Я здесь что-то не так сделал? 21.03.2018
  • -Dsonar,sources или -Dsonar.sources? В последнем случае, вероятно, пора начать обсуждение в группе Google < / а> @JohnSmith. 21.03.2018
  • Я использовал -Dsonar.sources. Я получаю сообщение об ошибке File src/test/java/com/github/jitpack/AppTest.java can't be indexed twice. Please check that inclusion/exclusion patterns produce disjoint sets for main and test files. Если хотите, я могу начать обсуждение в группе Google. 21.03.2018
  • @ g-ann-sonarsource-team, я создал тему в группах Google. Может быть расположен по адресу groups.google.com/forum/?pli = 1 #! Topic / sonarqube / Y6PLXmnE9tQ 21.03.2018
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..