我最近开始通过 Redgate 的 SQL 测试使用 TSQLT 来创建和运行单元测试。我遇到了一个问题。需要超过几分钟才能执行的单元测试将超时,这会停止所有其他单元测试的执行。
如何延长 tSQLt 的超时时间?
我的“单元测试”可能实际上不是单元测试,但我不熟悉另一种更适合的测试方法。
我正在开展一个项目,以提高我们数据仓库的夜间刷新速度。目前,这个过程需要五个小时。通过重新安排任务以尽可能并行运行,我将时间缩短到两个小时。我的问题是,除非我能找到一种方法来证明新流程与旧流程具有完全相同的最终结果,否则 QA 将在接下来的一年中检查每个表中每一行的每一列中的每个值。要么那个,要么这个项目将因为“太难”而被废弃。
所以我想出的测试是这样的:我有一个数据库,在使用我创建的新方法在我们的测试环境中处理结果表之后,我在其中运行一个脚本来复制结果表。然后,回到测试环境,我运行旧进程来更新表。然后,我对每个表运行一个单元测试,以证明使用新方法处理的归档表的内容与使用旧方法重新处理的表的内容完全相同。
不幸的是,由于其中一些表的大小(数百万行),一些单元测试正在超时。以下是我收到的错误:
测试程序:[HR360_unitTest1].[HR360_DW_Job6].[test fact_group_clients Identical Contents] on emr\preprod System.Data.SqlClient.SqlException (0x80131904):超时已过期。在操作完成之前超时时间已过或服务器没有响应。---> System.ComponentModel.Win32Exception (0x80004005):等待操作在 System.Data.SqlClient.SqlConnection.OnError 处超时(SqlException 异常,布尔 breakConnection,Action`1 wrapCloseInAction)在 System.Data.SqlClient.SqlInternalConnection.OnError System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) 在 System.Data.SqlClient.TdsParser 的(SqlException 异常,布尔型 breakConnection,Action`1 wrapCloseInAction)。
1 completion, Int32 timeout, Task& task, Boolean asyncWrite) at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource
在 RedGate.SQLTest.tSQLt.FrameworkWrapper.#kz(SqlCommand #LGj) 在 RedGate.SQLTest.tSQLt 的 System.Data.SqlClient.SqlCommand.ExecuteNonQuery() 的 1 完成,字符串 methodName,布尔 sendToPipe,Int32 超时,布尔 asyncWrite)。 FrameworkWrapper.#7qHc(String #2xAd, SqlParameter[] #LvPb) at RedGate.SQLTest.tSQLt.FrameworkWrapper.#qd4b(String #LGxc) at RedGate.SQLTest.tSQLt.TestRunner.Execute(SqlConnection connection) ClientConnectionId:519569ed-03ce -4510-b226-9ff18e0f1d8d 错误号:-2,状态:0,类:11
如果无法增加 tSQLt 的超时时间,那么我将不得不寻找另一种方法来自动测试这些表的内容是否相同(以可随意重复的方式)或放弃该项目。