SonarQube质量门禁实践

静态测试和动态测试

静态测试和动态测试是软件测试中两种不同的方法。

1. 静态测试

静态测试是一种对软件文档、代码和其他相关材料进行测试的方法,而不是在程序运行时测试。静态测试的目的是发现潜在的问题、错误和缺陷,以便在程序运行之前修复它们。静态测试通常由开发团队的成员完成,例如代码评审、需求审查、设计审查等。
静态测试的优点:

  • 可以在程序运行之前发现潜在问题,从而减少测试成本。
  • 可以提高团队成员的代码质量和协作效率。
  • 可以避免在生产环境中出现的严重错误和缺陷。

静态测试分类

  • 静态代码扫描
  • 代码评审
  • 单元测试

2. 动态测试

动态测试是在运行程序时对软件进行测试的方法,以确保它符合规格说明书中的要求,并且符合用户需求。动态测试可以进一步分为黑盒测试和白盒测试。

  • 黑盒测试:黑盒测试是基于软件外部行为的测试,它不需要了解软件的内部工作原理。测试人员只需根据软件规格说明书和用户需求来设计测试用例,以检查软件是否符合要求。
  • 白盒测试:白盒测试是基于软件内部结构和实现的测试,它需要了解软件的内部工作原理。测试人员需要查看软件代码和架构,以设计测试用例来检查软件是否正确地执行。
    动态测试的优点:
  • 可以验证软件是否符合规格说明书和用户需求。
  • 可以发现代码错误和缺陷。
  • 可以提高软件的稳定性和可靠性。

动态测试分类

  • 手工执行
  • 自动化
  • 性能
  • 安全

代码扫描工具的原理

分析对象主要分为两类:
-分析源文件
-分析编译后的文件 java字节码
大致分为以下几个步骤:

  1. 代码解析:首先,代码扫描工具需要将源代码转化为抽象语法树(AST)或其他形式的中间表示,以便进行后续的分析。
  2. 漏洞检测:扫描工具会对代码进行各种形式的静态分析,包括缺陷模式匹配、类型推断、数据流分析等,以检测潜在的漏洞和安全问题。
  3. 结果输出:扫描工具将分析结果输出为报告或者直接集成到集成开发环境(IDE)或代码仓库中,以便开发人员查看和修复。

SonarQube

SonarQube是一个用于代码质量管理的开源平台。它可以分析代码,检测代码中的技术债务和漏洞,并提供有关代码质量的可视化报告。 SonarQube支持各种编程语言,包括Java,C#,JavaScript,C / C ++等。
SonarQube提供了一系列插件,可以集成到各种构建工具中,如Maven,Gradle,Jenkins等。这使得SonarQube易于集成到现有的开发工作流程中,并且可以在代码提交时自动执行质量检查和代码分析。
除了代码质量管理外,SonarQube还可以帮助团队管理项目的技术债务。它可以通过检测代码中的潜在问题和漏洞来减少技术债务,并提供指导和建议,帮助开发人员编写更高质量的代码。
总之,SonarQube是一个强大的代码质量管理工具,可以帮助开发人员、项目经理和团队领导者在项目开发过程中提高代码质量和可维护性。

sonarqube框架组成

  • 被分析项目
  • SonarQube Scanner: SonarQube Scanner 是一个命令行工具,用于在项目中执行静态代码分析。它通过读取配置文件来决定要分析哪些文件和使用哪些规则。
  • SonarQube Server: SonarQube 服务器是核心组件,用于处理代码分析和存储分析结果。它提供了一个 Web 界面,让用户可以查看分析报告、设置分析规则、管理项目等。
  • 数据库,结果存储的地方

SonarQube环境搭建

整体思路是,sonar scanner分析项目代码,并将结果上传到sonar server
SonarQube质量门禁实践_第1张图片

启动SonarQube Server

  1. 下载sonarqube https://www.sonarsource.com/products/sonarqube/downloads
  2. 根据自己的需求修改/conf/sonar.properties文件,可以指定连接的数据库、用户名、密码等
  3. 启动sonar服务,去bin目录根据不同的平台,启动服务
    SonarQube质量门禁实践_第2张图片

启动SonarQube Scanner

服务启动同SonarQube Server,注意修改配置文件中的密钥和SonarQube Server进行连接

scanner对java工程进行代码扫描

要将SonarScanner与Java项目关联,您需要完成以下步骤:

  1. 下载并安装SonarScanner。
  2. 将SonarScanner添加到系统路径中。这样,可以在命令行中直接使用SonarScanner命令。
  3. 在的Java项目中添加一个SonarQube配置文件(sonar-project.properties)。该文件应包含项目的相关信息,例如项目名称、版本号、源代码目录、测试代码目录、构建工具等。
# 定义唯一的关键字
sonar.projectKey=devops-hello-service
# 定义项目名称
sonar.projectName=My project
# 定义项目的版本信息
sonar.projectVersion=1.0
# 指定扫描代码的目录位置(多个逗号分隔,java项目源代码一般在src目录下面)
sonar.sources=.
# 执行项目编码
sonar.sourceEncoding=UTF-8
# 指定扫描java语言,如果不指定,则扫描目录下存在的全部
sonar.language=java
# 扫描java项目时,指定编译文件所在目录,不指定该目录会报错
sonarjava.binaries=target/classes

配置文件可以来自于项目的properties文件,也可以是自己重写在analysis properties文件里
SonarQube质量门禁实践_第3张图片
4. 运行SonarScanner命令来分析项目并将分析结果上传到SonarQube服务器上。您可以使用以下命令:

sonar-scanner

在运行该命令之前,请确保已经进入了包含项目代码的目录
5. 在SonarQube服务器上查看项目分析结果。您可以在SonarQube仪表板中查看项目的概览、代码质量、问题列表等信息。

scanner对maven工程进行代码扫描

  1. 安装并启动SonarQube Server
  2. 在Maven项目中添加SonarQube插件。您可以在Maven项目的pom.xml文件中添加以下内容:

  
    
      org.sonarsource.scanner.maven
      sonar-maven-plugin
      3.8.0.2131
    
  

  1. 在Maven项目中运行SonarQube扫描器。在Maven项目的根目录下,运行以下命令:
mvn sonar:sonar \
  -Dsonar.projectKey=<项目唯一标识符> \
  -Dsonar.host.url= \
  -Dsonar.login=

其中,sonar.projectKey是您的项目在SonarQube中的唯一标识符,sonar.host.url是您的SonarQube服务器的URL地址,sonar.login是您的SonarQube用户令牌,用于验证您的身份和访问权限,其中projectKey,host.ur,login也可以配置到maven的setting文件中。
4. 等待扫描完成并查看SonarQube分析报告。扫描完成后,您可以登录到SonarQube服务器,查看分析报告并获取有关代码质量、漏洞和缺陷的详细信息。
需要注意的是,SonarQube支持多种编程语言和技术栈,您需要根据项目类型和语言选择合适的SonarQube插件和配置。此外,为了获取更准确和详细的扫描结果,您可以在Maven项目的pom.xml文件中添加其他配置参数,例如:

- `sonar.projectName`:项目名称
- `sonar.projectVersion`:项目版本号
- `sonar.language`:代码语言
- `sonar.sources`:源代码目录
- `sonar.tests`:测试代码目录
- `sonar.java.binaries`:Java二进制文件目录
- `sonar.java.libraries`:Java依赖库目录
- `sonar.java.source`:Java源代码版本
- `sonar.java.target`:Java目标字节码版本

sonar的规则库设置

使用sonar默认的规则库扫描时可能会有一大堆严重缺陷,产出一大堆不适用本项目的bug,产出报告令开发很苦恼,并拒绝修复,可以根据项目调整sonar规则。在为公司项目设置Sonar规则时,应该考虑以下几个因素:

  1. 项目的技术栈:Sonar规则应该根据项目的技术栈来选择。例如,如果项目使用Java编程语言,则应该选择Java规则集。
  2. 项目的安全性要求:如果项目处理敏感数据或需要满足特定的安全标准,则应该选择与安全相关的规则集。
  3. 项目的复杂性:如果项目非常复杂,则可能需要更严格的规则集,以确保代码的质量和可靠性。
  4. 项目的团队规模:如果项目由大型团队开发,则需要考虑将规则设置为比较宽松,以避免代码审核过程中的冲突和耗时。
    一般来说,应该使用Sonar默认规则集,并根据项目需要进行调整。以下是一些可能有用的Sonar规则:
  5. 代码复杂性规则:这些规则可以帮助您避免过于复杂的代码,使代码更易于阅读和维护。
  6. 安全性规则:这些规则可以帮助您保持代码的安全性,并减少潜在的漏洞和安全风险。
  7. 代码可读性规则:这些规则可以帮助您确保代码易于理解和阅读,从而提高代码的可维护性。
  8. 性能规则:这些规则可以帮助您优化代码的性能,从而提高应用程序的响应速度和可扩展性。

sonar如何接入jenkins项目

jenkins接入sonar分为三种类型:

  • 普通类型(自由风格任务类型)
  • maven(java+maven)
  • pipeline

sonar如何接入jenkins Java项目

  1. 首先,在Jenkins中安装SonarQube插件。在Jenkins的管理面板中,导航到插件管理器,搜索并安装SonarQube插件。
    SonarQube质量门禁实践_第4张图片
  2. 安装完成后,转到系统设置并配置SonarQube服务器。 在Jenkins管理面板中,导航到“系统设置”并找到SonarQube服务器配置部分。在此部分中,您需要提供SonarQube服务器的URL,身份验证令牌以及其他细节。
    SonarQube质量门禁实践_第5张图片
  3. SonarScanner的安装可以在全局工具配置中选择自动安装
    SonarQube质量门禁实践_第6张图片
  4. 然后,在构建过程中添加构建步骤以运行SonarQube分析。 在Jenkins作业配置的“构建”部分中,添加构建步骤以运行SonarQube分析。使用SonarScanner等其他工具来运行SonarQube分析。还需要提供SonarQube项目的唯一标识符。
    SonarQube质量门禁实践_第7张图片
    SonarQube质量门禁实践_第8张图片
    SonarQube analysis properties可以写在jenkins中,如上图。也可以放到项目的sonar-project.properties文件中,需要jenkins中指定配置文件的路径,格式如下:
sonar.projectKey=${JOB_NAME}
sonar.sources=.
sonar.projectName=${JOB_NAME}
sonar.projectVersion=${BUILD_VERSION}
sonar.language=java
sonar.sourceEncoding=UTF-8
sonar.sources=$WORKSPACE
sonar.java.binaries=$WORKSPACE
  1. 最后,可以在Jenkins中查看SonarQube报告。 在Jenkins作业的构建历史记录中,您可以找到SonarQube报告链接。您可以通过单击此链接来查看SonarQube分析的结果和报告。

sonar如何接入jenkins maven项目

  1. 安装和配置Jenkins Maven插件
    确保在Jenkins服务器上安装了Maven插件。在Jenkins中,转到Manage Jenkins > Manage Plugins > Available,搜索Maven Integration Plugin并安装。确保Maven的路径在全局工具配置中配置正确。
  2. 安装和配置SonarQube插件
    确保在Jenkins服务器上安装了SonarQube插件。在Jenkins中,转到Manage Jenkins > Manage Plugins > Available,搜索SonarQube Scanner插件并安装。
    在这里插入图片描述
  3. 配置SonarQube服务器
    在Jenkins中,转到Manage Jenkins > Configure System并找到SonarQube服务器的配置。添加SonarQube服务器,输入服务器URL,以及访问服务器的登录凭证。
  4. 在Maven项目中添加SonarQube插件
    在Maven项目的pom.xml文件中添加SonarQube插件。在标记中添加以下插件代码:
<plugin>
    <groupId>org.sonarsource.scanner.mavengroupId>
    <artifactId>sonar-maven-pluginartifactId>
    <version>3.8.0.2131version>
plugin>
  1. 使用jenkins build项目,并使用sonar扫描
    在build中如下配置
    SonarQube质量门禁实践_第9张图片
    其中maven具体需要使用那些命令根据自己的需求而定。
    然后根据需求设置pre step或者post step扫描
    SonarQube质量门禁实践_第10张图片
    Analysis properties 配置内容如下:
sonar.projectKey=${JOB_NAME}
sonar.sources=.
sonar.projectName=${JOB_NAME}
sonar.projectVersion=${BUILD_VERSION}
sonar.language=java
sonar.sourceEncoding=UTF-8
sonar.sources=$WORKSPACE
sonar.java.binaries=$WORKSPACE
  1. 保存并构建
    保存Jenkins项目的配置并执行构建操作。Jenkins将在构建过程中运行SonarQube扫描,并将结果报告到SonarQube服务器。

sonar如何接入jenkins pipeline项目以及门禁设置

  1. 构建一个流水线job,流水线pipeline script如下编写:
    其中一些具体代码可以通过代码生成器生成
pipeline{
    agent {
        label "api_test"
    }
    options{
        // 保留最大的构建历史
        buildDiscarder(logRotator(numToKeepStr: '2')) 
        // 设置流水线运行时间最长不超过10Min,如果超过,则自动中止
        timeout(time:10,unit:'MINUTES')
        // 打印当前时间戳
        timestamps()
        // 增加重试3次
        retry(3)
    }
    tools{
        maven "maven"
    }
    stages{
        stage("代码获取"){
            steps{
                echo "开始拉取代码..."
                git credentialsId: '80cff850-de44-4be7-a874-d6d59a7712fd', url: 'https://gitee.com/jinjiancode/training_jrequests.git'
            }
        }
        stage("单元测试"){
            steps{
                echo "starting unittest..."
                bat "mvn test"
            }
        }
        stage("静态代码扫描"){
            steps{
                withSonarQubeEnv(credentialsId: 'sonar', installationName: 'sonarqube') {
                    // some block
                    bat "mvn sonar:sonar"
                }
            }
        }
        stage('代码质量门禁'){
            steps{
                script{
                    #等待质量门禁通过
                    def result=waitForQualityGate()
                    echo "结果状态为: ${result.status}"
                    if(result.status!='OK'){
                        echo "质量门禁不通过"
                        error '未达到Sonarqube质量门标要求!'
                    }

                }
            }
        }
        stage("部署到测试环境"){
            steps{
                echo "deploy to test env"
            }
        }
        stage('自动化测试'){
            parallel{
                stage('自动化测试'){
                    steps {
                        echo "执行自动化测试"
                    }
                }
                stage('性能测试'){
                    steps {
                        echo "执行性能测试"
                        build job: 'test_job1', parameters: [string(name: 'env', value: 'dev')]
                    }
                }
                stage('安全测试'){
                    steps {
                        echo "执行安全测试"
                        build job: 'test_job2', parameters: [string(name: 'env', value: 'dev')]
                    }
                }

            }
        }
        stage('生成报告'){
            steps{
                echo "生成报告"
            }
        }
        stage('部署到生产环境'){
            steps{
                input '是否部署到生产环境?'
                echo "执行部署。。。"
            }
        }
    }
    post{
        always{
            echo "发送邮件"
        }
        success {
            echo "发钉钉"
        }
        failure {
            echo "发微信"
        }
    }
}
  1. 接入Sonar质量门禁
    通过上面的job,只是代码扫描可能无法满足日常的情况,当扫描的结构不满足时我可能就不进行后面的步骤了,这样的情况,我们就需要接入质量门禁的方式来实现。
  2. 在sonar服务端的质量阀中设置质量门禁,添加要运用的项目,在质量配置->质量阀添加指标来定义通过扫描的条件。然后将设置的质量阀分配给要扫描的项目。
  3. 在sonar服务端的配置里面添加网络调用hook
    配置->网络调用
    SonarQube质量门禁实践_第11张图片
    SonarQube质量门禁实践_第12张图片
    这里添加Jenkins调用的地址,用来回调扫描的结果。URL配置为:Jenkins地址+/sonarqube-webhook

你可能感兴趣的:(测试工具,单元测试)