敏捷开发里有保障代码质量的两个重要技术,一个是代码重构,另一个是单元测试。单元测试之所以重要,是因为在单元测试的加持下,可以降低回归测试的难度以及提高开发人员的信心。
前提条件
- 业务代码必须对单元测试友好。
- 单元测试必须尽量避免依赖外部服务。
Spring上下文
因为应用依赖的自动配置通常会用到很多外部服务,所以通过 XML 方式配置 Spring 上下文。
springContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!-- 配置自动扫描的包 -->
<context:component-scan base-package="xxxx">
</context:component-scan>
<!-- TODO 配置依赖的bean -->
</beans>
编写单元测试代码
@Transactional(rollbackFor = Exception.class)
@ContextConfiguration(locations = "classpath:/xxxx/springContext.xml")
public class BeanTestContext {
}
@RunWith(SpringRunner.class)
public class XXXXTest extends BeanTestContext {
@Test
public void test() {
// TODO
}
}
数据库测试数据
可以通过 Liquibase 初始测试数据到单元测试专用的数据库,其中 TestDataTaskChange 是用来加载测试数据的自定义类,相关实现可以参考开源项目 MoLiHua 的 jasmine-framework-test 模块。
实践经验
- 设计的单元测试框架必须对开发人员简便。
- 单元测试用例跟源代码一样都需要持续维护。
参考代码
可以参考开源项目 MoLiHua 的单元测试方案。