JAVA 2022 年 12 月 1 日
单元测试初试
总结使用单元测试的方式,对比他们之间的优劣。
单元测试
目前了解到的几种方式:
junit
单纯使用junit,启动时相当于启动项目,配置与数据库和开发时都是保持一致的。
junit+mockito
使用mockito把一些其他模块的类进行mock,不用启动spring项目,缺点是没有数据库,对于业务代码很难写测试代码,因为主要是对业务数据进行操作,没有数据库的话数据不好准备和验证。
junit+mockito+h2
使用mockito把一些其他模块的类进行moc,使用内存数据库h2替换掉开发时的数据库,启动时会启动Spring项目,但是配置是单独的。
测试基类:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = BaseDbUnitTest.Application.class)
@MapperScan(value = "com.talkweb.bigdata.security", annotationClass = Mapper.class,
lazyInitialization = "true")
@Sql(scripts = "/sql/clean.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) // 每个单元测试结束后,清理 DB
public class BaseDbUnitTest {
@Import({
// DB 配置类
DataSourceAutoConfiguration.class, // Spring DB 自动配置类
DataSourceTransactionManagerAutoConfiguration.class, // Spring 事务自动配置类
DruidDataSourceAutoConfigure.class, // Druid 自动配置类
SqlInitializationTestConfiguration.class, // SQL 初始化
// MyBatis 配置类
MybatisPlusAutoConfiguration.class, // MyBatis 的自动配置类
})
public static class Application {
}
} 测试application.yml配置:
spring:
main:
lazy-initialization: true # 开启懒加载,加快速度
banner-mode: off # 单元测试,禁用 Banner
--- #################### 数据库相关配置 ####################
spring:
# 数据源配置项
datasource:
name: unit-test
url: jdbc:h2:mem:testdb;MODE=MYSQL;DATABASE_TO_UPPER=false; # MODE 使用 MySQL 模式;DATABASE_TO_UPPER 配置表和字段使用小写
driver-class-name: org.h2.Driver
username: sa
password:
druid:
async-init: true # 单元测试,异步初始化 Druid 连接池,提升启动速度
initial-size: 1 # 单元测试,配置为 1,提升启动速度
sql:
init:
schema-locations: classpath:/sql/create_tables.sql
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
redis:
host: 127.0.0.1 # 地址
port: 16379 # 端口(单元测试,使用 16379 端口)
database: 0 # 数据库索引
mybatis:
lazy-initialization: true # 单元测试,设置 MyBatis Mapper 延迟加载,加速每个单元测试 总结
比较麻烦的主要是怎么准备数据,因为业务流程主要是对数据进行操作。单元测试需要验证测试结果,就需要准备初始数据,调用测试方法,再验证数据是否正确。麻烦的地方就在于准备初始数据和对处理之后的数据进行验证。
版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
作者: OnlyWaitY 发表日期:2022 年 12 月 1 日