SonarQube - Java - Sonar Scanner不分析src / test / java文件夹

时间:2018-03-21 13:28:25

标签: java maven sonarqube sonarqube-scan

我下载了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>

我的项目结构如下所示:

src / main / java - &gt;包含应用代码。

src / test / java - &gt;包含所有测试代码。

我使用命令“mvn clean install sonar:sonar -PsonarLocal”来执行Sonar。

现在我发现Sonar从不分析src / test / java文件夹中的所有.java文件。

为了证明这一点,我在其中一个测试类中添加了一个未使用的变量,Sonar没有抓住它。如果我在src / main / java文件夹中的任何文件中执行相同的操作,Sonar会抓住它。

我有什么遗失的吗?

2 个答案:

答案 0 :(得分:1)

您期望将“正常”规则应用于测试。今天情况并非如此。相反,仅应用测试特定规则的子集。请尝试标记测试@Ignore d。那你应该看到一个问题。

在没有其他分析的情况下仔细检查的方法是查看项目的代码页。你应该看到那里列出的测试文件,如果你钻进一个应该能够从文件查看器右上角的“汉堡菜单”图标访问特定于文件的指标。

目前,要对源文件运行常规规则,您需要进行第二次单独分析(确保使用-Dsonar.projectKey提供不同的项目密钥,或者覆盖正常分析)并指定您的测试目录作为源(sonar.sources=relative/path/to/tests)。

答案 1 :(得分:0)

使用以下命令,您可以在同一个Sonar项目中分析src/main/java src/test/java中的代码:

  1. 首先使用JaCoCo构建应用程序并存储其代码覆盖率:
  2. mvn clean org.jacoco:jacoco-maven-plugin:prepare-agent install -Dmaven.test.failure.ignore=false

    1. 然后将结果上传到Sonar:
    2. mvn sonar:sonar -Dsonar.host.url=http://localhost:9000 -Dsonar.login=<a valid token> -Dsonar.sources=src -Dsonar.test.inclusions=src/test/java/*

      请注意,仅当http://localhost:9000(或任何主机网址)需要身份验证时,才需要-Dsonar.login=<a valid token>属性。替换为有效的令牌。

      但是,我建议您在单独的 Sonar项目中扫描src/test/java代码,因为在扫描测试代码和应用程​​序代码时,代码覆盖率等指标会被抛弃(因为声纳将报告所有测试类本身的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之前执行mvn sonar:sonar...与JaCoCo(上面的步骤1.),以便将这些更新反映在Sonar中。

      我使用SonarQube 6.6和Sonar Scanner 3.0.3.778进行了测试。