如何中断在SSMS中测试的存储过程代码

问题描述 投票:1回答:1

我正在使用tSQLt测试我的sql存储过程。我希望能够在测试的上下文中调试我的存储过程(使用伪造的表等)。

调试时在SSMS中设置/命中断点时遇到问题。

我在其中启动调试器的代码如下:

EXEC tSQLt.run  @TestName = '[someTestClass].[test something]'

我能够进入此通话以及随后的各种通话,但这很烦人。我希望能够在测试中的存储过程中设置断点,但除了this似乎在SSMS 2017中已经过时,我找不到任何有关如何完成此操作的文档。

是否可以使用SSMS中的对象资源管理器在存储的proc中设置断点? TSQLT中是否有一种方法可以使您更轻松地进入测试/被测代码?除了SSMS之外,还有没有更好的工具来调试类似的东西?

任何帮助或建议,我们将不胜感激。

ssms tsqlt
1个回答
0
投票

这是我调试测试的方式,我遇到了这个问题,以寻求最佳实践/其他人如何调试测试,以便希望有人可以提供更好的答案。

我的目标代码存储在数据库项目中/通过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]。如果您每次都吐出所有这些调试消息/结果,则该性能不佳,因此您确实要确保在积极开发测试时该表中只有一个值。

我发现这对我的工作流程非常有用。通常,我只需要查看伪造表的值就可以找出问题所在。话虽如此,我没有测试任何复杂的代码,只是测试了用于报告的基本存储过程。

© www.soinside.com 2019 - 2024. All rights reserved.