依赖于数据库视图的集成测试
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
,因此它不必在系统之间更改,您只需独立部署两个不同版本的功能。
【讨论】:
以上是关于依赖于数据库视图的集成测试的主要内容,如果未能解决你的问题,请参考以下文章