软件构造-03
(一)Junit单元测试
-
分类
白盒测试:对程序内部代码 结构的测试
黑盒测试:对程序外部表现出来的行 为的测试 -
提倡测试优先编程的思想
写规约 ~> 写测试用例 ~>写代码 -
测试策略
(1)等价类划分
(2)笛卡尔积全覆盖 / 每个等价类至少覆盖一次
(3)边界值分析 -
测试用例
@Test
assertEquals(expected,actual)
5练习
例1整数乘法
(1)正负角度划分:正负,正正,负负,负正
(2)边界值分析:0,-1,1,很大的数
例reverseEnd方法
For example: reverseEnd("Hello, world", 5) returns "Hellodlrow ,"
(1)等价类划分:start0 ,0<start<text.length,starttext.length(等价类划分满足规约)
(二)异常 -
error、checked异常、unchecked异常
-
checked异常处理
(1)声明(throws)、抛出(throw)、捕获(try…catch)、处理 -
自定义异常类
(三)并发 -
进程和线程
-
多线程方法
(1)sleep():线程进入休眠,不会释放锁
(2)wait():线程释放锁进入等待列表,直到获得锁再次参与竞争
(3)interrupt():向线程请求中断,线程设置中断状态。如果程序在sleep、wait中会抛出中断异常;如果程序正常执行则无影响
(4)interrupted():检查中断状态,并设置为false---类方法
(5)isinterrrupted():检查中断状态,不改变状态
(6)join():让当前线程保持执行,直到其执行结束
(7)notify():唤醒某个等待列表的线程
(8)notifyAll():唤醒所有等待列表的线程 -
关于引发线程安全的原因:
变量在外部多引用下读写数据产生竞争交错
上述的数据:heap上的数据,(1)rep中的变量(基本类型(数组不安全)+对象类型(mutable类型不安全))(2)局部变量(若局部变量每次引用都会创建新的对象,则不存在问题;否则,注意对象类型依旧在堆上创建,可能存在风险)
4 线程安全策略
(1)限制共享:线程之间不共享数据
(2)只共享immutable类型:使用不可变数据类型的不可变引用(final)
(3)使用线程安全的mutable类型:synchronized包装类,
注意1:不要绕过包装器,被包装对象使用匿名类
注意2:保证了集合类中的每个方法是原子操作,但各种方法间的交错难以避免
(4)锁与同步技术
1. 根据线程安全的原则找出不满足线程安全的部分
2. 将并行变成部分串行,上锁
注意1:锁的粒度越大,越安全,但效率越低
注意2:存在竞争的线程使用同一把锁