静态测试和动态测试是软件测试中两种不同的方法。
静态测试是一种对软件文档、代码和其他相关材料进行测试的方法,而不是在程序运行时测试。静态测试的目的是发现潜在的问题、错误和缺陷,以便在程序运行之前修复它们。静态测试通常由开发团队的成员完成,例如代码评审、需求审查、设计审查等。
静态测试的优点:
动态测试是在运行程序时对软件进行测试的方法,以确保它符合规格说明书中的要求,并且符合用户需求。动态测试可以进一步分为黑盒测试和白盒测试。
分析对象主要分为两类:
-分析源文件
-分析编译后的文件 java字节码
大致分为以下几个步骤:
SonarQube是一个用于代码质量管理的开源平台。它可以分析代码,检测代码中的技术债务和漏洞,并提供有关代码质量的可视化报告。 SonarQube支持各种编程语言,包括Java,C#,JavaScript,C / C ++等。
SonarQube提供了一系列插件,可以集成到各种构建工具中,如Maven,Gradle,Jenkins等。这使得SonarQube易于集成到现有的开发工作流程中,并且可以在代码提交时自动执行质量检查和代码分析。
除了代码质量管理外,SonarQube还可以帮助团队管理项目的技术债务。它可以通过检测代码中的潜在问题和漏洞来减少技术债务,并提供指导和建议,帮助开发人员编写更高质量的代码。
总之,SonarQube是一个强大的代码质量管理工具,可以帮助开发人员、项目经理和团队领导者在项目开发过程中提高代码质量和可维护性。
整体思路是,sonar scanner分析项目代码,并将结果上传到sonar server
服务启动同SonarQube Server,注意修改配置文件中的密钥和SonarQube Server进行连接
要将SonarScanner与Java项目关联,您需要完成以下步骤:
# 定义唯一的关键字
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文件里
4. 运行SonarScanner命令来分析项目并将分析结果上传到SonarQube服务器上。您可以使用以下命令:
sonar-scanner
在运行该命令之前,请确保已经进入了包含项目代码的目录
5. 在SonarQube服务器上查看项目分析结果。您可以在SonarQube仪表板中查看项目的概览、代码质量、问题列表等信息。
org.sonarsource.scanner.maven
sonar-maven-plugin
3.8.0.2131
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默认的规则库扫描时可能会有一大堆严重缺陷,产出一大堆不适用本项目的bug,产出报告令开发很苦恼,并拒绝修复,可以根据项目调整sonar规则。在为公司项目设置Sonar规则时,应该考虑以下几个因素:
jenkins接入sonar分为三种类型:
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
<plugin>
<groupId>org.sonarsource.scanner.mavengroupId>
<artifactId>sonar-maven-pluginartifactId>
<version>3.8.0.2131version>
plugin>
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
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 "发微信"
}
}
}