当前位置: 首页 > 图灵资讯 > 技术篇> Java开发单元测试基本原则

Java开发单元测试基本原则

来源:图灵教育
时间:2023-03-27 16:03:45

单元测试(unit testing),是指检查和验证软件中最小的可测试单元。单元测试是软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序其他部分隔离的情况下进行测试。Java单元测试也是如此,Java单元测试在软件开发中起着至关重要的作用。本文将网络上的一些大神和一些专业书籍结合起来Java开发单元测试基本原则

1.好的单元测试必须遵守 AIR 原则。

所谓的AIR原则是单元测试在线运行时,感觉像空气(AIR)同样不存在,但在保证测试质量方面至关重要。从宏观上看,好的单元测试具有自动化、独立性和可重复执行的特点。

2.单元测试应全自动进行,且非交互式。

测试用例通常定期执行,执行过程必须完全自动化才能有意义。输出结果需要人工检查的测试不是一个好的单元测试。单元测试中不允许使用 System.用assert验证out进行人肉验证是必要的。

3.保持单元测试的独立性。

为了保证单元测试的稳定性、可靠性和维护方便性,单元测试用例不得相互调用或依赖执行顺序。反例:method2 需要依赖 method1 以执行结果为执行结果 method2 的输入。

4.单元测试可重复执行,不受外部环境影响。

单元测试通常放在连续集成中,每次都有代码check 单元测试将在in时进行。如果单个测试依赖于外部环境(网络、服务、中间件等),则很容易导致不可用的持续集成机制。例子:为了不受外部环境的影响,在设计代码时需要使用代码 SUT 在测试过程中,将依赖改为注入spring这样的 将DI框架注入本地(内存)实现或实现 Mock 实现。

5.对于单元测试,确保测试粒度足够小,有助于准确定位问题。

单个测量粒度最多是一个类别级别,通常是一个方法级别。注:只有当测试粒度较小时,才能尽快定位到错误的位置。单个测试不负责检查跨类别或跨系统的交互逻辑,这是集成测试的领域。

6.核心业务、核心应用和核心模块的增量代码确保单元测试通过。

说明:及时补充新代码的单元测试。如果新代码影响原单元测试,请及时修改。

7.单元测试代码必须写在以下工程目录中:src/test/java,不允许写在业务代码目录下。

本目录将跳过源代码编译,默认情况下,单元测试框架将扫描此目录。

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

在工程规定的应用分层中提到DAO层,Manager层,可重用性高 Service,应进行单元测试。

9.编写符合BCDE原则的单元测试代码,以确保被测模块的交付质量。

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

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

D:Design,将单元测试与设计文档相结合。

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

10.对于数据库相关的查询、更新、删除等操作,不能假设数据库中的数据存在,或直接操作数据库插入数据,请使用程序插入或导入数据准备数据。

反例:删除一行数据的单元测试,在数据库中,直接手动添加一行作为删除目标,但该行新数据不符合业务插入规则,导致测试结果异常。

11.与数据库相关的单元测试可以设置自动回滚机制,不会对数据库造成脏数据。或者对单元测试产生的数据有明确的前后缀标志。

比如在企业智能事业部内部单元测试中使用 ENTERPRISE_INTELLIGENCE _UNIT_TEST_前缀用于识别单元测试相关代码。

12.在适当的时候对不可测代码进行必要的重构,使代码可测,避免为满足测试要求而编写不规范的测试代码。

13.在设计评审阶段,开发人员需要与测试人员一起确定单元测试范围,单元测试最好覆盖所有测试用例。

14.单元测试作为一种质量保证手段,在项目提前完成单元测试,不建议在项目发布后补充单元测试用例。

15.为便于单元测试,业务代码应避免以下情况:

在构造方法上做的事情太多了。

全局变量和静态方法过多。

外部依赖过多。

条件句太多。

注:建议通过卫语句、战略模式、状态模式等方式重构多层条件句。

上面的Java单元测试经验总结也是捡人牙慧的结果,是很多从事测试行业的前辈总结出来的结果,为我们后来者的测试工作完成了大部分扫雷工作。如果我们能进入测试行业,我们不仅要感谢他们,还要更严格地进行单元测试!