哈工大软件构造复习5(2,9-12)
2,12 测试和面向正确性和健壮性的软件构造
白盒测试:对程序内部代码结构的测试
白盒测试标准:
独立/基本路径测试:对程序所有执行路径进行等价类划分,找出有代表性的最简单的路径(例如循环只需执行一次),设计测试用例使每一条基本路径被至少覆盖一次。
黑盒测试:对程序外部表现出来的行为的测试
测试用例:输入+执行条件+期望结果
测试优先的编程:
1)先写spec
2)根据spec写测试用例
3)完成代码直到通过测试用例
优势:节省大量的测试时间
单元测试:针对软件的最小单元模型开展测试,隔离各个模块,容易定位错误和调试
Junit test:一个单元测试方法通常包含一个或多个对正在测试的模块,然后使用断言检查结果assertEquals、assertTrue 和 assertFalse 等方法。
前面需要@Test
代码覆盖度:
测试效果和难度:路径覆盖>分支覆盖>语句覆盖
测试优先编程。在编写代码之前编写测试。
▪ 用于系统地选择测试用例的分区和边界。
▪ 白盒测试和语句覆盖率,用于填写测试套件。
▪ 对每个模块进行单元测试,尽可能隔离。
▪ 自动回归测试,防止错误再次出现。
健壮性和正确性是软件构造最重要的质量特性
健壮性:系统在不正常输入和不正常外部环境下表现正常的程度
健壮性要求能够处理错误信息和终止,如果终止则要展示给用户全面的错误信息以便debug
正确性:对spec的完成程度
对外的接口,倾向于健壮;对内的实现,倾向于正确
Error:不是由程序本身引起,由系统限制引起
Exception:自己程序导致的问题,可以捕获、处理
如果子类型中override了父类型中的函数,那么子类型中方法抛出的异常不能比父类型抛出的异常类型更宽泛:
子类型方法可以抛出更具体的异常,也可以不抛出任何异常
父类型未抛出异常,子类型也不能抛出异常
断言assert可用来限定:内部不变量、表示不变量、控制流不变量、前置条件、后置条件等
9,10,11面向可复用性和可维护性的软件构造
复用的几个级别:源代码级别,模块级别,库级别,系统级别
可复用类:继承,重写,重载,参数多态,泛型编程等
软件复用:最主要是代码复用
白盒复用:源代码可见、可修改和扩展(对应继承)
黑盒复用:源代码不可见,不能修改,只能通过API接口使用(对应委托)
LSP:
子类型多态:客户端可以用统一的方式处理不同类型的对象。
能被Java静态类型检测检测出的:
子类型可以增加方法,但不可以删除方法
子类型需要实现抽象类型中的所有未实现的方法
子类型中重写的方法必须返回相同的类型或者子类型(满足协变)
子类型中重写的方法必须使用同样类型的参数(或符合逆变的参数)
子类型中重写的方法不能抛出额外的异常(协变)
不能被静态类型检测出的:
更强的不变量
更弱的前置条件
更强的后置条件
协变:
父类型->子类型:越来越具体
返回值和异常的类型:不变或变得更具体
反协变:参数相反变化或更抽象
反协变在java中看作overload
委派/委托:一个对象请求另一个对象的功能
软件维护:修复错误、改善性能
软件维护的类型:纠错性,适应性,完善性,预防性
可维护性度量指标:圈复杂度、代码行数、可维护性指数(MI)、继承的层次数、类之间的耦合度、单元测试的覆盖度
SOLID设计
- SRP(单一责任原则)
- OCP(开放-封闭原则)
- LSP(Liskov替换原则)
- DIP(依赖转置原则)
- ISP(接口聚合原则)
形式语言正则表达式可用于编程
设计模式:创建型模式、结构型模式、行为型模式、
创建型模式:
工厂方法模式:
当client不知道要创建哪个具体类的实例,或者不想在client代码中指明要具体创建的实例时,用工厂方法。
定义一个用于创建对象的接口,让其子类来决定实例化哪一个类,从而使一个类的实例化延迟到其子类
静态工厂方法:既可以在ADT内部实现,也可以构造单独的工厂类
结构型模式:
1)适配器模式:将某个类/接口转换为client期望的其他形式
通过增加一个接口,将已存在的子类封装起来,client面向接口编程,从而隐藏了具体子类。
2)装饰器模式(Decorator)对一个类的功能进行扩充(实现特性的组合)装饰器在运行时组合特性
继承在编译时组合特性
行为型模式:
策略模式:使用功能的时候不访问功能实现,访问接口(在多个功能间灵活切换)
模板模式:共性的步骤在抽象类内公共实现,差异化的步骤在各个子类中实现
实现:使用继承和重写实现模板模式
迭代器:将集合类的迭代操作委托给迭代器来实现
VISITOR:把类中的某些功能委托给别人实现

浙公网安备 33010602011771号