coverity代碼檢測工具介紹_微服務測試之靜態代碼掃描

靜態代碼掃描為整個發展組織增加價值。無論您在開發組織中發揮的作用如何,靜態代碼掃描解決方案都具有附加價值,擁有軟件開發中所需要的尖端功能,最大限度地提高質量并管理軟件產品中的風險。

背景

微服務架構模式具有服務間獨立,可獨立開發部署等特點,獨立開發誘發了技術上的分離,HTTP通信增加了問題診斷的復雜度,對系統的功能、性能和安全方面的質量保障帶來了很大的挑戰。

“微服務架構對測試的挑戰

微服務架構模式下多個獨立業務服務同時開展開發工作,每個系統都有各自的業務范圍和開發周期要求,這樣一來,下圖所示的傳統流程中產品經理提供需求,需求人員進行需求分析、開發人員進行開發,最后交給測試人員進行測試的方法,就無法滿足測試覆蓋和測試效率的要求。

480a04a2ebb36b72378a949a29475889.png

相對于傳統的單體模式而言,微服務模式下對測試帶來的挑戰總結起來包括以下內容:

  • 1. 微服務系統模塊層次化,需要保證模塊內部代碼的質量。這種場景下傳統的端到端的測試無法滿足測試要求;
  • 2. 需要保證各個微服務系統內部模塊間的正確性。系統模塊間以及前端和后端通常會同時開展開發工作,模塊間或者前后端通過接口(通常是Restful http接口)進行連接,而模塊和后端往往沒有界面,為了保證各個系統單個依賴系統的正確性,因此需要借助Mock技術隔離依賴的前提下進行接口級的測試;
  • 3. 需要保證微服務系統中的接口一致性,即契約的一致性。需要通過契約測試手段保證契約的正確性,進而保證同步開發過程中的前后開發的正確性和一致性;
  • 4. 需要保障單個微服務系統的正確性。需要進行組件級的測試進行微服務系統的正確性;
  • 5. 需要保障整個系統的正確性。各個微服務系統串接之后通過端到端的測試保證整體系統的正確性;

8385e4e8b1d1b38ffdf020c114ab1c09.png

“微服務架構下如何開展測試

針對上面提到的微服務對測試的挑戰,一方面為了保證在服務各個層級上對微服務進行全面的測試,特別是對于分布式系統;另一方面又要確保測試執行的效率,這樣才能保證持續集成/持續交付(CI/CD)。因此,總體的測試策略采用如下解決方法:

  • 1. 開展「質量」文化。讓開發人員建立起代碼「質量」意識,用于保障模塊內部的質量;
  • 2. 采用自動化測試手段。在微服務架構中,開發分解為負責不同服務的多個小組,測試人員往往每天要花費大量的時間,了解不同團隊的開發進度。如果還需要手動進行回歸測試(Regression Test),最終將會不堪重負。所以自動化測試在微服務模式下是必須采取的手段。
  • 3. 分層的自動化測試策略。自動化測試分層在Mike Cohn 提出的測試金字塔(Test Pyramid)原理中進行了詳細的闡述。它提倡在代碼級、接口級、應用級進行不同粒度的測試來保證系統的質量。從自動化測試投入比例來看,單元測試和靜態代碼掃描的投入比例最大,其次是接口自動化測試,最后是UI自動化測試。同時為了提高測試效率和測試覆蓋率,功能測試需要借助探索式測試手段開展測試。

f971934167aa86fb4e7c365ff9e3a901.png
  • 4. 采用流水線技術進行可視化快速反饋。由于微服務系統非常多,這樣往往會增加了運維和溝通成本,為了提高溝通效率,需要借助流水線的技術,可視化查看每一個構建(Build)、測試(Test)、部署(Deploy)過程,快速做出質量反饋和處理決策。通過可視化流水線最終可以實現各個環節的監控,采用DevOps手段打通業務、開發、測試和運維的部門墻。

43963beca61dbeb4a7bba98dc33075c0.png

下面結合分層自動化測試的思想,首先對靜態代碼掃描進行介紹。

靜態代碼掃描

“靜態代碼掃描背景

靜態代碼分析是指在不運行代碼的方式下,通過詞法分析、語法分析、控制流、數據流分析等技術對程序代碼進行掃描的技術。它的目的是驗證代碼是否滿足規范性、安全性、可靠性、可維護性的要求。靜態代碼掃描處于分層自動化測試的最底層,它和單元測試同級別。為了保證公司代碼的規范性、安全性、可靠性的要求,通過定制公司級的靜態代碼掃描規范、掃描規則和掃描實施流程保證實施高效落地。

“靜態代碼掃描意義

為開發者

軟件開發人員最終負責代碼質量。代碼質量是非功能性需求的一部分,因此是開發人員的直接責任。代碼質量不應該存在技術債務,在開發的過程中每一步都提供反饋,從IDE到發布。這使得開發人員能夠盡早做出有關代碼質量的決策,使他們能夠做得更好,并提供質量更好的軟件產品。

為DevOps

DevOps需要確保軟件的構建方式正確。DevOps中涉及的責任很多,其中包括支持開發流程,自動化測試,確保質量,提高生產力.....并最終實現持續部署。良好的代碼質量是實現所有這些目標的必要條件,盡管不是充分條件。靜態代碼掃描可在任何構建/測試/部署步驟中添加的代碼質量檢驗門檻,能夠自動執行一組統一的質量標準,從而確保組織交付更好的軟件。

為管理者

代碼靜態掃描可降低風險并提高團隊生產力。管理人員需要能夠安全地運行軟件,并且需要花費合理的投資回報。我們的解決方案一目了然地顯示了他們面臨的技術債務以及他們緩解的成本。它還具有開箱即用的功能,可以系統地提高開發團隊的可維護性和長期生產力。這使管理人員能夠以最佳成本使用風險控制方法確保其組織能夠交付更好的軟件。

“靜態代碼掃描介紹

靜態代碼掃描處在特性分支開發完成之后,具體的描述如下:

  • 1. 開發人員從Master分支拉取特性分支作為開發分支;
  • 2. 開發完特性分支后、代碼構建、單元測試、靜態代碼掃描;
  • 3. 通過后合并到Master分支,用于投產;

62e27d0de5089ffc6b42ea64c221fb41.png

“靜態代碼掃描流程

隨行付靜態代碼掃描平臺的具體實現是通過集成SonarQube平臺工具、Jenkins集成工具、IDE SonarLint插件和CheckStyle本地化規則模板等開源工具、插件集而成。實現本地化代碼的實施檢測,版本構建后的二次檢測,以及郵件反饋等功能的流程閉環,保證投產前代碼符合隨行付代碼規范的要求。具體的流程如下圖所示:

85fb295e746bda91bd2488996995402b.png
  • 1.本地化IDE中通過SonarLint插件實現和SonarQube平臺規則、規范的同步、實現本地代碼檢查;隨行付定制化了java規則、XML規則257條,javascript規則86條,用于檢測代碼的規范性、代碼缺陷、漏洞、壞味道、重復率等信息。并將定制化的規則放到了SonarQube平臺上,SonrLint插件的規則比較全面,包括所有的sonajava規則和javascript規則,為了保證本地使用定制的規則,且同sonarqube中的規則一致,需要遠程連接SonarQube服務器,并綁定項目。以Eclipse為例,展示SonarQube連接和項目綁定過程:

15ff8dff7a8d33125267844cc5af3ab5.png

37a586e37f824a21a605325b6028a85e.png
  • 2.代碼提交到代碼庫GitLab中后,在Jenkins中測試環境構建時,自動觸發Sonar掃描,并將掃描結果發布到SonarQube平臺。下圖為SonarQube展示的一個項目的結果:

6f7f7cd08187e0978a09c17e3c3448db.png
  • 3.SonarQube平臺根據質量閥的要求,不滿足質量閥要求則郵件通知開發人員。
質量閥要求:1.新覆蓋率大于等于80%;2.新增Bugs為0;3.新增漏洞為0;4.新增壞味道為0;

e4cda50b1023c3df55a8715b0609db89.png
  • 4.開發人員收到郵件后,進行代碼處理,直到滿足規范要求為止。
  • 5.以周為單位統計SonarQube平臺中靜態代碼掃描出來的Bugs漏洞壞味道的數量,定時自動發送周報給相關干系人,報告中會包含問題處理情況的趨勢圖。

5b1aecbc9e3e6f0d7d86699bde49dfab.png

SonarQube與規則

SonarQube是一個用于代碼質量管理的開源平臺,支持25+種編程語言的質量掃描。SonqrQube由遠程機、Server端和數據庫構成。遠程客戶機可以通過各種不同的分析機制,從而將被分析的項目代碼上傳到SonarQube server 并進行代碼質量的管理和分析,SonarQube 還會通過Web API將分析的結果以可視化、可度量的方式展示給出來。邏輯結構如下圖所示:

2bcb65a883bc404747e1fc18992ca22a.png

“SonarQube的整合能力

SonarQube平臺中支持整合各種靜態代碼掃描檢測工具。SonarQube中各種代碼檢測工具分析對象及應用技術對比:

Java靜態分析工具分析對象應用技術CheckStyleJava源文件缺陷模式匹配FindBugs字節碼缺陷模式匹配;數據流分析PMDJava源代碼缺陷模式匹配

CheckStyle

可以很方便的幫我們檢查Java代碼中的格式錯誤,它能夠自動化代碼規范檢查過程,從而使得開發人員從這項重要,但是枯燥的任務中解脫出來。基本上都是根據開發規則定制規則。主要涵蓋以下內容:

  • Javadoc 注釋:檢查類及方法的 Javadoc 注釋
  • 命名約定:檢查命名是否符合命名規范
  • 標題:檢查文件是否以某些行開頭
  • Import 語句:檢查 Import 語句是否符合定義規范
  • 代碼塊大小,即檢查類、方法等代碼塊的行數
  • 空白:檢查空白符,如 tab,回車符等
  • 修飾符:修飾符號的檢查,如修飾符的定義順序
  • 塊:檢查是否有空塊或無效塊
  • 代碼問題:檢查重復代碼,條件判斷,魔數等問題
  • 類設計:檢查類的定義是否符合規范,如構造函數的定義等問題

FindBugs

Findbugs是一個靜態分析工具,它檢查類或者JAR文件,將字節碼與一組缺陷模式進行對比以發現可能的問題。主要涵蓋以下內容:

  • Bad practice 壞的實踐:常見代碼錯誤,用于靜態代碼檢查時進行缺陷模式匹配
  • Correctness 可能導致錯誤的代碼,如空指針引用等
  • 國際化相關問題:如錯誤的字符串轉換
  • 可能受到的惡意攻擊,如訪問權限修飾符的定義等
  • 多線程的正確性:如多線程編程時常見的同步,線程調度問題
  • 運行時性能問題:如由變量定義,方法調用導致的代碼低效問題

PMD

一種開源分析Java代碼錯誤的工具,其原理為使用JavaCC生成解析器來解析源代碼并生成AST(抽象語法樹)。與其他分析工具不同的是,PMD通過靜態分析獲知代碼錯誤。也就是說,在不運行Java程序的情況下報告錯誤。PMD附帶了許多可以直接使用的規則,利用這些規則可以找出Java源程序的許多問題,例如:

  • 潛在的 Bugs:檢查潛在代碼錯誤,如空的 try/catch/finally/switch 語句
  • 未使用代碼(Dead code):檢查未使用的變量,參數,方法等
  • 可選的代碼:String/StringBuffer的濫用
  • 復雜的表達式:檢查不必要的 if 語句,可被 while 替代的 for 循環
  • 重復的代碼:檢查重復的代碼
  • 循環體創建新對象:檢查在循環體內實例化新對象
  • 資源關閉:檢查 Connect,Result,Statement 等資源使用之后是否被關閉掉

此外,用戶還可以自己定義規則,檢查Java代碼是否符合某些特定的編碼規范。例如,你可以編寫一個規則,要求PMD找出所有創建Thread和Socket對象的操作。

三種工具對比

ca99b3b43ad43722bcfd09e8b8e761f4.png

由表中可以看出幾種工具對于代碼檢查各有側重。其中,Checkstyle 更偏重于代碼編寫格式,及是否符合編碼規范的檢驗, 對代碼 bug 的發現功能較弱;而 FindBugs,PMD著重于發現代碼缺陷。在對代碼缺陷檢查中,這三種工具在針對的代碼缺陷類別也各有不同,且類別之間有重疊。

“規則定制

考慮到Sonar Java規則已經包含了PMD和CheckStyle規則,因此我們選擇了Sonar的默認規則,并對其進行了定制化。下圖中SonarQube中展示了部分定制化規則內容。

fd320a4202400d3e314716bbcc35a125.png

定制化后的規則覆蓋的代碼缺陷類型如下表所示(部分規則):

代碼缺陷分類示例引用操作空指針引用對象操作對象比較(使用==而不是equals)表達式復雜化對于的if語句數組使用數組下標越界未使用變量或代碼段未使用變量資源回收I/O未關閉方法調用未使用方法返回值代碼設計空的try/catch/finally塊

總結

本篇介紹了微服務架構架構對測試的挑戰,在微服務架構下如何開展測試工作以及在微服務架構下的如何實現靜態代碼掃描。后續文章將介紹,敬請關注:

  • 1. 微服務測試之單元測試
  • 2. 微服務測試之契約測試
  • 3. 微服務測試之接口測試
  • 4. 微服務測試之UI自動化測試
  • 5. 微服務測試之探索式測試

作者簡介

王田,隨行付架構部測試架構師。負責測試方法論布道、自動化測試工具研究與推廣。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/372976.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372976.shtml
英文地址,請注明出處:http://en.pswp.cn/news/372976.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

XML引入以及與html的區別

1.1 引入HTML: 負責網頁的結構 CSS&#xff1a; 負責網頁的樣式&#xff08;美觀&#xff09;Javascript&#xff1a; 負責在瀏覽器端與用戶進行交互。負責靜態的網頁制作的語言HTML語言特點&#xff1a;1&#xff09;由標簽組成。 <title> <p> <hr/> <br…

ADF:在任務流終結器中支持bean作用域

介紹 當我們需要在任務流消失之前完成一些最終工作&#xff08;干凈的資源&#xff0c;緊密的連接等&#xff09;時&#xff0c;這是使用任務流終結器的非常普遍的推薦做法。 和往常一樣&#xff0c;我們使用在任務流中聲明的托管bean。 托管Bean可以具有不同的范圍-請求&#…

Python 異常處理--raise函數用法

在Python中&#xff0c;要想引發異常&#xff0c;最簡單的形式就是輸入關鍵字raise&#xff0c;后跟要引發的異常的名稱。異常名稱標識出具體的類&#xff1a; Python異常處理是那些類的對象。執行raise語句時&#xff0c;Python會創建指定的異常類的一個對象。raise語句還可指…

大學計算機教學ppt數制,大學計算機基礎 第3講 數制及其相互轉換 國家精品課程課件(可編輯)...

大學計算機基礎第3講數制及其相互轉換國家精品課程課件PPT第1 章計算機基礎知識第3 講數制及其相互轉換主要教學內容數制的基本概念1 數制轉換2 小結3 學習目標1 理解數制的基本概念。2 掌握數制間的轉換。3 能夠靈活應用轉換關系完成數制之間的轉換。重點與難點不同數制之間的…

linux中匿名用戶怎么登陸_南京課工場IT培訓:Linux中vsftpd服務配置(匿名,用戶,虛擬用戶)...

vsftpd概述vsftpd 是“very secure FTP daemon”的縮寫&#xff0c;安全性是它的一個最大的特點。vsftpd 是一個 UNIX 類操作系統上運行的服務器的名字&#xff0c;它可以運行在諸如 Linux、BSD、Solaris、 HP-UNIX等系統上面&#xff0c;是一個完全免費的、開放源代碼的ftp服務…

Java _ JDK _ Arrays, LinkedList, ArrayList, Vector 及Stack

(最近在看JDK源碼&#xff0c;只是拿著它的繼承圖在看&#xff0c;但很多東西不記錄仍然印象不深&#xff0c;所以開始記錄JDK閱讀系列。) &#xff08;一&#xff09;Arrays Arrays比較特殊&#xff0c;直接繼承自Arrays -》List(Interface) -》Collection(Interface)。(Maybe…

server2016做文件服務器,『配置』服務器搭建 Office Online Server2016 實現文檔預覽 番外 錯誤篇...

安裝一個或多個角色、角色服務或功能失敗。找不到源文件。請再次嘗試在新的“添加角色和功能”向導會話中安裝角色、角色服務或功能&#xff0c;然后在向導的“確認”頁中單擊“指定備用源路徑”以指定安裝所需的源文件的有效位置。目標服務器的計算機帳戶必須能夠訪問該位置。…

Java High CPU故障排除指南–第1部分

本文是該系列的第1部分&#xff0c;它將為您提供有關如何進行故障排除和識別Java高CPU問題根本原因的綜合指南。 該指南也適用于獨立的Java程序&#xff0c;但旨在幫助涉及Java EE企業日常生產支持的個人。 它還將包括最常見的高級CPU問題列表以及高級解決方案。 生產問題解決…

PHP數據結構之三 線性表中的單鏈表的PHP實現

線性表的鏈式存儲&#xff1a;用一組任意的存儲單元存儲線性表中的數據元素。用這種方法存儲的線性表簡稱線性鏈表。 鏈式存儲線性表的特點&#xff1a;存儲鏈表中結點的一組任意的存儲單元可以是連續的&#xff0c;也可以是不連續的&#xff0c;甚至是零散分布在內存中的任意位…

php進程間通信 yoc_swoole的process模塊創建和使用子進程

swoole中為我們提供了一個進程管理模塊 Process&#xff0c;替換PHP的 pcntl 擴展&#xff0c;方便我們創建進程&#xff0c;管理進程&#xff0c;和進程間的通信。swoole提供了2種進程間的通信&#xff1a;1、基于 unix socket 的管道 pipe。2、基于 sysvmsg 的消息隊列。我們…

ajax回復留言,Ajax 留言板模擬

這一節我們利用 Ajax 制作一個留言板模擬&#xff0c;之所以叫模擬&#xff0c;是由于沒有將留言內容存入數據庫&#xff0c;而只是假像地處理&#xff0c;因為這里著重討論 Ajax&#xff0c;暫時就不涉及數據庫操作。這里我們模擬了留言失敗的情況&#xff0c;每次提交有 50% …

RabbitMQ:計劃郵件傳遞

本月初&#xff0c;我在ComoRichWeb上的RabbitMQ上做了一個演講&#xff0c;與會人員提出的一個問題是“是否可以發布一條消息供以后使用&#xff1f;” 我回答說&#xff0c;就我所知&#xff0c;這是不可能的&#xff0c;但是可能會有一些技巧來實現它。 好吧&#xff0c;今天…

mysqls壓力測試怎么用_阿里研究員:測試穩定性三板斧,我怎么用?

阿里妹導讀&#xff1a;如何治理測試穩定性問題&#xff1f;很多人會說&#xff1a;環境、流程管控、監控、工具化、加機器、專人負責、等等。這些都是對的。不過這些都是解決方案層面的&#xff0c;而不是方法論和理論體系層面的。今天&#xff0c;阿里研究員鄭子穎來說說測試…

HttpModule與HttpHandler詳解

ASP.NET對請求處理的過程&#xff1a;當請求一個*.aspx文件的時候&#xff0c;這個請求會被inetinfo.exe進程截獲&#xff0c;它判斷文件的后綴&#xff08;aspx&#xff09;之后&#xff0c;將這個請求轉交給 ASPNET_ISAPI.dll&#xff0c;ASPNET_ISAPI.dll會通過http管道&…

【iOS開發】---- 強大的UI修改工具 UIAppearance-有圖片效果

iOS5及其以后提供了一個比較強大的工具UIAppearance&#xff0c;可以輕松的統一你的界面&#xff0c;它提供如下兩個方法&#xff1a; (id)appearance (id)appearanceWhenContainedIn:(Class <>)ContainerClass,... 第一個方法是統一全部改&#xff0c;比如你設置UINav…

7月9日王者榮耀服務器維護,王者榮耀 7月9日體驗服停機更新公告

親愛的召喚師&#xff1a;為了增加版本的穩定性&#xff0c;我們計劃在2021年7月9日16:00-17:00對《王者榮耀》體驗服進行停機維護。【更新時間】7月9日16:00-17:00(15:30關閉PVP)【更新方式】停機更新【更新范圍】王者榮耀修煉之地體驗服【下載地址】體驗服更新完畢后&#xf…

使用Jetty設置JNDI(嵌入式)

我在開發工作區上運行嵌入式Jetty&#xff0c;從而節省了一些編譯和部署惡性循環的時間。 我與Jetty的合作不多&#xff0c;易用性使我著迷于它。 我需要設置JNDI才能檢索與數據庫相關的活動的連接池。 盡管某些地方有完整的文檔&#xff0c;但大多數都是分散的。 因此&#xf…

交華為換機access配置_華為交換機Hybrid接口及基礎配置

一、回顧VLANVLAN基本概念VLAN即虛擬局域網&#xff0c;是將一個物理的LAN在邏輯上劃分成多個廣播域(多個VLAN)的通信技術。VLAN內的主機間可以直接通信&#xff0c;而VLAN間不能直接互通&#xff0c;從而將廣播報文限制在一個VLAN內。由于VLAN之間的隔離&#xff0c;所以一些類…

HttpClient使用之下載遠程服務器中的文件(注意目錄遍歷漏洞)

參考文獻&#xff1a; http://bbs.csdn.net/topics/390952011 http://blog.csdn.net/ljj_9/article/details/53306468 1.下載地址 http://hc.apache.org/downloads.cgi Apache-》Projects-》HttpComponents 2.DownloadServlet 1 package com.servlet;2 3 import java.io.Buffer…

HDOJ-1263

水果 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 5303 Accepted Submission(s): 2022 Problem Description夏天來了~~好開心啊,呵呵,好多好多水果~~Joe經營著一個不大的水果店.他認為生存之道就是經營最受顧…