软件构造复习过程中有一些值得注意的东西想记录一下。
关于软件外部质量因素:
1. 正确性
按照预先定义的规约执行,是最重要的质量指标
测试和调试:发现不正确、消除不正确
防御式编程:在写程序的时候就确保正确性
形式化方法:通过形式化验证发现问题
2. 健壮性/鲁棒性
针对异常情况的处理,关键在于出现异常时不要崩溃。健壮性是对正确性的补充,正确性保证了软件的行为要严格符合规约中定义的行为;健壮性保证了出现规约定义之外的情形的时候,软件要做出恰当的反应。 “正常”和“异常”是主观而非客观的,未被规约覆盖的情况即为“异常情况”。
3. 可扩展性
对软件的规约进行修改,是否足够容易 软件规模越大,扩展起来越不容易。
4. 可复用性
一次开发,多次使用
5. 兼容性
不同的软件系统之间相互可容易的集成 核心是保持设计的同构性,关键在标准化。
6. 性能
除非有足够的正确性,否则性能毫无意义。对性能的关注要与其他质量属性进行折中,过度的优化会导致软件不再适应变化和复用。
7. 可移植性
软件可方便的在不同的技术环境之间移植,包括硬件和操作系统
8. 易用性
对用户而言容易学、安装、操作、监控 提升易用性的方法是给用户提供详细的指南。
9. 功能性(Functionality)
程序设计中一种不适宜的趋势,即软件开发者增加越来越多的功能,企图跟上竞争,其结果是程序极为复杂、不灵活、占用过多的磁盘空间,忽视整体质量,失去可持续性。
10. 及时性(Timeliness)
在用户有对应需求前放出新版本
内部因素:
源码方面有逻辑复杂度,LoC;
结构方面有耦合、内聚;
还有代码可读性等等。
软件测试和调试有区别,测试是指发现是否存在错误,而调试是识别错误根源,消除错误。
测试分类从范围看:
单元测试:针对软件的最小单元模型开展测试(一般来说是在单个方法/类的级别),隔离各个模块,容易定位错误和调试
集成测试:将多个程序员/团队编写的类/包/组件/子系统联合起来测试
系统测试:对整个系统进行测试,将硬件、软件、配置信息等看作一个整体
验收测试:产品发布之前所进行的软件测试活动,是技术测试的最后一个阶段,目的是确保软件准备就绪,并且可以让最终用户将其用于执行软件的既定功能和任务
回归测试:一旦程序被修改,重新执行之前的所有测试以确认修改没有引入新的错误或导致其他代码产生错误
而从动静态来看:
静态测试:在编写代码的阶段由程序员或是代码编辑器、编译器等工具进行检查(如语法检查、代码评审)
动态测试:通过测试用例实际执行了编写的代码 动态测试可能在程序完全编写完成前就用于测试代码的特定节
结构上又分为白盒测试和黑盒测试。
黑盒测试要注意重点:测试实例的等价类划分,典型的划分原则就是考虑输入数据是否限定了数值范围,或是指明了特定的值,或是对不同范围的值可能采用不同的计算方案。两种覆盖方式:笛卡尔积全覆盖和覆盖每个取值。
白盒测试根据程序执行路径设计测试用例,一般较早执行。 独立/基本路径测试:对程序所有执行路径进行等价类划分,找出有代表性的最简单的路径(例如循环只需执行 1 次),设计测试用例使每一条基本路径被至少覆盖 1 次。
代码覆盖度:已有的测试用例有多大程度覆盖了被测程序,通常用百分比衡量 代码覆盖度越低,测试越不充分;但要做到很高的代码覆盖度,需要更多的测试用例,测试代价高。
语句覆盖:每⼀条语句至少执行一次
分支覆盖:判定中每个条件的所有可能结果至少出现一次,并且每个判定本身的所有可能结果也至少出现一次
路径覆盖:每条可能执行到的路径至少执行一次
测试效果:路径覆盖 > 分支覆盖 > 语句覆盖
测试难度:路径覆盖 > 分支覆盖 > 语句覆盖