SQL Server 单元测试如何用动态值断言函数结果?
数据阿明
结论
可以根据测试数据生成预期值,再在单元测试脚本中用 Transact-SQL 进行比较。Visual Studio 的 Scalar Value 测试条件可通过属性设置预期值,适合检查固定值。如果要将结果与 @ResourceId 或其他查询取得的值比较,可以在脚本中解析函数返回的 JSON,再用 IF 和 THROW 进行断言。Microsoft 文档也列出了 THROW 和 RAISERROR,作为 SQL Server 单元测试中的 Transact-SQL 断言方式。使用测试条件;使用 Transact-SQL 断言
在测试脚本中比较动态值
下面的例子假设函数返回的 JSON 中,$.id 应与传入的 @ResourceId 相等。测试的准备步骤应已填充 ##organisation:
DECLARE @RC AS NVARCHAR(MAX);
DECLARE @ResourceId AS INT;
DECLARE @ExpectedId AS NVARCHAR(100);
DECLARE @ActualId AS NVARCHAR(100);
SELECT @ResourceId = [OrganisationId]
FROM ##organisation
WHERE [RowNum] = 1;
SELECT @RC = [fhir].[fnOrganizationResource](@ResourceId);
SET @ExpectedId = CONVERT(NVARCHAR(100), @ResourceId);
SELECT @ActualId = [Id]
FROM OPENJSON(@RC)
WITH (
[Id] NVARCHAR(100) '$.id'
);
IF (@ExpectedId <> @ActualId)
OR (@ExpectedId IS NULL AND @ActualId IS NOT NULL)
OR (@ExpectedId IS NOT NULL AND @ActualId IS NULL)
BEGIN
THROW 50000, 'The returned JSON id does not match the expected value.', 1;
END;
如果预期值来自另一列,可以将 @ExpectedId 改为从相应的测试数据中赋值,并根据字段的实际类型选择合适的变量和转换方式。如果接口约定 $.id 不应等于 @ResourceId,就应使用真正的预期值来源,不要仅凭示例中出现了 @ResourceId 就认定二者相等。
配置和检查要点
- 使用上述脚本断言时,可以移除针对同一结果的固定值
Scalar Value条件,以免两套预期值互相冲突。 - 这个示例按单个 JSON 对象处理,并假设
$.id是单个标量。如果函数可能返回数组、多行数据或NULL,需要根据实际返回约定增加行数、空值或结构断言。 - 如果值不匹配,
THROW会使测试脚本失败。若仍使用Scalar Value条件,应确保它检查的结果集、行和列都符合预期。
备注:内容仅供参考。
