【发布时间】:2018-01-25 15:28:06
【问题描述】:
我有很多存储过程,每个存储过程都有自己的 tsqlt 测试类。在每个测试类中,大约有 5 个测试对所有存储过程完全相同,大约有 5 个测试对存储过程是唯一的。
有时我想更改其中一个“常用”测试,而我必须在 10 个或更多文件中更改它,这很麻烦。
有什么方法可以在单个文件中定义一组测试,然后从另一个测试类调用这些测试,以便在调用测试类正在测试的存储过程上运行测试?
【问题讨论】:
我有很多存储过程,每个存储过程都有自己的 tsqlt 测试类。在每个测试类中,大约有 5 个测试对所有存储过程完全相同,大约有 5 个测试对存储过程是唯一的。
有时我想更改其中一个“常用”测试,而我必须在 10 个或更多文件中更改它,这很麻烦。
有什么方法可以在单个文件中定义一组测试,然后从另一个测试类调用这些测试,以便在调用测试类正在测试的存储过程上运行测试?
【问题讨论】:
一种解决方案可能是创建一个 TestHelpers 类,将您的通用测试代码添加到该类,但没有“test”前缀,因此 tSQLt 不会自动运行它们。这些过程需要输入参数,例如要测试的过程名称等,并且还包括标准 tSQLt 断言。
然后在特定于过程的测试类中,您只需从测试中调用 TestHelper 版本。
我不确定您的确切用例,但让我们假设这些过程之间的共同因素之一是它们都返回相同的结果集(但具有不同的内容)并且您需要一个通用测试来断言结果集结构应该是这样的。
你可以像这样创建一个辅助过程
create procedure [TestHelpers].[ValidateResultSet]
(
@ProcedureToTest nvarchar(200)
)
as
begin
--! common set up omitted for brevity
exec tSQLt.AssertResultSetsHaveSameMetaData...
end
然后在您的过程测试类中,您可能会创建如下所示的测试:
create procedure [MyFirstProcedureTests].[test result set]
as
begin
--! MyFirstProcedure-specific set up omitted
exec TestHelpers.ValidateResultSet 'MyFirstProcedure';
end
或
create procedure [MySecondProcedureTests].[test result set]
as
begin
--! MySecondProcedure-specific set up omitted
exec TestHelpers.ValidateResultSet 'MySecondProcedure';
end
我现在无法访问数据库来证明这一点,但它应该可以工作,因为我过去做过类似的事情。
【讨论】: