靜態(tài)測(cè)試和動(dòng)態(tài)測(cè)試
靜態(tài)測(cè)試和動(dòng)態(tài)測(cè)試是軟件測(cè)試中兩種不同的方法。
1. 靜態(tài)測(cè)試
靜態(tài)測(cè)試是一種對(duì)軟件文檔、代碼和其他相關(guān)材料進(jìn)行測(cè)試的方法,而不是在程序運(yùn)行時(shí)測(cè)試。靜態(tài)測(cè)試的目的是發(fā)現(xiàn)潛在的問題、錯(cuò)誤和缺陷,以便在程序運(yùn)行之前修復(fù)它們。靜態(tài)測(cè)試通常由開發(fā)團(tuán)隊(duì)的成員完成,例如代碼評(píng)審、需求審查、設(shè)計(jì)審查等。
靜態(tài)測(cè)試的優(yōu)點(diǎn):
- 可以在程序運(yùn)行之前發(fā)現(xiàn)潛在問題,從而減少測(cè)試成本。
- 可以提高團(tuán)隊(duì)成員的代碼質(zhì)量和協(xié)作效率。
- 可以避免在生產(chǎn)環(huán)境中出現(xiàn)的嚴(yán)重錯(cuò)誤和缺陷。
靜態(tài)測(cè)試分類
- 靜態(tài)代碼掃描
- 代碼評(píng)審
- 單元測(cè)試
2. 動(dòng)態(tài)測(cè)試
動(dòng)態(tài)測(cè)試是在運(yùn)行程序時(shí)對(duì)軟件進(jìn)行測(cè)試的方法,以確保它符合規(guī)格說明書中的要求,并且符合用戶需求。動(dòng)態(tài)測(cè)試可以進(jìn)一步分為黑盒測(cè)試和白盒測(cè)試。
- 黑盒測(cè)試:黑盒測(cè)試是基于軟件外部行為的測(cè)試,它不需要了解軟件的內(nèi)部工作原理。測(cè)試人員只需根據(jù)軟件規(guī)格說明書和用戶需求來設(shè)計(jì)測(cè)試用例,以檢查軟件是否符合要求。
- 白盒測(cè)試:白盒測(cè)試是基于軟件內(nèi)部結(jié)構(gòu)和實(shí)現(xiàn)的測(cè)試,它需要了解軟件的內(nèi)部工作原理。測(cè)試人員需要查看軟件代碼和架構(gòu),以設(shè)計(jì)測(cè)試用例來檢查軟件是否正確地執(zhí)行。
動(dòng)態(tài)測(cè)試的優(yōu)點(diǎn): - 可以驗(yàn)證軟件是否符合規(guī)格說明書和用戶需求。
- 可以發(fā)現(xiàn)代碼錯(cuò)誤和缺陷。
- 可以提高軟件的穩(wěn)定性和可靠性。
動(dòng)態(tài)測(cè)試分類
- 手工執(zhí)行
- 自動(dòng)化
- 性能
- 安全
代碼掃描工具的原理
分析對(duì)象主要分為兩類:
-分析源文件
-分析編譯后的文件 java字節(jié)碼
大致分為以下幾個(gè)步驟:
- 代碼解析:首先,代碼掃描工具需要將源代碼轉(zhuǎn)化為抽象語法樹(AST)或其他形式的中間表示,以便進(jìn)行后續(xù)的分析。
- 漏洞檢測(cè):掃描工具會(huì)對(duì)代碼進(jìn)行各種形式的靜態(tài)分析,包括缺陷模式匹配、類型推斷、數(shù)據(jù)流分析等,以檢測(cè)潛在的漏洞和安全問題。
- 結(jié)果輸出:掃描工具將分析結(jié)果輸出為報(bào)告或者直接集成到集成開發(fā)環(huán)境(IDE)或代碼倉庫中,以便開發(fā)人員查看和修復(fù)。
SonarQube
SonarQube是一個(gè)用于代碼質(zhì)量管理的開源平臺(tái)。它可以分析代碼,檢測(cè)代碼中的技術(shù)債務(wù)和漏洞,并提供有關(guān)代碼質(zhì)量的可視化報(bào)告。 SonarQube支持各種編程語言,包括Java,C#,JavaScript,C / C ++等。
SonarQube提供了一系列插件,可以集成到各種構(gòu)建工具中,如Maven,Gradle,Jenkins等。這使得SonarQube易于集成到現(xiàn)有的開發(fā)工作流程中,并且可以在代碼提交時(shí)自動(dòng)執(zhí)行質(zhì)量檢查和代碼分析。
除了代碼質(zhì)量管理外,SonarQube還可以幫助團(tuán)隊(duì)管理項(xiàng)目的技術(shù)債務(wù)。它可以通過檢測(cè)代碼中的潛在問題和漏洞來減少技術(shù)債務(wù),并提供指導(dǎo)和建議,幫助開發(fā)人員編寫更高質(zhì)量的代碼。
總之,SonarQube是一個(gè)強(qiáng)大的代碼質(zhì)量管理工具,可以幫助開發(fā)人員、項(xiàng)目經(jīng)理和團(tuán)隊(duì)領(lǐng)導(dǎo)者在項(xiàng)目開發(fā)過程中提高代碼質(zhì)量和可維護(hù)性。
sonarqube框架組成
- 被分析項(xiàng)目
- SonarQube Scanner: SonarQube Scanner 是一個(gè)命令行工具,用于在項(xiàng)目中執(zhí)行靜態(tài)代碼分析。它通過讀取配置文件來決定要分析哪些文件和使用哪些規(guī)則。
- SonarQube Server: SonarQube 服務(wù)器是核心組件,用于處理代碼分析和存儲(chǔ)分析結(jié)果。它提供了一個(gè) Web 界面,讓用戶可以查看分析報(bào)告、設(shè)置分析規(guī)則、管理項(xiàng)目等。
- 數(shù)據(jù)庫,結(jié)果存儲(chǔ)的地方
SonarQube環(huán)境搭建
整體思路是,sonar scanner分析項(xiàng)目代碼,并將結(jié)果上傳到sonar server
啟動(dòng)SonarQube Server
- 下載sonarqube https://www.sonarsource.com/products/sonarqube/downloads
- 根據(jù)自己的需求修改/conf/sonar.properties文件,可以指定連接的數(shù)據(jù)庫、用戶名、密碼等
- 啟動(dòng)sonar服務(wù),去bin目錄根據(jù)不同的平臺(tái),啟動(dòng)服務(wù)
啟動(dòng)SonarQube Scanner
服務(wù)啟動(dòng)同SonarQube Server,注意修改配置文件中的密鑰和SonarQube Server進(jìn)行連接
scanner對(duì)java工程進(jìn)行代碼掃描
要將SonarScanner與Java項(xiàng)目關(guān)聯(lián),您需要完成以下步驟:
- 下載并安裝SonarScanner。
- 將SonarScanner添加到系統(tǒng)路徑中。這樣,可以在命令行中直接使用SonarScanner命令。
- 在的Java項(xiàng)目中添加一個(gè)SonarQube配置文件(sonar-project.properties)。該文件應(yīng)包含項(xiàng)目的相關(guān)信息,例如項(xiàng)目名稱、版本號(hào)、源代碼目錄、測(cè)試代碼目錄、構(gòu)建工具等。
# 定義唯一的關(guān)鍵字
sonar.projectKey=devops-hello-service
# 定義項(xiàng)目名稱
sonar.projectName=My project
# 定義項(xiàng)目的版本信息
sonar.projectVersion=1.0
# 指定掃描代碼的目錄位置(多個(gè)逗號(hào)分隔,java項(xiàng)目源代碼一般在src目錄下面)
sonar.sources=.
# 執(zhí)行項(xiàng)目編碼
sonar.sourceEncoding=UTF-8
# 指定掃描java語言,如果不指定,則掃描目錄下存在的全部
sonar.language=java
# 掃描java項(xiàng)目時(shí),指定編譯文件所在目錄,不指定該目錄會(huì)報(bào)錯(cuò)
sonarjava.binaries=target/classes
配置文件可以來自于項(xiàng)目的properties文件,也可以是自己重寫在analysis properties文件里
4. 運(yùn)行SonarScanner命令來分析項(xiàng)目并將分析結(jié)果上傳到SonarQube服務(wù)器上。您可以使用以下命令:
sonar-scanner
在運(yùn)行該命令之前,請(qǐng)確保已經(jīng)進(jìn)入了包含項(xiàng)目代碼的目錄
5. 在SonarQube服務(wù)器上查看項(xiàng)目分析結(jié)果。您可以在SonarQube儀表板中查看項(xiàng)目的概覽、代碼質(zhì)量、問題列表等信息。
scanner對(duì)maven工程進(jìn)行代碼掃描
- 安裝并啟動(dòng)SonarQube Server
- 在Maven項(xiàng)目中添加SonarQube插件。您可以在Maven項(xiàng)目的pom.xml文件中添加以下內(nèi)容:
<build>
<plugins>
<plugin>
<groupId>org.sonarsource.scanner.maven</groupId>
<artifactId>sonar-maven-plugin</artifactId>
<version>3.8.0.2131</version>
</plugin>
</plugins>
</build>
- 在Maven項(xiàng)目中運(yùn)行SonarQube掃描器。在Maven項(xiàng)目的根目錄下,運(yùn)行以下命令:
mvn sonar:sonar \
-Dsonar.projectKey=<項(xiàng)目唯一標(biāo)識(shí)符> \
-Dsonar.host.url=<SonarQube服務(wù)器URL> \
-Dsonar.login=<SonarQube用戶令牌>
其中,sonar.projectKey
是您的項(xiàng)目在SonarQube中的唯一標(biāo)識(shí)符,sonar.host.url
是您的SonarQube服務(wù)器的URL地址,sonar.login
是您的SonarQube用戶令牌,用于驗(yàn)證您的身份和訪問權(quán)限,其中projectKey,host.ur,login也可以配置到maven的setting文件中。
4. 等待掃描完成并查看SonarQube分析報(bào)告。掃描完成后,您可以登錄到SonarQube服務(wù)器,查看分析報(bào)告并獲取有關(guān)代碼質(zhì)量、漏洞和缺陷的詳細(xì)信息。
需要注意的是,SonarQube支持多種編程語言和技術(shù)棧,您需要根據(jù)項(xiàng)目類型和語言選擇合適的SonarQube插件和配置。此外,為了獲取更準(zhǔn)確和詳細(xì)的掃描結(jié)果,您可以在Maven項(xiàng)目的pom.xml文件中添加其他配置參數(shù),例如:
- `sonar.projectName`:項(xiàng)目名稱
- `sonar.projectVersion`:項(xiàng)目版本號(hào)
- `sonar.language`:代碼語言
- `sonar.sources`:源代碼目錄
- `sonar.tests`:測(cè)試代碼目錄
- `sonar.java.binaries`:Java二進(jìn)制文件目錄
- `sonar.java.libraries`:Java依賴庫目錄
- `sonar.java.source`:Java源代碼版本
- `sonar.java.target`:Java目標(biāo)字節(jié)碼版本
sonar的規(guī)則庫設(shè)置
使用sonar默認(rèn)的規(guī)則庫掃描時(shí)可能會(huì)有一大堆嚴(yán)重缺陷,產(chǎn)出一大堆不適用本項(xiàng)目的bug,產(chǎn)出報(bào)告令開發(fā)很苦惱,并拒絕修復(fù),可以根據(jù)項(xiàng)目調(diào)整sonar規(guī)則。在為公司項(xiàng)目設(shè)置Sonar規(guī)則時(shí),應(yīng)該考慮以下幾個(gè)因素:文章來源:http://www.zghlxwxcb.cn/news/detail-727928.html
- 項(xiàng)目的技術(shù)棧:Sonar規(guī)則應(yīng)該根據(jù)項(xiàng)目的技術(shù)棧來選擇。例如,如果項(xiàng)目使用Java編程語言,則應(yīng)該選擇Java規(guī)則集。
- 項(xiàng)目的安全性要求:如果項(xiàng)目處理敏感數(shù)據(jù)或需要滿足特定的安全標(biāo)準(zhǔn),則應(yīng)該選擇與安全相關(guān)的規(guī)則集。
- 項(xiàng)目的復(fù)雜性:如果項(xiàng)目非常復(fù)雜,則可能需要更嚴(yán)格的規(guī)則集,以確保代碼的質(zhì)量和可靠性。
- 項(xiàng)目的團(tuán)隊(duì)規(guī)模:如果項(xiàng)目由大型團(tuán)隊(duì)開發(fā),則需要考慮將規(guī)則設(shè)置為比較寬松,以避免代碼審核過程中的沖突和耗時(shí)。
一般來說,應(yīng)該使用Sonar默認(rèn)規(guī)則集,并根據(jù)項(xiàng)目需要進(jìn)行調(diào)整。以下是一些可能有用的Sonar規(guī)則: - 代碼復(fù)雜性規(guī)則:這些規(guī)則可以幫助您避免過于復(fù)雜的代碼,使代碼更易于閱讀和維護(hù)。
- 安全性規(guī)則:這些規(guī)則可以幫助您保持代碼的安全性,并減少潛在的漏洞和安全風(fēng)險(xiǎn)。
- 代碼可讀性規(guī)則:這些規(guī)則可以幫助您確保代碼易于理解和閱讀,從而提高代碼的可維護(hù)性。
- 性能規(guī)則:這些規(guī)則可以幫助您優(yōu)化代碼的性能,從而提高應(yīng)用程序的響應(yīng)速度和可擴(kuò)展性。
sonar如何接入jenkins項(xiàng)目
jenkins接入sonar分為三種類型:文章來源地址http://www.zghlxwxcb.cn/news/detail-727928.html
- 普通類型(自由風(fēng)格任務(wù)類型)
- maven(java+maven)
- pipeline
sonar如何接入jenkins Java項(xiàng)目
- 首先,在Jenkins中安裝SonarQube插件。在Jenkins的管理面板中,導(dǎo)航到插件管理器,搜索并安裝SonarQube插件。
- 安裝完成后,轉(zhuǎn)到系統(tǒng)設(shè)置并配置SonarQube服務(wù)器。 在Jenkins管理面板中,導(dǎo)航到“系統(tǒng)設(shè)置”并找到SonarQube服務(wù)器配置部分。在此部分中,您需要提供SonarQube服務(wù)器的URL,身份驗(yàn)證令牌以及其他細(xì)節(jié)。
- SonarScanner的安裝可以在全局工具配置中選擇自動(dòng)安裝
- 然后,在構(gòu)建過程中添加構(gòu)建步驟以運(yùn)行SonarQube分析。 在Jenkins作業(yè)配置的“構(gòu)建”部分中,添加構(gòu)建步驟以運(yùn)行SonarQube分析。使用SonarScanner等其他工具來運(yùn)行SonarQube分析。還需要提供SonarQube項(xiàng)目的唯一標(biāo)識(shí)符。
SonarQube analysis properties可以寫在jenkins中,如上圖。也可以放到項(xiàng)目的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
- 最后,可以在Jenkins中查看SonarQube報(bào)告。 在Jenkins作業(yè)的構(gòu)建歷史記錄中,您可以找到SonarQube報(bào)告鏈接。您可以通過單擊此鏈接來查看SonarQube分析的結(jié)果和報(bào)告。
sonar如何接入jenkins maven項(xiàng)目
- 安裝和配置Jenkins Maven插件
確保在Jenkins服務(wù)器上安裝了Maven插件。在Jenkins中,轉(zhuǎn)到Manage Jenkins > Manage Plugins > Available,搜索Maven Integration Plugin并安裝。確保Maven的路徑在全局工具配置中配置正確。 - 安裝和配置SonarQube插件
確保在Jenkins服務(wù)器上安裝了SonarQube插件。在Jenkins中,轉(zhuǎn)到Manage Jenkins > Manage Plugins > Available,搜索SonarQube Scanner插件并安裝。 - 配置SonarQube服務(wù)器
在Jenkins中,轉(zhuǎn)到Manage Jenkins > Configure System并找到SonarQube服務(wù)器的配置。添加SonarQube服務(wù)器,輸入服務(wù)器URL,以及訪問服務(wù)器的登錄憑證。 - 在Maven項(xiàng)目中添加SonarQube插件
在Maven項(xiàng)目的pom.xml文件中添加SonarQube插件。在標(biāo)記中添加以下插件代碼:
<plugin>
<groupId>org.sonarsource.scanner.maven</groupId>
<artifactId>sonar-maven-plugin</artifactId>
<version>3.8.0.2131</version>
</plugin>
- 使用jenkins build項(xiàng)目,并使用sonar掃描
在build中如下配置
其中maven具體需要使用那些命令根據(jù)自己的需求而定。
然后根據(jù)需求設(shè)置pre step或者post step掃描
Analysis properties 配置內(nèi)容如下:
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
- 保存并構(gòu)建
保存Jenkins項(xiàng)目的配置并執(zhí)行構(gòu)建操作。Jenkins將在構(gòu)建過程中運(yùn)行SonarQube掃描,并將結(jié)果報(bào)告到SonarQube服務(wù)器。
sonar如何接入jenkins pipeline項(xiàng)目以及門禁設(shè)置
- 構(gòu)建一個(gè)流水線job,流水線pipeline script如下編寫:
其中一些具體代碼可以通過代碼生成器生成
pipeline{
agent {
label "api_test"
}
options{
// 保留最大的構(gòu)建歷史
buildDiscarder(logRotator(numToKeepStr: '2'))
// 設(shè)置流水線運(yùn)行時(shí)間最長(zhǎng)不超過10Min,如果超過,則自動(dòng)中止
timeout(time:10,unit:'MINUTES')
// 打印當(dāng)前時(shí)間戳
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("單元測(cè)試"){
steps{
echo "starting unittest..."
bat "mvn test"
}
}
stage("靜態(tài)代碼掃描"){
steps{
withSonarQubeEnv(credentialsId: 'sonar', installationName: 'sonarqube') {
// some block
bat "mvn sonar:sonar"
}
}
}
stage('代碼質(zhì)量門禁'){
steps{
script{
#等待質(zhì)量門禁通過
def result=waitForQualityGate()
echo "結(jié)果狀態(tài)為: ${result.status}"
if(result.status!='OK'){
echo "質(zhì)量門禁不通過"
error '未達(dá)到Sonarqube質(zhì)量門標(biāo)要求!'
}
}
}
}
stage("部署到測(cè)試環(huán)境"){
steps{
echo "deploy to test env"
}
}
stage('自動(dòng)化測(cè)試'){
parallel{
stage('自動(dòng)化測(cè)試'){
steps {
echo "執(zhí)行自動(dòng)化測(cè)試"
}
}
stage('性能測(cè)試'){
steps {
echo "執(zhí)行性能測(cè)試"
build job: 'test_job1', parameters: [string(name: 'env', value: 'dev')]
}
}
stage('安全測(cè)試'){
steps {
echo "執(zhí)行安全測(cè)試"
build job: 'test_job2', parameters: [string(name: 'env', value: 'dev')]
}
}
}
}
stage('生成報(bào)告'){
steps{
echo "生成報(bào)告"
}
}
stage('部署到生產(chǎn)環(huán)境'){
steps{
input '是否部署到生產(chǎn)環(huán)境?'
echo "執(zhí)行部署。。。"
}
}
}
post{
always{
echo "發(fā)送郵件"
}
success {
echo "發(fā)釘釘"
}
failure {
echo "發(fā)微信"
}
}
}
- 接入Sonar質(zhì)量門禁
通過上面的job,只是代碼掃描可能無法滿足日常的情況,當(dāng)掃描的結(jié)構(gòu)不滿足時(shí)我可能就不進(jìn)行后面的步驟了,這樣的情況,我們就需要接入質(zhì)量門禁的方式來實(shí)現(xiàn)。 - 在sonar服務(wù)端的質(zhì)量閥中設(shè)置質(zhì)量門禁,添加要運(yùn)用的項(xiàng)目,在質(zhì)量配置->質(zhì)量閥添加指標(biāo)來定義通過掃描的條件。然后將設(shè)置的質(zhì)量閥分配給要掃描的項(xiàng)目。
- 在sonar服務(wù)端的配置里面添加網(wǎng)絡(luò)調(diào)用hook
配置->網(wǎng)絡(luò)調(diào)用
這里添加Jenkins調(diào)用的地址,用來回調(diào)掃描的結(jié)果。URL配置為:Jenkins地址+/sonarqube-webhook
到了這里,關(guān)于SonarQube質(zhì)量門禁實(shí)踐的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!