单元测试到底作用大不大?
单元测试有必要吗?整个开发环节中,越晚发现问题解决问题的成本就越高。单元测试的意义就在于提前发现问题,减少开发和测试的成本。
从测试覆盖率来说,测试金字塔越往上执行的测试,可覆盖case会逐渐变下,比如UI测试只能保证页面正常,接口异常不会测试覆盖完整。接口覆盖完整了,又不能保证代码中所有逻辑都覆盖,某些函数某些类的功能无法覆盖,这样情况下发现的问题都是不好复现的bug。
有时候上层代码的单元测试难写,有没有一种可能是代码写的太烂了?
在《快速软件开发》的书中引用了大量的研究数据指出,最后才修改一个bug的代价是在bug产生时候修改它代价的10倍。
应该在什么情况下写单元测试?
1.新的功能开发:在开发新功能时,编写单元测试可以帮助确保新功能的正确性。
2.修改现有代码:在修改现有代码时,编写单元测试可以确保修改对其它部分代码没有影响。
3.重构代码:在重构代码时,编写单元测试可以确保重构后的代码仍然能够按预期工作。
4.维护代码:为长期维护的代码编写单元测试,可以帮助保证代码的可靠性和稳定性。
5.多人协作开发:在多人协作开发中,单元测试能够提供一种确保代码正确性的有效方法,并且可以降低团队开发过程中的沟通成本。
单元测试的主要目的是提高代码的质量,确保代码在维护和更改过程中仍能按预期工作。在所有需要维护和开发的项目中都可以使用单元测试,项目规模不同时编写的单元测试数量也不同。
单元测试的原则
·单一责任原则:每个测试用例只测试一个功能,避免混杂多个功能的测试
· 快速执行原则:单元测试应该非常快,方便经常运行,避免因测试时间过长而导致开发人员不愿意运行测试
· 独立运行原则:单元测试应该独立运行,不应该相互依赖。每个测试都应该是可重复且独立的。
· 可重复性原则:单元测试应该具有可重复性,每次运行都应该产生相同的结果。
· 代码覆盖原则:单元测试应该覆盖每一个函数和代码路径,确保每一个函数都被测试了。
· 自动化原则:单元测试应该自动化,并且应该能够在每次代码提交后自动运行,确保不会因为遗漏而导致重大缺陷。
主流框架JUnit和TestNG
JUnit是Java的单元测试框架,用于编写和运行可重复的测试,特性:
· 用于测试期望结果的断言(Assertion)
· 用于共享共同测试数据的测试工具
· 用于方便的组织和运行测试的测试套件
· 图形和文本的测试运行器
TestNG是一个测试框架,引入了一些新功能,TestNG 消除了大部分的旧框架的限制,使开发人员能够编写更加灵活和强大的测试。 因为它在很大程度上借鉴了Java注解( JDK5.0 引入的)来定义测试,它也可以显示如何使用这个新功能在真实的Java语言生产环境中。
特点如下:
· 注解
· TestNG 使用 Java 和面向对象的功能
· 支持综合类测试(例如,默认情况下,不用创建一个新的测试每个测试方法的类的实例)
· 独立的编译时测试代码和运行时配置/数据信息
· 灵活的运行时配置
· 主要介绍“测试组”。当编译测试,只要要求 TestNG 运行所有的“前端”的测试,或“快”,“慢”,“数据库”等
· 支持依赖测试方法,并行测试,负载测试,局部故障
· 灵活的插件 API
· 支持多线程测试
页:
[1]