以 Spring 项目为例,谈下自己对单元测试具体实践的理解,还不知道对不对,希望大家结合下自己经验指点下。
由于 Web 项目一般分层是:dao,service 和 controller。相应 UT 也映射这种结构,具体为:
- dao:验证 sql 的正确性。这里我看 github 上那个样例库是做了事务的验证,但事务不应该是在服务层吗?所以我觉得事务的验证是看你在哪一层做的。为了将 UT 和外系统解藕(应用和数据库视作不同系统),数据使用 in-memory DB (如:h2 ),这样能保证测试的独立性和高效。至于 in-memory DB 和实际数据库的行为差异,能否理解为默认被 JDBC 屏蔽了?即视作没有差异。
- service:验证业务逻辑。为了将不同分层间的隔离(提高效率),用 Mock 框架来模拟 dao 层,以使 dao 和 service 解藕。
- controller:主要验证参数验证,路由处理,和返回字段的准确性。
每层的验证都是基于下层验证的正确性,并仅专注于本层的测试,每层之间通过 mock 框架来解藕。
参考链接:
有赞分层自动化测试实践
A Github demo repo
Spring Boot Testing