Java程序构造©Day3
March 12th, 2018
标签(空格分隔): Java程序构造
第七章
7.5 软件测试 测试优先的编程
参考阅读:MIT6.03103 代码大全第22章 软件工程-实践者的研究方法第17-18章
1 软件测试
什么是测试
测试:发现程序中的错误 提高程序正确性的信心
程序正确确认的基本方法:
- 形式化推理
- 代码评审
- 测试
测试是提高软件质量的重要手段
- 确认是否可达到可用的级别
关注系统某一侧面的质量特性
是否满足需求
- 是否正确响应所有需求
- 性能是否可接受
- 是否可用
- 可否正确部署安装
- 是否达到期望
测试分类
- 单元测试
- 集成测试
- 系统测试
- 回归测试
- 验收测试
白盒测试 黑盒测试
白盒测试:对程序内部代码结构的测试 只关注代码内部的问题
黑盒测试:对程序外部表现出来的行为的测试 采用两个方法
测试困难
- 软件行为在离散输入空间中差异巨大
- 大多数正确 少数错误
- bug出现不遵循特定概率分布
- 无统计规律可循
2 测试用例
这一部分和其他部分联系紧密 不再赘述
3 测试优先编程
在编码之前写出测试 测试接口功能 测试方法正确性
Specification文档 需求
按照规定的语法编写注释 生成文档
4 单元测试
针对软件的最小单元模型开展测试 隔离各个模块 容易定位错误和调试
- 模型接口
- 本地数据结构
- 所有的正常输出
- 边界条件
- 所有的错误处理
第三章 ADT OOP
3.1 数据类型和类型检查
- 动态 静态类型检查
- 可变 不可变类型检查
- 可变数据的危险性
- 不变数据的优越性
- 用snapshot图理解数据类型
软件构造理论基础–ADT
软件构造技术基础–OOP
参考阅读:MIT6.031 01 02 09 CMU15-214 02 Java编程思想第1-6章 11章
1 数据类型
数据类型
基本数据类型 | 对象数据类型 |
---|---|
int long byte short char float double boolean | Classes interfaces arrays enums annotations |
只有值 无ID | 有值 有ID |
不可变 | 可变或不可变 |
在栈中分配空间 | 在堆中分配空间 |
无法统一表达 | 可以统一表达 |
代价低 | 代价高昂 |
封装
把基本数据类型封装为对象类型 通常是在定义集合类型时使用它们
2 静态类型 动态类型
静态类型
- 类型检查通常发生在编译阶段
- 数据类型在定义后就确定 通常无法更改
动态语言
- 在运行阶段检查
3 类型检查
三种检查策略
- 静态类型检查
- 动态类型检查
- 不检查
折中
静态>动态>无检
静态类型检查
在编译阶段进行检查 避免将错误带入运行阶段 可提高程序正确性 健壮性
- 语法错误
- 类型错误
- 参数数目错误
- 函数名 类名错误
- 返回值类型错误
动态类型检查
- 非法参数值
- 非法返回值
- 越界
- 空指针
易变性 永恒性
改变一个变量 和 改变它的值有什么区别
- 改变一个变量 该变量指向另一个值得存储空间
- 改变一个值 将变量指向的空间的值换成另一个值
不变性
不变数据类型 一旦建立 不能更改
例如final标签 尽量使用final作为方法的输入和局部变量
注意:
- final类无法派生子类
- final无法改变值 引用
- final无法被子类重写
不变对象 和 可变对象
可变类型
不可变类型
差异
两种类型的效率上有差别
- 不可变类型:频繁修改 需要垃圾回收
- 可变类型:无需拷贝 效率高
但是不可变类型更加安全 其他质量指标表现更好
风险实例:
- 1 改变源数据
- 2 返回可变类型
稍后更新