依赖于数据库视图的集成测试

Posted

技术标签:

【中文标题】依赖于数据库视图的集成测试【英文标题】:Integration Test Dependent upon a Database View 【发布时间】:2019-03-15 14:25:43 【问题描述】:

生产环境使用 SQL Server,集成测试使用 H2 数据库。我们使用连接多个数据库列的数据库视图,其中一些使用STUFF 函数在视图中创建它们的字段值。生产环境的数据库表由 Flyway 脚本创建,而用于集成测试的表要么由 Hibernate 自动生成,要么在测试之前使用@SQL 注解通过 SQL 脚本创建。 STUFF函数在H2方言中不可用,因此运行测试类时无法生成视图。

以前的解决方案尝试

    ;MODE=MSSQLServer 添加到为测试应用程序配置文件指定的属性中的databaseUrl 属性中。 通过 ALIAS 定义一个虚拟函数,该函数将充当集成测试的 STUFF 函数。

这些尝试都没有奏效。

问题:如何为 H2 数据库创建这样的视图?

背景信息:使用此视图以编程方式重新索引 Elasticsearch 索引。测试类在视图中连接的适当表中设置数据,并测试 Elasticsearch 索引的数据处理。

【问题讨论】:

【参考方案1】:

STUFF() 只是更复杂表达式的简写。这些产生相同的结果:

DECLARE 
  @expr  varchar(64) = 'hello there',
  @start int = 6,
  @chars int = 4,
  @repl  varchar(64) = 'bye';

SELECT STUFF(@expr,@start,@chars,@repl);

SELECT LEFT(@expr,@start-1) + @repl + SUBSTRING(@expr, @start + @chars, 64);

忽略对 1 个字符的字符串和其他边缘情况(如超过 10 亿个字符的字符串)的错误处理,您可以创建一个为您抽象 STUFF() 的函数。在 SQL Server 系统上,函数是:

CREATE FUNCTION dbo.StuffForMe
(
  @expr nvarchar(max),
  @start int,
  @chars int,
  @repl nvarchar(max)
)
RETURNS nvarchar(max)
WITH SCHEMABINDING
AS
BEGIN
  RETURN (SELECT STUFF(@expr,@start,@chars,@repl));
END
GO

在 H2 上:

CREATE FUNCTION dbo.StuffForMe
(
  @expr nvarchar(max),
  @start int,
  @chars int,
  @repl nvarchar(max)
)
RETURNS nvarchar(max)
WITH SCHEMABINDING
AS
BEGIN
  RETURN (SELECT LEFT(@expr,@start-1) + @repl 
    + SUBSTRING(@expr, @start + @chars, 1000000000));
END
GO

然后您的视图只引用dbo.StuffForMe,因此它不必在系统之间更改,您只需独立部署两个不同版本的功能。

【讨论】:

以上是关于依赖于数据库视图的集成测试的主要内容,如果未能解决你的问题,请参考以下文章

Zend Framework 1 - 如何在功能集成测试中重置视图数据,而不是会话数据?

Android 开源框架

SQL实战新手入门:删除视图

如何查询 BigQuery 视图和表的依赖关系?

查找表或视图的依赖对象

iOS:在自定义视图中添加新约束依赖于视图的框架