我是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
答案 0 :(得分:0)
由于此测试正在测试存储过程的功能部分,因此它是“合理的”单元测试 - 它不必测试参数是否有效。
话虽如此 - 我不确定这是测试你想要的最佳方式。您似乎使用@ActualID
作为您早期设置但未指定为OUTPUT
参数的变量,因此我总是希望此测试通过(要么我读错了,或者测试中有错误。)
您的问题表明您的测试目标是:“验证当传递现有ID时,未在数据库中创建新记录。”
我实际上会稍微改变一下这个测试的断言部分 - 我会直接检查DataSource
表中的结果,而不是检查返回的参数 - 然后检查数据库中创建的内容。我还会检查任何输出参数,但通常我会将输出参数视为对数据检查的单独测试,或者至少在测试中将单独的断言 - 因此是单独的消息 - 视为。
我认为如果您可以使用更具描述性的消息,您会发现它很有用 - 根据the TSQLUnit cookbook
中的示例我发现解决只测试一件事的测试更容易 - 因此我知道需要修复的内容。它们通常也更容易编写!
这有帮助吗?