軟考(軟件設計師)軟件工程-軟件質量,軟件測試,McCabe圈復雜度

軟件質量

ISO/IEC 9126 是軟件工程領域的經典質量模型,于1991年首次發布,2001年更新后成為軟件產品質量評估的國際標準。其核心貢獻是將抽象的“質量”概念分解為可度量、可管理的特性體系。以下是深度解析(2023年行業實踐視角):


🧱 **一、模型分層結構

質量特性
功能性
可靠性
易用性
效率
維護性
可移植性
適合性
準確性
互操作性
安全性
功能依從性
易分析性
易改變性
穩定性
易測試性
需求覆蓋率
用戶任務完成率

🔍 二、六大特性詳

1. 功能性(Functionality)
  • 定義:軟件滿足需求的能力
2. 可靠性(Reliability)
  • 定義:在規定條件下維持性能水平的能力
  • 案例
    • 航空控制系統要求 MTBF > 10,000小時
    • AWS EC2 SLA承諾可用性≥99.99%
3. 易用性(Usability)
  • 評估維度
    45%30%25%易用性問題分布學習成本高操作效率低錯誤恢復難
  • 度量舉例
    • 新用戶任務完成時間 < 5分鐘(如滴滴出行首次叫車)
4. 效率(Efficiency)
  • 資源類型
    • 時間特性:響應延遲(如5G基站控制指令<10ms)
    • 資源利用:CPU/內存占用率(如MySQL查詢內存<100MB)
5. 維護性(Maintainability)
  • 代碼質量核心指標
指標優質閾值劣質信號
圈復雜度< 15> 50 (不可測試)
重復代碼率< 5%> 20% (修改風險↑300%)
6. 可移植性(Portability)
  • 關鍵活動
    • 環境抽象(如Spring Boot自動配置)
    • 依賴隔離(Docker容器化)

💎 總結

盡管已被ISO/IEC 25010取代,9126仍是質量模型的理論基石

正如Capers Jones所言:
“沒有度量就沒有改進” —— 9126的價值在于將模糊的質量訴求轉化為可行動的工程實踐。在云原生時代,其精神正通過自動化質量流水線延續生命。


軟件測試

一、測試目標與原則

核心目標

在這里插入圖片描述

原則
  1. 缺陷集群性(二八定律):80%缺陷集中在20%模塊
  2. 殺蟲劑悖論:重復用例失效,需持續更新測試方案
  3. 盡早測試:需求階段介入,降低修復成本(IBM統計:需求缺陷修復成本=代碼級10倍)

二、測試層級金字塔(Mike Cohn模型)

1. 單元測試(Unit Testing)
  • 對象:函數/類方法
  • 工具:JUnit(Java), Pytest(Python)
    // Junit示例:賬戶余額校驗
    @Test
    void whenBalanceInsufficient_thenThrowException() {Account account = new Account(500);assertThrows(InsufficientBalanceException.class, () -> account.withdraw(1000));
    }
    
  • 覆蓋率要求:關鍵模塊≥80%(航空軟件要求100% MC/DC)
2. 集成測試(Integration Testing)
  • 焦點:模塊間接口、數據流
3. 系統測試(System Testing)
  • 測試類型
    • 功能測試:需求覆蓋度矩陣
    • 性能測試:JMeter模擬10萬并發用戶
    • 安全測試:OWASP ZAP掃描SQL注入
4. 驗收測試(Acceptance Testing)
  • 形式
    • UAT(用戶驗收):真實業務流程驗證
    • Alpha:開發環境內測
    • Beta:生產環境公測

三、測試方法矩陣

1. 黑盒 vs 白盒
維度黑盒測試白盒測試
測試依據需求文檔代碼結構
技術門檻低(無需編碼)高(需讀源碼)
典型方法等價類劃分、邊界值路徑覆蓋、條件覆蓋
2. 靜態 vs 動態
  • 靜態測試:不運行代碼
    • 代碼審查(GitHub PR機制)
    • 需求評審(Checklist驗證)
  • 動態測試:運行中驗證
    • 壓力測試(Locust模擬秒殺場景)
    • 故障注入(Chaos Monkey隨機終止節點)

四、效能度量體系

關鍵指標
指標計算公式健康閾值
缺陷逃逸率上線后缺陷數 / 測試發現缺陷數< 10%
自動化覆蓋率自動化用例數 / 總用例數核心模塊≥70%
平均修復時間(MTTR)總修復時間 / 缺陷數量< 4小時

McCabe圈復雜度

一、核心原理與公式

1. 控制流圖(Control Flow Graph)基礎

程序被抽象為有向圖:

  • 節點:代碼塊(順序執行語句)
  • :控制轉移路徑(分支/跳轉)
True
False
開始
語句1
條件判斷
語句2
語句3
結束

2. 圈復雜度公式

圈復雜度 V(G) 的計算公式:

V(G) = E - N + 2P
  • E:邊的數量(Edges)
  • N:節點的數量(Nodes)
  • P:連通分量數(通常為1)

簡化公式V(G) = 判定節點數 + 1

3. 復雜度風險等級

圈復雜度風險等級維護建議
1-5低風險優秀代碼
6-10中等風險需審查
11-20高風險強烈建議重構
20+極高風險不可接受

二、實例解析(含控制流圖)

示例1:順序結構

void printSequence() {printf("A");printf("B");printf("C");
}

控制流圖

Start
printf'A'
printf'B'
printf'C'
End

計算

  • 邊數 E = 3
  • 節點 N = 4
  • V = 3 - 4 + 2 = 1

示例2:分支結構

void checkValue(int x) {if (x > 0) {printf("Positive");}printf("Done");
}

控制流圖

Yes
No
Start
x>0?
printf'Positive'
printf'Done'
End

計算

  • 判定節點:1個(if語句)
  • V = 1 + 1 = 2

示例3:多分支結構

void evaluate(int score) {if (score >= 90) {printf("A");} else if (score >= 70) {printf("B");} else if (score >= 60) {printf("C");} else {printf("F");}
}

控制流圖

Yes
No
Yes
No
Yes
No
Start
score>=90?
printf'A'
score>=70?
printf'B'
score>=60?
printf'C'
printf'F'
End

計算

  • 判定節點:3個(if/else if)
  • V = 3 + 1 = 4

三、實踐

  1. 重構高復雜度函數
    • 策略模式替代分支嵌套
    • 表驅動法管理業務規則
  2. 預防措施
    復雜度>10
    通過
    提交代碼
    靜態掃描
    阻斷合并
    人工審核

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

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

相關文章

CentOS7環境安裝包部署并配置MySQL5.7

卸載MySQL卸載MySQL5.71、關閉MySQL5.7服務service mysqld stop2、查看MySQL安裝rpm -qa|grep -i mysqlmysql-community-libs-5.7.35-1.el7.x86_64mysql-community-libs-compat-5.7.35-1.el7.x86_64mysql-community-common-5.7.35-1.el7.x86_64mysql57-community-release-el7-1…

1-Git安裝配置與遠程倉庫使用

Git安裝配置與遠程倉庫使用 1. Git 下載與安裝 ① 進入Git 官網 https://git-scm.com/ ② 選擇合適系統版本下載&#xff0c;本文以windows為例進行下載 當前最新版本為 2.50.1 &#xff0c;瀏覽器默認下載很慢&#xff0c;用迅雷比較快 ③ 安裝Git 我安裝在D盤 等待完…

開源“具身大腦” 實現不同機器人群體協作-RoboBrain

開源“具身大腦” 實現不同機器人群體協作-RoboBrain 具身大小腦協作框架RoboOS與開源具身大腦RoboBrain&#xff0c;實現跨場景多任務輕量化快速部署與跨本體協作&#xff0c;推動單機智能邁向群體智能&#xff0c;為構建具身智能開源統一生態加速場景應用提供底層技術支持。支…

【筆記】訓練步驟代碼解析

目錄 config參數配置 setup_dirs創建訓練文件夾 load_data加載數據 build_model創建模型 train訓練 記錄一下訓練代碼中不理解的地方 config參數配置 config {data_root: r"D:\project\megnetometer\datasets\WISDM_ar_latest\organized_dataset",train_dir: t…

Java填充Word模板

文章目錄前言一、設置word模板普通字段列表字段復選框二、代碼1. 引入POM2. 模板放入項目3.代碼實體類工具類三、測試四、運行結果五、注意事項前言 最近有個Java填充Word模板的需求&#xff0c;包括文本&#xff0c;列表和復選框勾選&#xff0c;寫一個工具類&#xff0c;以此…

【MYSQL8】springboot項目,開啟ssl證書安全連接

文章目錄一、開啟ssl證書1、msysql部署時默認開啟ssl證書2、配置文件3、創建用戶并指定ssl二、添加Java信任庫1、使用 keytool 導入證書2、驗證證書是否已導入三、修改連接配置一、開啟ssl證書 1、msysql部署時默認開啟ssl證書 可通過命令查看&#xff1a; SHOW VARIABLES L…

Telegraf vs. Logstash:實時數據處理架構中的關鍵組件對比

在現代數據基礎設施中&#xff0c;Telegraf 和 Logstash 是兩種廣泛使用的開源數據收集與處理工具&#xff0c;但它們在設計目標、應用場景和架構角色上存在顯著差異。本文將從實時數據處理架構、時序數據庫集成、消息代理支持等方面對比兩者的核心功能&#xff0c;并結合實際應…

Vue Vue-route (4)

Vue 漸進式JavaScript 框架 基于Vue2的學習筆記 - Vue-route 編程式導航和幾種路由 目錄 編程式導航 詳情組件 創建組件 設置路由 電影列表 傳參 另一種方式 動態路由 命名路由 別名 總結 編程式導航 點擊電影列表 跳轉電影詳情 詳情組件 創建組件 在views中創…

存在兩個cuda環境,在conda中切換到另一個

進入 openmmlab 環境 conda activate openmmlab 設置環境變量為 CUDA 12.4&#xff08;只影響當前 shell 會話&#xff09; export PATH/usr/local/cuda-12.4/bin:PATHexportLDLIBRARYPATH/usr/local/cuda?12.4/lib64:PATH export LD_LIBRARY_PATH/usr/local/cuda-12.4/lib64:…

Django 視圖(View)

1. 視圖簡介 視圖負責接收 web 請求并返回 web 響應。視圖就是一個 python 函數,被定義在 views.py 中。響應可以是一張網頁的 HTML 內容、一個重定向、一個 404 錯誤等等。響應處理過程如下圖: 用戶在瀏覽器中輸入網址:www.demo.com/1/100Django 獲取網址信息,去除域名和端…

HarmonyOS基礎概念

一、OpenHarmony、HarmonyOS和Harmony NEXT區別OpenHarmony是由開放原子開源基金會&#xff08;OpenAtom Foundation&#xff09;孵化及運營的開源項目&#xff0c;開放原子開源基金會由華為、阿里、騰訊、百度、浪潮、招商銀行、360等十家互聯網企業共同發起組建。目標是面向全…

spark3 streaming 讀kafka寫es

1. 代碼 package data_import import org.apache.spark.sql.{DataFrame, Row, SparkSession, SaveMode} import org.apache.spark.sql.types.{ArrayType, DoubleType, LongType, StringType, StructField, StructType, TimestampType} import org.apache.spark.sql.functions._…

【跟著PMP學習項目管理】每日一練 - 3

1、你是一個建筑項目的項目經理。電工已經開始鋪設路線,此時客戶帶著一個變更請求來找你。他需要增加插座,你認為這會增加相關工作的成本。你要做的第一件事? A、拒絕做出變更,因為這會增加項目的成本并超出預算 B、參考項目管理計劃,查看是否應當處理這個變更 C、查閱…

CentOS 安裝 JDK+ NGINX+ Tomcat + Redis + MySQL搭建項目環境

目錄第一步&#xff1a;安裝JDK 1.8方法 1&#xff1a;安裝 Oracle JDK 1.8方法 2&#xff1a;安裝 OpenJDK 1.8第二步&#xff1a;使用yum安裝NGINX第三步&#xff1a;安裝Tomcat第四步&#xff1a;安裝Redis第五步&#xff1a;安裝MySQL第六步&#xff1a;MySQL版本兼容性問題…

如何設計一個登錄管理系統:單點登錄系統架構設計

關鍵詞&#xff1a;如何設計一個登錄管理系統、登錄系統架構、用戶認證、系統安全設計 &#x1f4cb; 目錄 開篇&#xff1a;為什么登錄系統這么重要&#xff1f;整體架構設計核心功能模塊安全設計要點技術實現細節性能優化策略總結與展望 開篇&#xff1a;為什么登錄系統這么…

論跡不論心

2025年7月11日&#xff0c;16~26℃&#xff0c;陰 緊急不緊急重要 備考ing 備課不重要 遇見&#xff1a;免費人格測試 | 16Personalities&#xff0c;下面是我的結果 INFJ分析與優化建議 User: Anonymous (隱藏) Created: 2025/7/11 23:38 Updated: 2025/7/11 23:43 Exported:…

【面板數據】省級泰爾指數及城鄉收入差距測算(1990-2024年)

對中國各地區1990-2024年的泰爾指數、城鄉收入差距進行測算。本文參考龍海明等&#xff08;2015&#xff09;&#xff0c;程名望、張家平&#xff08;2019&#xff09;的做法&#xff0c;采用泰爾指數測算城鄉收入差距。參考陳斌開、林毅夫&#xff08;2013&#xff09;的做法&…

http get和http post的區別

HTTP GET 和 HTTP POST 是兩種最常用的 HTTP 請求方法&#xff0c;它們在用途、數據傳輸方式、安全性等方面存在顯著差異。以下是它們的主要區別&#xff1a;1. 用途GET&#xff1a;主要用于請求從服務器獲取資源&#xff0c;比如獲取網頁內容、查詢數據庫等。GET 請求不應該用…

I2C集成電路總線

&#xff08;摘要&#xff1a;空閑時&#xff0c;時鐘線數據線都是高電平&#xff0c;主機發送數據前&#xff0c;要在時鐘為高電平時&#xff0c;把數據線從高電平拉低&#xff0c;數據發送采取高位先行&#xff0c;時鐘線低電平時可以修改數據線&#xff0c;時鐘線高電平時要…

為了安全應該使用非root用戶啟動nginx

nginx基線安全&#xff0c;修復步驟。主要是由于使用了root用戶啟動nginx。為了安全應該使用非root用戶啟動nginx一、檢查項和問題檢查項分類檢查項名稱身份鑒別檢查是否配置Nginx賬號鎖定策略。服務配置檢查Nginx進程啟動賬號。服務配置Nginx后端服務指定的Header隱藏狀態服務…