如何使用tSQLt测试整数值是否处于特定范围或符合预期百分比误差要求
tSQLt 实现整数误差范围校验的方案
核心说明
tSQLt官方没有内置AssertIntValueInRange类的区间断言方法,你提到的FailAssertion属于方法名记错,官方内置的自定义断言失败抛出方法为tSQLt.Fail,支持自定义拼接错误信息,基于该方法即可实现你的需求。
方案1:创建通用自定义断言(推荐,可复用)
一次创建后所有单元测试用例均可直接调用,符合tSQLt的扩展规范:
- 首先创建自定义断言存储过程:
CREATE PROCEDURE tSQLt.AssertIntWithinErrorRate @ExpectedValue INT, @ActualValue INT, @AllowedErrorRate DECIMAL(5,3) -- 单位为%,允许0.1%误差则传入0.1 AS BEGIN SET NOCOUNT ON; -- 计算允许的最大偏差绝对值 DECLARE @AllowedDeviation DECIMAL(18,6) = ABS(@ExpectedValue * @AllowedErrorRate / 100.0); -- 计算实际偏差绝对值 DECLARE @ActualDeviation DECIMAL(18,6) = ABS(@ActualValue - @ExpectedValue); IF @ActualDeviation > @AllowedDeviation BEGIN -- 调用tSQLt内置方法抛出断言失败,输出详细错误信息 EXEC tSQLt.Fail '预期值:', @ExpectedValue, ',实际值:', @ActualValue, ',实际偏差:', @ActualDeviation, ',超出允许最大偏差:', @AllowedDeviation, '(允许误差率:', @AllowedErrorRate, '%)'; END END GO
- 调用示例(校验行数误差不超过0.1%):
-- 获取实际表行数 DECLARE @ActualRowCount INT = (SELECT COUNT(*) FROM 待测试业务表); -- 执行断言,预期行数为10000,允许误差0.1% EXEC tSQLt.AssertIntWithinErrorRate @ExpectedValue = 10000, @ActualValue = @ActualRowCount, @AllowedErrorRate = 0.1;
方案2:单测试用例临时实现(无需新增存储过程)
如果仅需要在单个用例中做校验,不需要复用逻辑,可以直接在测试用例中加入判断代码:
DECLARE @ExpectedRowCount INT = 10000; DECLARE @ActualRowCount INT = (SELECT COUNT(*) FROM 待测试业务表); DECLARE @AllowedErrorRate DECIMAL(5,3) = 0.1; DECLARE @AllowedDeviation DECIMAL(18,6) = ABS(@ExpectedRowCount * @AllowedErrorRate / 100.0); DECLARE @ActualDeviation DECIMAL(18,6) = ABS(@ActualRowCount - @ExpectedRowCount); IF @ActualDeviation > @AllowedDeviation BEGIN EXEC tSQLt.Fail '行数超出误差允许范围,预期:', @ExpectedRowCount, ',实际:', @ActualRowCount; END
补充说明:如果需要支持非整数的数值校验,只需将存储过程的入参类型调整为
DECIMAL/FLOAT即可,逻辑无需修改。
内容的提问来源于stack exchange,提问作者Eric B
相关产品推荐
相关产品推荐

