junit单元测试之道

  • 单元测试的定义和意义
    • 单元测试是程序员自己编写的一段代码,用于验证被测试代码是否能达到预期的效果,通过所有的测试用例。如果单元测试能比较早的发现被广泛依赖的代码存在的潜在错误,尽早修复,将会缩短问题定位和调试的成本。单元测试可以验证被测试代码的正确性,当代码发生修改时,也可以自动的完成回归测试。
  • 单元测试组成部分
    • 被测试模块
    • 驱动程序,调用被测试模块(比如:main方法、junit的runner)
    • stub或者mock模块,代表被测试模块的依赖
    • 测试用例和预期结果
  • 使用junit完成单元测试
    • junit是针对于java单元测试的框架,其提供常用的几种断言机制:
    • assertEqual:equal方法返回true
    • assertNull :某个引用对象为null
    • assertSame:两个对象是引用同一个对象
    • assertTrue:某个条件表达式为true,assertTrue(true)用于确认某个分钟或者是方法正确抛出了某个异常
    • assertFalse:某个条件表达式为false
    • fail:使测试立即失败,表明到达了不应该来到的地方
  • 使用junit常用的几个组件
    • @Before注解(junit4.x)以及TestCase(junit3.x)的setUp,代表在测试方法执行前做的初始化工作,比如数据初始化,数据库连接等
    • @After注解(junit4.x)以及TestCase(junit3.x)的tearDown,代表在测试方法执行后做的清理工作,比如关闭数据库连接等
    • @Test注解,代表此方法是要在junit框架执行的测试的方法,方法中大都包含断言。
    • TestSuite,测试套,管理多个测试用例的工具,其利用组合设计模式,将多个测试用例组合起来,利用测试套可以很方便的执行或者不执行某个测试用例,测试套会递归的执行其中的测试套或者测试用例。
  • 测试测什么?(Right-bicep)
    • Right:正确性,对于某个输入,程序的输出和我们预期的输出是否一致,我们的预期就是正确的检验标准,对于不同用户的需求,这个预期可能会不一样,正确的检验标准也可能不一样,比如,时间区间的最大值是否包括那一天。当测试数据很多的时候,可以考虑使用测试数据文件的方式来保存和读取测试用例。
    • Boundary : 边界测试,对于边界条件,程序的反应是什么?,是崩溃还是捕获了异常并处理。对于边界测试,稍后会做详细介绍。
    • Inverse:反转测试,取一个反转的方法的测试,比如一个开方函数,取开方函数的值再平方,再看两值是否相等。插入数据后再查询这条数据。
    • Cross:交叉检查,比较多种不同的实现方法的结果,看结果是否一致,比如自己实现的开方函数和math.sqrt()的结果是否一样。
    • Error:强制产生错误条件,比如网络无法连接,磁盘满了。可以使用mock模拟这些现实生活中的极端情况
    • Performance:性能测试,加入计时器timer,在被测试方法执行前后加入时间计时,assertTrue(executeTime<3.0s)。
  • 边界测试详解(correct)
    • Conformance:一致性,函数的输入是否符合预期的格式,如邮件地址格式,邮件名邮件正文等组成部分是否都存在。
    • Order:顺序性,寻找最大值的时候,最大值在第一位、中间、最后一位,程序是否都能找到正确的最大值。
    • Range:区间性,输入值在区间内、区间左、区间右,这些情况程序都能正确处理吗?
    • Reference:引用,当被测试代码依赖其他的条件时,该条件满足和不满足的情况都能正确处理吗?比如未登录就直接调用某个接口会有怎样的结果。
    • Existence:存在性,某个值是否为null、0、空字符串,某个文件不存在的情况下程序会有怎样的反应
    • Cardinality:基数性,在不同的基数条件下,程序能否正常工作。比如要维护一份前十个最受欢迎的菜,那么当当前点菜数目为0、1、大于10、小于10的时候,会有怎样的输出。
    • Time:时间性,代码调用的顺序不同, 比如在login之前调用logout。代码需要调用一个很长时间才能返回的函数,超时问题。并发访问和同步对时间敏感。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
完整的中文版《单元测试之道C#版》。单元测试不但会使你的工作完成得更轻松,而且会令你的设计变得更好,甚至大大减少你花在调试上面的时间。 在我们上面的小故事里面,Pat 因为假设底层的代码是正确无误的而卷入麻烦之中,先是高层代码中使用了底层代码;然后这些高层代码又被更高层的代码所使用,如此往复。在对这些代码的行为没有任何信心的前提下,Pat 等于是在假设上面用竖立卡片堆砌了一间房子——只要将下面卡片轻轻移动,整间房子就会轰然倒塌。 当基本的底层代码不再可靠时,那么必需的改动就无法只局限在底层。虽然你可以修正底层的问题,但是这些对底层代码的修改必然会影响到高层代码,于是高层代码也连带地需要修改;以此递推,就很可能会动到更高层的代码。于是,一个对底层代码的修正,可能会导致对几乎所有代码的一连串改动,从而使修改越来越多,也越来越复杂。于是,整间由卡片堆成的房子就由此倒塌,从而使整个项目也以失败告终。 Pat 总是说:“这怎么可能呢?”或者“我实在想不明白为什么会这样”。如果你发现自己有时候也会有这种想法,那么这通常是你对自己的代码还缺乏足够信心的表现——你并不能确认哪些是工作正常的而哪些不是。 为了获得Dale 所具有的那种对代码的信心,你需要“询问”代码究竟做了什么,并检查所产生的结果是否确实和你所期望的一致。 这个简单的想法描述了单元测试的核心内涵:这个简单有效的技术就是为了令代码变得更加完美。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值