1、什么是单元测试?
顾名思义单元测试就是对软件系统中最小的单元(函数、类)做测试,类似焊接电路板前对每个电容器(电子元器件)的测试。从软件测试分级来看,单元测试是最底层也是离程序员最近的一层,一般由开发人员负责完成,是软件质量最基础的保证。当然单元测试的最终受益者也还是程序员,坚持编写单元测试代码不但可以提高程序质量减少 BUG,还可以辅助其他程序员阅读已有代码,提升开发效率等等。
2、为什么我们都不够重视单元测试?
我相信每一个负责任的程序员都是非常重视单元测试的。当我们在新加、修改了某一个功能或某一段代码后一般都会调试和自测,拿 Web 后台开发来说,每个接口肯定都是开发人员在本机上调试过的(一般喜欢用 post 工具),然而我们不重视的是什么呢?是对这种自测流程的固化。
试想某天你接到一个新需求:要新增一个功能 A,需要用到公共服务 F,分析/构思、编码、编译/构建/部署、调试/自测一顿行云流水的操作后我们提测并顺利上线了。一段时间后公共服务 F 修改了实现逻辑,通知你可能需要做相应的修改.....什么?A 里面可是有 100 个接口用到了 F,难道我要一个一个去检查哪些被影响到了吗?..emm....是的,真的要一个一个检查,这个时候我们就要想了有没有什么自动化测试的工具能够一遍就帮我们检查完呢?有的:编写单元测试代码。
那么是什么原因引起我们不够重视单元测试呢?首先是公司的价值导向,是以业务支撑为主要 KPI 还是以交付质量等决定了项目经理、架构师以至程序员愿意为单元测试付出的精力和时间;其次是项目性质,相对后台项目来讲前台项目确实是不容易实现单元测试;还有就是需求的重要程度和开发周期也决定了程序员是否愿意花更多额外的时间去编写测试代码。
3、车险项目单元测试
不同的编程语言有不同的 UT 框架,拿 Java 来说,主要有 JUnit 和 TestNG 两大框架,同时也有很多的 Mock 和辅助工具。
在车险项目中,单元测试框架我们选型了 JUnit 配合 spring-test,Mock 框架采用了 Mockito,同时数据库采用了 H2 嵌入式数据库,以及 jsonassert 和 json-path 等工具包。
单元测试的原则:所有的核心代码都必须编写单元测试
据说楼上的 Accenture 某些项目要求单元测试的行覆盖率达到 99%,分支覆盖率达到 90%
4、一些常见问题
1)mockMvc.perform 时 filter 不起作用,导致程序获取不到模拟的登陆 session
l 增加 HandlerInterceptorAdapter,在 preHandle 中手动调用 web.xml 中配置的 filter。
l 后面发现 AbstractMockMvcBuilder 提供了配置 filter 的 API,直接添加就可了。
Mockito 未去代理时无法 mock 的问题
Mockito 主线程结束时,子线程被终止
(异步接口不起作用)
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于