单元测试框架深入(三):单元测试最佳实践

205 阅读2分钟

一、单元测试的原则

1、如何处理单元测试与集成测试的关系?

建议把单元测试和集成测试利用Surefire插件和Failsafe插件分开执行,单元测试类名以“Test”结尾,集成测试类名以“IT”结尾;

单元测试的测试粒度要足够小,至多是类级别,一般是方法级别,方便精确定位问题;

集成测试负责跨类或者跨系统交互逻辑的测试,通常需要依赖外界环境,耗时通常会比较多。

2、单元测试应该覆盖哪些类?

单元测试的基本目标:语句覆盖率达到 70%,核心模块的语句覆盖率和分支覆盖率都要达到 100%;

核心模块一般是复用度比较高的偏底层的部分,包括数据库访问层、外部接口调用层和业务层中重用度高的部分等。

对于单元测试未覆盖到的类,可以通过集成测试来补充。

3、单元测试应该覆盖哪些场景?

【推荐】编写单元测试代码遵守 BCDE 原则,以保证被测试模块的交付质量。

 B: Border,边界值测试,包括循环边界、特殊取值、特殊时间点、数据顺序等。

 C: Correct,正确的输入,并得到预期的结果。

 D: Design,与设计文档相结合,来编写单元测试。

 E: Error,强制错误信息输入(如:非法数据、异常流程、非业务允许输入等),并得

到预期的结果。

  1. 被测代码依赖外界环境怎么办?

单元测试不应该受到外界环境影响,用mock隔离依赖;集成测试尽可能用真实的环境,必要时也可以用mock。

二、开源项目中的单元测试

Apollo:github.com/ctripcorp/a…

Netty:github.com/netty/netty

Dubbo:github.com/apache/dubb…

Californium:github.com/eclipse/cal…

Jetty:github.com/eclipse/jet…

三、在持续集成系统中运行单元测试

1、指定apollo配置信息:读取开发环境Apollo

这里通过配置属性让Surefire插件同时运行单元测试用例和集成测试用例。

  1. 授权打包机器访问测试环境数据库

用户名和密码要跟开发环境Apollo中配置的保持一致。

3、添加“单元测试”任务到流水线

默认只读取和展示父模块的测试报告,不遍历和汇总子模块的测试报告。这里指定读取和展示API模块的测试报告。

参考

《阿里巴巴Java开发手册(终极版)》

dzone.com/refcardz/mo…