今天看啥  ›  专栏  ›  寻找无名的特质

EF单元测试中内存数据库的局限性

寻找无名的特质  · 简书  ·  · 2019-08-20 09:21

相比其它架构而言,EF的优势之一就是可以使用内存数据库进行单元测试,DbContext可以适用于单元测试的内存数据库,这样可以大大提高开发的效率。然而,在开发时必须注意,使用内存数据库进行测试是有一定的局限性的,一方便,某些针对关系数据库的功能不支持,导致某些功能无法进行单元测试,另一方面,某些功能单元测试可能通过,但到了真实数据库中可能会有问题。这里说明使用Effort和Sqlite的限制。

我们常用的是使用Effort内存数据库的,这个内存数据库不是真正的关系数据库,因此对于Sql查询是不支持的,比如如果调用DataBase.SqlQuery<T>,就会出错。有关针对数据库的复杂查询,不能使用Effort进行测试。

还有一种选择是使用Sqlite进行单元测试,Sqlite可以配置为在内存中运行,并且Sqlite是真正的关系数据库,因此更接近于真实的数据库。但使用Sqlite进行单元测试比较复杂,首先,Sqlite不支持运行时创建数据库,这就需要额外的工作创建测试用的数据库生成脚本,如果数据库中的表比较多,工作量还是比较大的。还有一个问题,是Sqlite的内存数据库是随着数据连接存在的,如果数据连接关闭,数据库就被注销,这个问题也需要编写额外的代码进行处理。

总之,在进行单元测试时,需要注意测试环境数据库与真实环境数据库的区别,在项目中预留真实环境测试的时间,并且需要制订在真实环境进行测试的计划。




原文地址:访问原文地址
快照地址: 访问文章快照