单元测试之道

单元测试的好处是众所周知的, 它可以提早发现bug, 提高开发过程中的项目质量, 完善代码的设计等. 所以大部分人是认同单元测试的作用, 也都同意它的必要性. 但是真正在实施或落地单元测试的时候又会有各种各样的阻力.理由也是多种多样的, 例如费时, 测试代码不是我的工作, 代码能编译通过为什么还要写单元测试等.

  1. 费时

    这应该是绝大多数人不做单元测试的理由, 很多人认为测试的工作是提测之后才开始的工作.其实正确得做单元测试是可以达到节省时间的目的, 虽然花了一些时间在编写和维护测试代码上, 但是考虑平时debug时间, 定位bug时间和测试同事沟通bug时间, 甚至是改了老bug出现新bug的情况, 综合这些因素做单元测试可以在保证质量的基础之上节省开发的时间, 并且能够提高对自己代码的信心.

  2. 测试不是我的工作

    虽然测试不是开发的工作, 但是当开发放出很难维护有Bug的功能给测试后, 到项目验收期间所消耗的时间和经历得不偿失. 开发应当把高质量的输出作为自己的责任. 而不是自顾自的堆代码.

  3. 代码能够编译通过

    这是一个很拙略的借口, 代码编译通过只能验证语法是否正确, 并不能保证程序的行为是否正确.

单元测试实施起来之后应该作为项目质量的基石, 稳定的基石才能确保项目从下层到上层乃至真个项目的稳定.

单元测试的职责

单元测试的核心思想是验证代码的行为和预期一致, 并且测试代码应该很简洁清晰的, 不管性能上差些或者行为上啰嗦一些也要让他具有良好的可读性.写单元测试时跟自己的代码进行如下交互.

  1. 它的行为和我的期望一致吗?
  2. 它的行为一直和我的期望一致吗? (多路径, 多条件覆盖)
  3. 单元测试也是文档.

单元测试的流程

如何设计单元测试的流程? 从比较高纬度看单元测试必须包含以下四个流程.

  1. 准备测试所需要的各种条件, 例如创建出必要的对象, 资源模拟环境等.
  2. 调用要测试的方法.
  3. 验证被测试方法的行为并和期望对比
  4. 释放各种资源

验证测试结果

如何通过验证测试结果来挖掘bug? 可以从下面几个角度, 特别是边界条件来探测代码是否有bug.

  1. Right 运行结果是否正确
  2. Boundary 是否所有的边界条件都正确

    大多数的Bug都是出现在边界条件附近, 可以通过CORRECT辅助测试边界条件.

    • Conformance 一致性. 验证期望与结果是否一致.
    • Ordering 有序性. 如果数据是有序的则可以通过乱序反序等条件试探边界.
    • Range 区间性. 数据本身属性的区间比实际需要的更加宽广时, 验证越界情况.
    • Reference 引用依赖性. 在代码有引用或依赖外部状态时相当于前条件, 检测代码在外部状态异常情况下的准确性.以及代码运行后产生的间接结果即后条件是否正常.
    • Existence 存在性. 当网络, 文件, 硬件设备等环境的任何事物不存在时, 要测试这种不存在的情况.(没有get到跟Reference的区别)
    • Cardinality
    • Time
  3. Inverse 反向关联

  4. Cross-check 交叉检查结果
  5. Error 是否可以强制触发错误条件
  6. Performance 是否满足性能要求

验证Bug修复流程

发现Bug之后修复Bug的流程

  1. 发现bug
  2. 编写一个失败的测试用例证明bug的存在
  3. 修正bug, 并通过测试
  4. 验证所有的测试都能通过

单元测试陷阱

单元测试应该是让开发的工作更加轻松, 但是如果使用不当也会浪费大量的时间, 会花费更多的时间在维护和调试测试代码上, 进而影响整个项目的开发周期. 为了避免这些问题发生, 可以在做测试时遵循一些简单的规则, 缩写是A-PTRIP.

  1. Automatic 自动化. 单元测试调用和检验结果的自动化
  2. Thorough 彻底的. 根据场景尽可能覆盖更深更广的单元测试, 通常情况下单元测试的数量和问题数量成反比.
  3. Repeatable 可重复. 基于独立性确保测试能够以任意顺序重复得执行, 并且结果应该保持一致.
  4. Independent 独立的. 测试应该是简洁精炼的, 应该有很强的针对性, 能够独立于环境和其他的测试.
  5. Professional 专业的. 测试代码也要准守基本的规则, 维护封装解耦等.

Pragmatic Unit Testing in Java with JUnit

单元测试之道Java版


转载请注明出处:http://blog.csdn.net/l2show/article/details/71259203

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
完整的中文版《单元测试之道C#版》。单元测试不但会使你的工作完成得更轻松,而且会令你的设计变得更好,甚至大大减少你花在调试上面的时间。 在我们上面的小故事里面,Pat 因为假设底层的代码是正确无误的而卷入麻烦之中,先是高层代码中使用了底层代码;然后这些高层代码又被更高层的代码所使用,如此往复。在对这些代码的行为没有任何信心的前提下,Pat 等于是在假设上面用竖立卡片堆砌了一间房子——只要将下面卡片轻轻移动,整间房子就会轰然倒塌。 当基本的底层代码不再可靠时,那么必需的改动就无法只局限在底层。虽然你可以修正底层的问题,但是这些对底层代码的修改必然会影响到高层代码,于是高层代码也连带地需要修改;以此递推,就很可能会动到更高层的代码。于是,一个对底层代码的修正,可能会导致对几乎所有代码的一连串改动,从而使修改越来越多,也越来越复杂。于是,整间由卡片堆成的房子就由此倒塌,从而使整个项目也以失败告终。 Pat 总是说:“这怎么可能呢?”或者“我实在想不明白为什么会这样”。如果你发现自己有时候也会有这种想法,那么这通常是你对自己的代码还缺乏足够信心的表现——你并不能确认哪些是工作正常的而哪些不是。 为了获得Dale 所具有的那种对代码的信心,你需要“询问”代码究竟做了什么,并检查所产生的结果是否确实和你所期望的一致。 这个简单的想法描述了单元测试的核心内涵:这个简单有效的技术就是为了令代码变得更加完美。
Google软件测试之道是一本非常受欢迎的软件测试指南,其原文名为《Google's Testing on the Toilet》。这本指南由Google工程师撰写,旨在帮助软件测试人员提高他们的技能和知识。 这本指南通过简洁明了的短文和插图的形式呈现,使得读者可以轻松理解和掌握其中的内容。这些短文通常打印在洗手间的墙上,因此得名“Testing on the Toilet”。这种独特的传播方式确保了更多的人可以接触到这些知识,并促使他们在进行生活琐事的同时也能够学到一些新的技术。 这本指南介绍了许多软件测试的基础概念和技巧,如单元测试、集成测试、自动化测试等。它还涵盖了测试策略、Bug管理和持续集成等领域的内容。这些知识不仅适用于谷歌内部的测试团队,也对其他软件开发组织的测试人员具有很大的参考价值。 《Google's Testing on the Toilet》强调了测试的重要性和高效性。它告诉读者通过合理的测试方法和技术可以有效减少软件缺陷和Bug的数量,提高软件质量。它还推崇了持续学习和不断探索新技术的态度,鼓励测试人员积极参与到软件开发的早期阶段,以便更好地发现和解决问题。 总之,《Google's Testing on the Toilet》是一本非常实用的软件测试指南,它以简洁明了的书写方式展示了许多测试的最佳实践。通过学习和应用其中的知识,测试人员可以提高他们的技能水平,更好地为团队和产品提供稳定和高质量的软件。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值