3.25代码审计实战-答疑帖

大家将sonar课程中的问题回复进来,课上老师会给大家一一解答

按照 sonar 官方文档,修改了 maven 的 setting.xml 文件,增加了 settings 的配置;修改了 pom.xml 文件,增加了 build 的 sonar- maven 插件。

分别使用自己写的工程,和 sonar 提供的 maven-basic 工程(basic 工程未做任何修改),运行之后 sonar 平台只显示单元测试数量,但没有代码覆盖率。命令:mvn clean install sonar:sonar

截图如下:

PS:
复习了一遍老师上课时的视频,这部分没有什么特别的操作。区别只是我这个完全使用了 maven 实现。视频中使用的命令:
mvn clean install sonar:sonar -Dsonar.host.url=http://ip:prot -Dsonar.login=$SONAR_TOKEN
(视频从 1:49:00 - 1:51:10 结束,运行结束后 sonar 平台会统计出代码覆盖率。)
老师确实是没有其他操作,直接用 sonar-maven 的方式,在运行了 sonar 提供的 demo 之后就可以统计出代码覆盖率。区别只是老师用的 -D 参数指定了 host 和 login,而我写到了 maven 的settings.xml 文件中,所以 mvn 命令会少了这两个 -D 参数,其它没发现哪里不一样。

不知道这部分内容和 sonar-scanner 有没有关系。按我的理解,这部分是直接使用的 sonar-maven,而 scanner 是独立的工具,所以没有关系。

疑问:开发写的单元测试有时候跑不通,sonar 统计不出来覆盖率。是需要指定部分单元测试的执行吗?还是怎么搞?

例如下图,执行mvn test时 spring boot 起不来 单元测试是否需要开发重写,规范是什么?

2、运行单元测试时 如何指定测试环境的配置文件。

这个问题已经解决。通过新增 coverage.xml 文件,指定需要覆盖的代码,就可以显示代码覆盖率的数据了。

但是,一个项目或新版本的修改会涉及到几十或上百个类文件,代码修改量最少也要以几千行计算。这种指定代码行的方式肯定是不现实的。

然后就又回到之前的问题上了,那么想统计 case 对当前这个项目所有代码的覆盖率,而不使用指定代码行的方式,这种情况要如何做呢?
(PS:实际操作,使用 mvn clean verify sonar:sonar 运行结果不会统计代码覆盖率。)

你的项目可能缺少了jacoco的插件

        <plugin>
          <groupId>org.jacoco</groupId>
          <artifactId>jacoco-maven-plugin</artifactId>
          <version>0.8.4</version>
        </plugin>

有了这个插件后,mvn test或者verify之后会自动生成一个target/jacoco.exec文件。这个里面保存了所有的覆盖率数据。

统计不到覆盖率的原因是进程crash导致了jacoco没有来得及处理覆盖率数据。

  • 让研发修复单元测试,这是首选
  • 分套件运行也可以,需要合并多次的覆盖率数据

测试执行的时候,单元测试通常是不需要测试环境的。
如果是集成测试,需要一个配置文件指明你的环境信息。

你这种做法是不对的。coverage.xml是为了处理通用的覆盖率数据,并不代表你的实际运行的覆盖率。所以还是需要解决上面的问题,也就是jacoco的问题。

老师,我的sonar加了gitlab auth插件,可以gitlab直接单点登录sonar,但是扫描一个gutlab项目后,总得在sonarqube里手动把gitlab单点登录的用户加进这个项目,管理很麻烦。有没有办法可以将gitlab里的用户和项目的关系同步到sonar呢?

可以试试这几个

加入插件不好用,自己DIY即可。通过编写自动化脚本,自动你把github的用户同步到sonar的用户里。

关闭