我正在使用tSQLt测试我的sql存储过程。我希望能够在测试的上下文中调试我的存储过程(使用伪造的表等)。
调试时在SSMS中设置/命中断点时遇到问题。
我在其中启动调试器的代码如下:
EXEC tSQLt.run @TestName = '[someTestClass].[test something]'
我能够进入此通话以及随后的各种通话,但这很烦人。我希望能够在测试中的存储过程中设置断点,但除了this似乎在SSMS 2017中已经过时,我找不到任何有关如何完成此操作的文档。
是否可以使用SSMS中的对象资源管理器在存储的proc中设置断点? TSQLT中是否有一种方法可以使您更轻松地进入测试/被测代码?除了SSMS之外,还有没有更好的工具来调试类似的东西?
任何帮助或建议,我们将不胜感激。
这是我调试测试的方式,我遇到了这个问题,以寻求最佳实践/其他人如何调试测试,以便希望有人可以提供更好的答案。
我的目标代码存储在数据库项目中/通过dacpacs部署。在开发测试时,我从Visual Studio部署数据库,然后通过SSMS执行tsqlt.Run
。
在我的tsqlt数据库中,我有一个自定义表
CREATE TABLE [tSQLt].[DebugTests]
(
[IsDebug] bit not null default 1,
constraint PK_T1 PRIMARY KEY ([IsDebug]),
constraint CK_T1_Locked CHECK ([IsDebug]=1)
)
如果我正在积极调试我的测试,则将其插入该表中,并且我的测试将知道它们处于Debug模式,并且应该打印/返回内容。
INSERT INTO tSQLt.DebugTests(IsDebug)
VALUES(1);
在我的测试中,我在存储过程的开头包含了该代码段。这将设置一个变量,然后我可以在整个存储过程中使用该变量来显示所需的各种信息。
CREATE PROCEDURE [tests_schema].[test myStuff]
AS
DECLARE @Debug BIT=
(
SELECT CASE
WHEN COALESCE(IsDebug, 0) = 1
THEN 1
ELSE 0
END
FROM tSQLt.DebugTests
);
#For instance, I might want to see what my fake table looks like
EXEC tSQLt.FakeTable '[dbo].[MyTable]';
INSERT INTO [dbo].[MyTable] ([Column1],[column5])
Values
(1,'Value')
,(2,'AnotherValue')
if (@Debug = 1)
select 'FakeDataArrange' as [ResultType],'[dbo].[MyTable]' 'TableName', * from [dbo].[MyTable]
#I might also want to see what the actual results of my stored proc/view are. Or surface the #Expected values so that I do not have to jump back to the source code to remember what this test is expecting.
IF(@Debug = 1)
SELECT '#Actual' 'ResultType', *
FROM #Actual;
然后在完成后截断[tSQLt].[DebugTests]
。如果您每次都吐出所有这些调试消息/结果,则该性能不佳,因此您确实要确保在积极开发测试时该表中只有一个值。
我发现这对我的工作流程非常有用。通常,我只需要查看伪造表的值就可以找出问题所在。话虽如此,我没有测试任何复杂的代码,只是测试了用于报告的基本存储过程。