首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TSQLT测试运行超时

TSQLT测试运行超时
EN

Stack Overflow用户
提问于 2017-08-17 20:59:18
回答 2查看 432关注 0票数 1

最近,我开始通过Redgate的SQL使用TSQLT来创建和运行单元测试。不过,我遇到了一个问题。需要超过几分钟执行的单元测试将超时,从而停止所有其他单元测试的执行。

如何延长tSQLt的超时时间?

我的“单元测试”可能实际上不是单元测试,但我不熟悉另一种更适合的测试方法。

我正在进行一个项目,以提高数据仓库夜间刷新的速度。目前,这一过程需要5个小时。通过重新安排任务,在可能的情况下并行运行,我把时间缩短到了两个小时。我的问题是,除非我能够找到一种方法来证明新流程具有与旧流程完全相同的结果,否则QA将在下一年检查每个表中每一行中的每一列中的每个值。无论是这样还是这个项目都会因为“太难”而被取消。

所以我想出的测试是这样的:我有一个数据库,在使用我创建的新方法在测试环境中处理结果表之后,运行一个脚本来复制结果表。然后,回到测试环境中,我运行旧的进程来更新表。然后,我在每个表中运行一个单元测试,以证明使用新方法处理的归档表的内容与使用旧方法重新处理的表的内容完全相同。

不幸的是,由于其中一些表(数百万行)的大小,一些单元测试正在超时。以下是我所收到的错误:

测试过程: HR360_unitTest1.HR360_DW_Job6.test fact_group_clients在emr\preprod System.Data.SqlClient.SqlException (0x80131904)上的相同内容:超时过期。在操作完成或服务器没有响应之前经过的超时时间。( System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior,RunBehavior runBehavior,布尔returnStream,布尔异步,Int32超时值,任务和任务,布尔asyncWrite,SqlDataReader ds,布尔describeParameterEncryptionRequest) at cmdBehavior cmdBehavior,RunBehavior runBehavior,Boolean,String method,TaskCompletionSource1 completion, Int32 timeout, Task& task, Boolean asyncWrite) at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource1 completion,String methodName,Boolean,timeout,( System.Data.SqlClient.SqlCommand.ExecuteNonQuery() at RedGate.SQLTest.tSQLt.FrameworkWrapper.#kz(SqlCommand #LGj) ( RedGate.SQLTest.tSQLt.FrameworkWrapper.#7qHc(String #2xAd,SqlParameter[] #LvPb) ( RedGate.SQLTest.tSQLt.FrameworkWrapper.#qd4b(String #LGxc) ( RedGate.SQLTest.tSQLt.TestRunner.Execute(SqlConnection连接) ClientConnectionId:519569ed-03ce-4510-b226-9ff18e0f1d8d错误号:-2,状态:0,类:11

如果无法增加tSQLt的超时,那么我将不得不找到另一种方法来自动测试这些表的内容是否相同(以一种可以随意重复的方式),或者放弃该项目。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-23 16:22:07

超时问题被证明是在Redgate SQL Test中。因此,长期运行的单元测试的简单解决方案是通过调用tSQLt框架直接在tSQLt.Run框架中运行它们。在我的测试中,tSQLt似乎没有超时问题。在本文撰写之时,我有一个单元测试,它连续运行了19个小时,没有超时。

这个单元测试需要很长时间才能运行,在我的特殊情况下会产生它自己的问题。我将使用散列解决方案或除其他解决方案来解决此问题,如@datacentricity响应中所讨论的那样。

票数 1
EN

Stack Overflow用户

发布于 2017-08-18 07:19:41

对于这种测试,tSQLt可能不是我的首选,它是专为单元测试而设计的,而且完全是在单元测试中进行的--小的、通常是快速的代码小部分测试。您可以查看类似于DbFit的内容,但这也会使数据量难以满足。

如果您真的必须证明每个表上每一行的每一列都是相同的,那么我将考虑在两个数据库中的每个表上创建一个MD5哈希列,然后查询每个表中不匹配的行。在构建散列值时,需要排除两个表(例如标识值、加载日期/时间等)中无法保证的任何列。例如:

--! Create our existing table structures create table dbo.ExistingCustomer ( CustomerId int not null identity(1,1) primary key , LastName varchar(50) not null , FirstName varchar(50) not null , MiddleName varchar(50) null , TownOfBirth varchar(50) null , DateOfBirth datetime not null , NumberOfDependents int not null , EtlCreatedOn datetime not null ) go

--! Add a computed column that concatenates all columns of interest --! into a single string, handling NULL's in the process, then creates --! 32 characater MD5 hash over the whole string alter table dbo.ExistingCustomer add DeltaHash as convert(nvarchar(32), hashbytes('MD4' , convert(nvarchar(max) --! Even though you might reasonably expect first and last names ot be populated, --! always code defensively has hashing over a series of empty strings will give --! less confident results , coalesce(nullif(LastName, ''), 'LastName') + coalesce(nullif(FirstName, ''), 'FirstName') --! This pattern is also effective for nullable columns + coalesce(nullif(MiddleName, ''), 'MiddleName') + coalesce(convert(char(24), TownOfBirth, 121), 'TownOfBirth') + coalesce(cast(NumberOfDependents as varchar(32)), 'NumberOfDependents')) collate Latin1_General_CI_AS), 2) persisted go

在构建这个散列时,您需要非常小心排序(在两个数据库之间,甚至在列级别)和空格。假设一行中有四个整数列,所有这些列都是空栏、一列。如果仅用空字符串替换null,则无论第二列还是第三列包含有效整数,MD5散列都将是相同的。

您需要将该列添加到旧表和新加载数据的副本中,然后可以使用如下查询:

--! Expect Zero select count(*) as [FailCount] from OldLoadDb.dbo.ExistingCustomer as ec inner join NewLoadDb.dbo.NewCustomer as nc --! This join should probably be on some business key but you get the idea on nc.CustomerId = ec.CustomerId where ec.DeltaHash <> ec.DeltaHash go

由于所有繁重的工作都是在服务器端完成的,所以在DbFit中,类似的事情会运行得很好。

您还应该为一个表中存在的行而不是另一个表中的行添加测试。

当然,散列查询不会告诉您区别是什么,但至少允许您识别不同的行。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45744870

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档