【问题标题】:Test stored procedure without affecting database在不影响数据库的情况下测试存储过程
【发布时间】:2012-03-19 02:21:36
【问题描述】:

我需要对客户端数据库中的存储过程进行测试。有没有办法在不影响数据库数据的情况下测试存储过程?

比如SP里面有个insert查询,会改变数据库的数据。

有没有办法解决这个问题?

【问题讨论】:

    标签: sql unit-testing sql-server-2005 testing stored-procedures


    【解决方案1】:

    您可以在事务中运行存储过程。通过将您的语句放在注释行之间来使用此脚本。运行整个脚本,您的事务将处于未提交状态。然后,突出显示 ROLLBACK 或 COMMIT 行并相应地执行以完成。

    始终有备份。

    原则上,如果可能的话,在远离客户数据的沙盒中工作。

    请注意,在您决定是提交还是回滚时,您可能会锁定可能会阻碍客户端其他 sql 语句的数据。

    BEGIN TRANSACTION MyTransaction
    GO
    
    -- INSERT SQL BELOW
    
    
    -- INSERT SQL ABOVE
    
    GO
    IF @@ERROR != 0
    BEGIN
            PRINT '--------- ERROR - ROLLED BACK ---------'
            ROLLBACK TRANSACTION MyTransaction
    END
    ELSE
    BEGIN
            PRINT '--------- SCRIPT EXECUTE VALID ---------'
            PRINT '--------- COMPLETE WITH ROLLBACK OR COMMIT NOW! ---------'
            --ROLLBACK TRANSACTION MyTransaction
            --COMMIT TRANSACTION MyTransaction
    END
    

    【讨论】:

      【解决方案2】:

      如果 SP 旨在更改数据,而您不允许更改数据,那么您将如何“测试”SP?你会确保它不会死吗?如果它没有返回错误,但没有插入数据怎么办?

      您可以遵循 Valamas 建议的类似路径,但您还需要实际测试 SP。例如,如果要根据特定参数值插入特定数据,那么您必须:

      1. 开始交易
      2. 在数据库中创建任何测试数据
      3. 使用特定参数值调用 SP
      4. 仍在事务中,检查数据库以查看是否插入了正确的行
      5. 回滚交易

      我无法向您展示代码,但我已经成功地使用 Visual Studio 单元测试框架在 .NET 中的代码中完成了上述操作。可以对 NUnit 或任何其他单元测试框架做同样的事情。我没有使用 Visual Studio 数据库项目的数据库单元测试功能。我只是在代码中完成了上述步骤,使用 ADO.NET 和 SqlTransaction 类来控制事务。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-15
        • 2019-05-08
        • 2012-05-02
        • 1970-01-01
        • 1970-01-01
        • 2011-04-15
        • 2011-08-31
        相关资源
        最近更新 更多