You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按特定顺序运行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默认每个测试都在独立事务中执行并自动回滚,要让依赖测试共享事务、统一回滚,需要修改默认行为:

  1. 禁用测试类的自动事务:在测试类中执行以下语句,关闭单个测试的自动事务创建:
EXEC tSQLt.SetTestClassProperty 'TestUserManagement', 'AutoCreateTransaction', 0;
  1. 在控制测试中手动管理事务:在控制测试里开启事务,执行所有依赖测试后统一回滚,即使中途测试失败也要确保回滚。示例代码:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 11:55:24