单元测试标准
本文介绍单元测试标准
说明:在Macula开发平台下,单元测试用例使用JUnit编写,使用的JUnit版本为4.8.1以上,即可通过Annotation的方式标识测试用例。
对单元测试的编写以及使用,在符合代码规范以及审计规范的前提下,针对测试用例,需要遵循一些额外的标准。
单元测试类命名规范
测试类命名规范
测试类的命名规则为被测试的类名+Test,其测试类应放在src/test/java目录下,其包名为被测试包下建立的test子包。
对于一些模块的测试,也在在模块下创建模块级的test子包,并将测试类放入该子包中。
测试用例命名规范
测试用例的命名规则为test+用例方法名称,比如要测试的方法命名为findUserByName,那么测试用例的命名则为testFindUserByName, 其命名规则符合Java方法的命名规则。
对测试用例,需要加入@Test注解,用来标识该方法为一个测试用例。
其他命名规范
对单元测试类中,编写的辅助性属性或方法,遵循Java开发的命名规则。
单元测试数据规范
在单元测试中使用的数据,需要具有典型性和边界性等多种数据的测试。
当前系统绝大多数为基于数据库系统的管理系统,在数据的准备上,如果能使用HSQL等内存式数据库的情况下,尽量使用内存式数据库,同时在测试用例的@Before和@After标注的方法中,初始化数据和销毁数据。
在构建所测试数据较为复杂的情况下,可使用公用的实体测试数据库,但需要遵循下列原则:
- 其测试用例必须能保证可重复运行均能通过。
- 测试用例尽量标识在测试结束后回滚事务,以确保测试用例不会真实修改数据库数据。
- 对不能实现事务回滚或因测试需要改变数据库数据的,尽量在单元测试完成后,通过@After等手段,恢复修改的数据到原始状态。
- 对无法实现事务回滚且不能恢复到原始状态的数据,其测试导致的数据变化不影响其他测试用例。
- 对测试变化后的数据,需要在测试代码中校验是否符合预期,而不是通过查看数据库的方式校验。
单元测试最小化原则
单元测试其重复执行的频率较大,特别是在项目持续集成情况下,单元将会多次执行。为了加快单元测试速度,以及其他相关类对本单元测试的影响,单元测试需要遵循最小化原则。
- 单元测试使用的Spring容器可单独编写,可以只载入本测试用例用到的Bean实例。
- 单元测试的测试用例粒度尽可能小,以增强单元测试的强度。
- 对于简单的Java类,不需要编写意义不大的测试用例。
- 单元测试应具备一定的典型性、边界性等,但如果编写一个完善的单元测试超出了业务需要,可根据业务实际情况选择单元测试数据。
- 不可人为为了通过单元测试,而特意构造数据。
单元测试粒度
为了在单元测试覆盖率与项目进度、测试用例复杂度之间平衡,对单元测试的粒度做如下规定:
- 服务层的public方法必须编写单元测试,protected和private方法可不编写测试用例。
- 复杂的存取层需要单独编写测试用例,而不得借用服务层的间接测试的办法。
- 对工具类、助手类要编写严格的单元测试,因其使用面广,其测试数据范围需要加大。
- 对简单的值对象、简单的get/set方法,不需要提供测试用例。