如何按特定顺序运行tSQLt测试并实现依赖测试的统一事务回滚?
tSQLt测试类的执行顺序控制与事务统一回滚方案
指定测试执行顺序
tSQLt默认按测试方法的字母顺序执行,没有内置的自定义顺序配置,但可以通过两种方式实现指定顺序:
- 重命名测试方法:给测试添加带编号的前缀,比如
test_01_CreateUser、test_02_UpdateUser,利用字母排序特性强制执行顺序。这是最简便的方案。 - 手动调用测试:创建一个"控制测试",在里面按需求顺序调用单个测试。比如:
CREATE PROCEDURE [TestUserManagement].[test_RunAllDependentTests] AS BEGIN EXEC tSQLt.RunTest '[TestUserManagement].[test_CreateNewUser]'; EXEC tSQLt.RunTest '[TestUserManagement].[test_UpdateUserEmail]'; EXEC tSQLt.RunTest '[TestUserManagement].[test_ArchiveInactiveUser]'; END;
执行这个控制测试就能严格按你定义的顺序运行依赖测试。
实现统一事务回滚
tSQLt默认每个测试都在独立事务中执行并自动回滚,要让依赖测试共享事务、统一回滚,需要修改默认行为:
- 禁用测试类的自动事务:在测试类中执行以下语句,关闭单个测试的自动事务创建:
EXEC tSQLt.SetTestClassProperty 'TestUserManagement', 'AutoCreateTransaction', 0;
- 在控制测试中手动管理事务:在控制测试里开启事务,执行所有依赖测试后统一回滚,即使中途测试失败也要确保回滚。示例代码:
CREATE PROCEDURE [TestUserManagement].[test_RunDependentTestsWithSharedTransaction] AS BEGIN BEGIN TRANSACTION; BEGIN TRY -- 按顺序执行依赖测试 EXEC tSQLt.RunTest '[TestUserManagement].[test_CreateNewUser]'; EXEC tSQLt.RunTest '[TestUserManagement].[test_UpdateUserEmail]'; EXEC tSQLt.RunTest '[TestUserManagement].[test_ArchiveInactiveUser]'; -- 所有测试通过后回滚 ROLLBACK TRANSACTION; END TRY BEGIN CATCH -- 异常时回滚事务,避免数据残留 IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION; -- 抛出异常,让tSQLt标记测试失败 THROW; END CATCH END;
注意:被调用的单个测试不能自行创建事务,否则会引发嵌套事务冲突;如果某个测试失败,后续测试不会执行,事务会立即回滚,符合依赖测试的预期逻辑。
内容的提问来源于stack exchange,提问作者FIDEL
相关产品推荐
相关产品推荐

