单元测试与软件设计.ppt

* * * * * * * 初始化所有组件 * * * 初始化所有组件 * * * * * * TestChecker * * * 大量数据时用数据文件 反向关联 Mock对象 timer * * * * * Email格式 路桩 前后顺序 前后条件 0、空、null * * * Email格式 路桩 前后顺序 前后条件 0、空、null * * * * Jmock JMock is a library that supports test-driven development of Java code with mock objects. Jmock的用法参考:/cookbook.html EasyMock 4.测试的内容 4.1测试内容(Right-BICEP) Right-结果是否正确? B-是否所有的边界条件都是正确的? I-能查一下反向关联吗? C-能使用其它手段交叉检查一下结果吗? E-你是否可以强制错误条件发生? P-是否满足性能要求? 4.1.1 结果是否正确 测试首要的任务——验证结果 使用独立的数据文件存储测试用例 完全伪造或者不一致的输入数据,例如一个名为“!*w:gjagja;;,/.d;”的文件。 格式错误的数据,例如没有顶层域名的电子邮件地址,如fred@foobar 空值或不完整的值 一些与意料中的合理值相去甚远的数值。如一个岁数为10000岁。 如果要求的是一个不允许出现重复数值的list,但是传入的是一个存在重复数值的list 如果要求的是一个有序list,但是传入的是一个无序list;或者反之 事情到达的次序是错误的,或者碰巧和期望的次序不一致,如未登陆系统之前,就尝试打印文档。 4.1.2 可能的边界值 反向关联 如对结果进行平方的方式来检查一个计算平方根的函数,然后测试结果是否和原数据很接近。 类似地,为了检查某条记录是否成功地插入了数据库,你也可以通过查询这条记录来验证。 其它手段交叉检查 通常计算一个量会有一种以上的算法。我们可能会基于运行效率或者其他的特性,来选择算法,那是我们要在产品中使用的,但在测试时可以使用剩下的算法来做交叉测试。 其它手段交叉检查 另一种办法,使用类本身不同组成部分的数据,并且确信它们能“合起来”。如,正在做一个图书馆的数据系统。在这个系统中,对每一本具体的书,它的数量永远是平衡的。即借出书+库存书=藏书总量 我们可以用一种数量检查另一种数量。 强制产生错误条件 真实世界中,错误总是会发生:磁盘会满,网络连线会断开,电子邮件会多得像掉进了黑洞,而程序会崩溃。你应当能够通过强制引发错误,来测试你的代码是如何处理所有这些真实世界中的问题的。 强制产生错误条件 性能特性 不是性能本身 如:“随着输入尺寸慢慢变大,问题慢慢变复杂”的趋势。 确保性能曲线能够保持稳定 5. CORRECT边界条件 5.1 边界条件 思考 public int calculate(int a,int b){ return a/(a+b); } 5.2 边界条件 一致性(Conformance) 值是否和预期的一致 有序性(Ordering) 值是否如应该的那样,是有序或无序 区间性(Range) 值是否位于合理的最小值和最大值之内。 引用,耦合性(Reference) 代码是否引用了一些不在代码本身控制范围之内的外部资源 5.2 边界条件 存在性(Existence):值是否存在 基数性(Cardinality) 是否恰好有足够的值 时间性(Time) 区间性 如果数据不能像你期望的那样与结构相一致,将会出现什么情况?象这种情况,你就需要测试你的结果并确保其一致性。(一致性) 任何一个搜索程序都应该针对搜索目标位于最前或最后的条件做测试。(有序性) 如果这种情况可能发生,并且在发生的时候,你的程序需要处理她,那么你就需要测试这种情况。 耦合性 如,网站上一个用来显示用户记录的方法,可能要求用户先登录。 栈的pop()方法要求一个非空的栈。 手动档汽车给汽车换挡。 前条件、后条件 存在性 通过询问:“给定的事物存在吗?” 对于你传入或者维护的值,先询问如果值不存在——如果它为null、或者等于0,方法的行为将会怎样? 面对这些不存在的数据,java库的许多方法会抛出异常。然而要调试一个隐藏在库深处的运行期异常通常并不容易。 在期望值不存在的时候,大多数方法都会失败,但这可能并不是你所期望的结果。因此,你可以对这些情况进行测试,查看当网络不通、文件不存在的时候,又会发生什么事情。确认你的方法处理了“不存在”的情况。 练习(思考栈的测试方法) public interface StackExercise { public String pop()

文档评论(0)

1亿VIP精品文档

相关文档