一、软件构造的多维视图
由三个视角构成:
(1)build-time和run-time
(2)code-level和Component-level
(3)moment和peride
code-level:代码的逻辑组织,functions,classees,methods,interface
Component-leval:代码的物理组织,files,directions,packages,libraries
moment:特定时刻的软件形态
period:软件形态岁时间的变化
- build time 构造阶段
Code-leval | Component-leval | |
---|---|---|
Moment | 词汇层面(source code),语法层面(AST),语义层面(Class Diagram) | files,packages,libraries,static linking,test case,build script,(Component diagram) |
Peried | code churn(代码变化) | Configuration Item, Version |
AST:抽象语法分析树
Class Diagram:UML中的类图
Component diagram:UML中的构件图
Configuration Item:SCI,配置项
Version版本。VCS(version control system)版本控制
【注】(1)静态链接发生在build-time,动态链接发生在run-time
- run-time运行阶段
Code-level | Component-leval | |
---|---|---|
Moment | code snapshot,memory dump | package,library,dynamic linking,Configuration, Database,middleware,network,hardware,(Development diagram) |
peried | execution,stack trace,concurrent,multi-threads | event log,multi-processes,distributed processes |
共同 | Procedure Call Graph, Message Graph (Sequence Diagram) | Procedure Call Graph, Message Graph (Sequence Diagram) |
code snapshot:代码快照图
memory dump:内存信息转储
execution tracing:执行跟踪:代码层面,eg:用日志方式记录程序执行的调用次序
event log:事件日志:构建、系统层面
Deployment diagram:UML中的部署图
Sequence diagram:UML中的时序图
【注】统一视角的不同方面之间可以相互转化
二、软件构造的质量目标
1、外部质量因素
- (1)correctness,正确性
- 最重要的质量指标
- 保持正确性方法:测试和调试,防御式编程,形式化方法
- (2)robustness健壮性:针对异常情况的处理
- 出现规约定义之外的行为,取决于规格说明书spec的范畴
- (3)extendibility易扩展型:软件易于调整以适应变化的能力
- 规模越大,扩展越难
- (4)reuseability可复用性:一次开发多次使用,发现共性
- (5)Compatibility兼容性:不同软件系统之间容易集成
- 如何?保持设计的同构性,标准化
- (6)efficiency效率
- 对性能的关注要与其他质量属性进行折中,过度优化导致软件不再适合变化和复用
- 除非有足够的正确性否则性能毫无意义
- (7)portability可移植性:软件可以在不同技术环境之间进行转移
- (8)ease of use:容易学,安装,操作,监控
- (9)functionality功能性:每增加一小点功能,都确保其他质量属性不受到损失
- (10)timelines及时性
2、内部质量因素
- 圈复杂度:衡量一个模块判定结构的复杂程度
- 耦合度coupling:模块间交互
- 内聚度cohesioj:模块独立性
- 代码行数
- 可读性
3、权衡
- 折中
- 正确性不能与其他质量因素折中
三、软件测试与测试优先编程
1.测试层次
- 单元测试:类,函数,功能单元等单个模块。针对软件的最小单元开展测试,隔离各个模块,容易定位错误和调试
- 集成测试:文件,包,子系统等多个模块
- 系统测试:所有子系统
- 回归测试:修改后再测试
2.测试类型
(1)静态测试和动态测试
- 静态测试Static testing :eg:代码评审
- 动态测试Dynamic testing:运行测试,在100%完成之前进行
(2)testing和debug
- testing:发现是否存在错误
- debug:识别错误根源,消除错误
(3)黑盒测试和白盒测试
- 黑盒测试:对外部表现出来的行为进行测试,基于spec
不用关心内部细节。
基于规约,检查程序是否符合规约- 等价类划分:将被测函数的输入域划分为等价类。数据的限制范围:3类,小于限制范围,在范围之内,大于限制范围。指明特定值,如最大值最小值
- 边界值分析:最小值;率高于最小值;正常值;略低于最大值;最大值
- 全覆盖:笛卡尔乘积;测试完备,但用例数量多
- 覆盖每个取值:最少1次即可;测试用例少,代价地,但测试覆盖度未必高
- 白盒测试:对程序内部代码测试,根据程序执行路径设计,source code
【测试用例test case】输入+执行条件+期望结果
eg:{2,4}, {0,0}, {-2,4} for program y=x^2
3.代码覆盖度
- 测试效果:路径覆盖度>分支覆盖度>语句覆盖度
- 测试难度:路径覆盖度>分支覆盖度>语句覆盖度
- 根据预先设定的覆盖度标准,逐步增加测试用例的数量,直到覆盖度达到标准
4.测试策略
- testing strategy
- 每个测试方法都要有注释,表明使用哪个测试用例