软件质量

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隐藏状态服务…