/**//* Test case :模板 前置条件: */ SET NOCOUNT ON BEGINTRAN GO --Setup Begin --相当于一个测试类的Setup函数, 可以把各个测试用例都会用到的初始化脚本放到这里 --Setup End GO SAVETRAN aa --相当于测试类中的一个测试函数 GO --这里写每个函数不同的初始化脚本 --被测试模块 Begin SELECT A =1INTO TableA --被测试模块 End --验证 SELECT A =1INTO #Target-- 把预期的结果放到固定名称的临时表#Target中 SELECT*INTO #Result FROM TableA -- 把处理的结果放到固定名称的临时表#Result中 EXEC up_ASSERT '测试函数1'-- up_ASSERT过程里会比较#Result和#Target GO ROLLBACKTRAN aa -- 回滚, 把这个"测试函数"的影响取消 GO SAVETRAN aa --相当于测试类中的另一个测试函数 GO --这里写每个函数不同的初始化脚本 --被测试模块 Begin SELECT A =2INTO TableA --被测试模块 End --验证 SELECT A =2INTO #Target-- 把预期的结果放到固定名称的临时表#Target中 SELECT*INTO #Result FROM TableA -- 把处理的结果放到固定名称的临时表#Result中 EXEC up_ASSERT '测试函数2'-- up_ASSERT过程里会比较#Result和#Target GO ROLLBACKTRAN aa -- 回滚, 把这个"测试函数"的影响取消 GO --Teardown ROLLBACK-- 回滚, 把整个测试的影响都取消
--里面用到的过程
ifexists (select*from dbo.sysobjects where id =object_id(N'[dbo].[up_TableIsEqual]') andOBJECTPROPERTY(id, N'IsProcedure') =1) dropprocedure[dbo].[up_TableIsEqual] GO SET NOCOUNT ON GO CREATEPROC up_TableIsEqual /**//*结果集比较 liye */ @SourceTablevarCHAR(100), @TargetTablevarCHAR(100), @IsDebugBIT=0 --1 Equal AS DECLARE@ResultINT CREATETABLE #SrcTbCol( [name] sysname, xtype tinyint ) CREATETABLE #TagTbCol( [name] sysname, xtype tinyint ) SELECT Result =0 INTO #ResultInTableisEqualProc -- 比较表结构 IFSUBSTRING(@SourceTable, 1, 1) ='#' BEGIN INSERTINTO #SrcTbCol SELECT[name], xtype FROM tempdb..syscolumns WHERE[ID]=OBJECT_ID('tempdb..'+@SourceTable) ORDERBY colid END ELSEBEGIN INSERTINTO #SrcTbCol SELECT[name], xtype FROM syscolumns WHERE[ID]=OBJECT_ID(@SourceTable) ORDERBY colid END IFSUBSTRING(@TargetTable, 1, 1) ='#' BEGIN INSERTINTO #TagTbCol SELECT[name], xtype FROM tempdb..syscolumns WHERE[ID]=OBJECT_ID('tempdb..'+@TargetTable) ORDERBY colid END ELSEBEGIN INSERTINTO #TagTbCol SELECT[name], xtype FROM syscolumns WHERE[ID]=OBJECT_ID(@TargetTable) ORDERBY colid END IF (SELECTCOUNT(*) FROM #SrcTbCol) <> (SELECTCOUNT(*) FROM #SrcTbCol) OR (SELECTCOUNT(*) FROM #SrcTbCol) <> (SELECTCOUNT(*) FROM #SrcTbCol a INNERJOIN #TagTbCol b ON a.[name]= b.[name]) BEGIN RETURN0 END DECLARE@PreparevarCHAR(4000), @ColListvarCHAR(1000) --获取列的名称列表: A,B,C BEGIN SET@ColList='' SELECT@ColList=@ColList+[name]+',' FROM #SrcTbCol WHERE xtype NOTIN (34, 35, 99) SET@ColList=SUBSTRING(@ColList, 1, LEN(@ColList) -1) END BEGIN-- 生成新的临时表, 合并重复行, 和记录重复行的个数 SET@Prepare=' SELECT _ColList_, CountForTableCompare = COUNT(*) INTO _SourceTb_2 FROM _SourceTb_ GROUP BY _ColList_ SELECT _ColList_, CountForTableCompare = COUNT(*) INTO _TargetTb_2 FROM _TargetTb_ GROUP BY _ColList_ ' SET@Prepare=REPLACE(@Prepare, '_ColList_', @ColList) SET@Prepare=REPLACE(@Prepare, '_SourceTb_', @SourceTable) SET@Prepare=REPLACE(@Prepare, '_TargetTb_', @TargetTable) END --加入重复行数列 INSERTINTO #SrcTbCol SELECT[name]='CountForTableCompare', 56 INSERTINTO #TagTbCol SELECT[name]='CountForTableCompare', 56 -- 比较结果数 DECLARE@svarCHAR(8000) SET@s='UPDATE #ResultInTableisEqualProc SET Result = 1 WHERE (SELECT COUNT(*) FROM _SourceTb_2) = (SELECT COUNT(*) FROM _TargetTb_2) AND (SELECT COUNT(*) FROM _SourceTb_2) = (SELECT COUNT(*) FROM _SourceTb_2 a INNER JOIN _TargetTb_2 b ON ' SELECT@s=@s+' a.'+[name]+' = b.'+[name]+' AND' FROM #SrcTbCol WHERE xtype NOTIN (34, 35, 99) SET@s=REPLACE(@s, '_SourceTb_', @SourceTable) SET@s=REPLACE(@s, '_TargetTb_', @TargetTable) SET@s=SUBSTRING(@s, 1, LEN(@s) -3) SET@s=@s+')' IF@IsDebug=1 BEGIN PRINT@Prepare+@s END EXEC(@Prepare+@s) SELECT@Result= Result FROM #ResultInTableisEqualProc DROPTABLE #SrcTbCol DROPTABLE #TagTbCol RETURN@Result GO
ifexists (select*from dbo.sysobjects where id =object_id(N'[dbo].[up_ASSERT]') andOBJECTPROPERTY(id, N'IsProcedure') =1) dropprocedure[dbo].[up_ASSERT] GO CREATEPROC up_ASSERT @ErrorMessagevarCHAR(100) ='' AS DECLARE@ResINT EXEC@Res= up_TableIsEqual '#Target', '#Result'-- 比较结果和期望值 IF@Res<>1 BEGIN IF@ErrorMessageISNULL BEGIN RAISERROR('Error', 16, 1) END ELSEBEGIN RAISERROR(@ErrorMessage, 16, 1) END SELECT*FROM #Target SELECT*FROM #Result END GO