SQL单元测试为不必返回值的存储过程创建测试

时间:2012-08-29 05:06:29

标签: sql tsql unit-testing

我是sql单元测试的新手,但我已经编写了第一个测试并尝试确保这是一个明智的测试。所以我有一个存储过程简单地更新(如果存在)或插入(如果不存在)。使用TSQLUnit,我编写了下面的测试来测试我的名为 spModifyData 的存储过程。测试的目的是验证当传递现有ID时,不会在数据库中创建新记录。

ALTER PROCEDURE [dbo].[ut_TestspModifyData] 
AS
BEGIN 
    SET NOCOUNT ON;
     -- Setup the test conditions by inserting test data
     DECLARE 
                @newidone uniqueidentifier,
                @newidtwo uniqueidentifier,
                @newidthree uniqueidentifier,
                @ExpectedID uniqueidentifier,
                @ActualID uniqueidentifier

                SET @ActualID = '13E7C741-9A04-4E84-B604-141874A6A9B4'
                SET @ExpectedID = '13E7C741-9A04-4E84-B604-141874A6A9B4'
                SET @newidone = newID()
                SET @newidtwo = newID()
                SET @newidthree = newID()

                 INSERT INTO DataSource( [DataSourcePrimarySource],[DataSourceName],[DataSourceRecordCreateDate] 
          ,[DataSourceStatus] ,[DataSourceIsActive]) VALUES ('PRIMARY SOURCE ONE', 'XYZ', GETDATE() , @newidone, 1)

  -- Exercise the test
 EXEC  spModifyDataSource @ActualID , 'PRIMARY SOURCE ONETWO', 'BBB', @newIDone, 0  

 -- Assert expectations
 IF (@ExpectedID != @ActualID)
                EXEC dbo.tsu_Failure 'ModifyData failed.' 

-- Teardown
 -- Implicitly done via ROLLBACK TRAN

END

1 个答案:

答案 0 :(得分:0)

由于此测试正在测试存储过程的功能部分,因此它是“合理的”单元测试 - 它不必测试参数是否有效。

话虽如此 - 我不确定这是测试你想要的最佳方式。您似乎使用@ActualID作为您早期设置但未指定为OUTPUT参数的变量,因此我总是希望此测试通过(要么我读错了,或者测试中有错误。)

您的问题表明您的测试目标是:“验证当传递现有ID时,未在数据库中创建新记录。

我实际上会稍微改变一下这个测试的断言部分 - 我会直接检查DataSource表中的结果,而不是检查返回的参数 - 然后检查数据库中创建的内容。我还会检查任何输出参数,但通常我会将输出参数视为对数据检查的单独测试,或者至少在测试中将单独的断言 - 因此是单独的消息 - 视为。

我认为如果您可以使用更具描述性的消息,您会发现它很有用 - 根据the TSQLUnit cookbook

中的示例

我发现解决只测试一件事的测试更容易 - 因此我知道需要修复的内容。它们通常也更容易编写!

这有帮助吗?