一切依赖于第三方环境和服务的测试都不能叫做单元测试
单元测试的粒度
单元测试的是围绕着一个单点的功能来展开的,如果加入其他依赖因素,就会对单元测试的结果造成干扰,所以单元测试一定要把依赖因素给排除掉。
如何消除依赖
- 组件本地化实现
这种情况常见于数据库和中间件的依赖。比如dao层单元测试,要验证MysqL的sql语句的执行情况,那就不能直接使用测试环境的数据库来作为单测的基础设施,毕竟测试环境容易有垃圾数据、环境不稳定等情况会影响测试的结果。这时候就要借助一些本地的数据库实现,比如h2内存数据库,支持标准 sql,JDBC API,性能优良的数据库引擎,这样在测试中引入h2就可以消除对测试环境的依赖,而且测试用例的执行速度更快。
其他比如mongodb、kafka、mq等的单元测试与之类似,都是要采用本地化的实现。 - 模拟依赖服务
就是利用一些mock框架,模拟服务的行为和数据,单测的粒度决定我们只关心某一点,至于依赖的服务如何,要在集成测试里去测,故mock依赖的情况下默认所依赖的服务都是没有问题的,只关心被测试代码的逻辑。
mock其实就是创建一个模拟的对象,来代替真实的对象,这样我们就可以指定mock对象的行为,比如返回什么样的数据,执行什么样的动作,也可以验证mock对应的某个方法有没有调用、调用了多少次等。
dao层单元测试依赖消除
dao层无外乎就是增删改查,既要验证操作能否正常执行,也要验证数据是否符合预期,所以这一层的测试不能使用mock,否则无法达到单测的目的,没有意义。dao层的测试依赖要采用组件本地化的形式实现,比如用h2内存数据库来代替实际上测试环境中的MysqL。
service层单元测试依赖消除
service层的依赖适宜使用mock框架,来模拟所依赖服务的行为和数据。比如某个服务依赖于用户中心的用户信息接口,那我们就可以模拟该接口的返回数据来验证不同场景的逻辑。
更多内容欢迎关注个人微信公众号,一起成长!