【发布时间】:2012-03-19 02:21:36
【问题描述】:
我需要对客户端数据库中的存储过程进行测试。有没有办法在不影响数据库数据的情况下测试存储过程?
比如SP里面有个insert查询,会改变数据库的数据。
有没有办法解决这个问题?
【问题讨论】:
标签: sql unit-testing sql-server-2005 testing stored-procedures
我需要对客户端数据库中的存储过程进行测试。有没有办法在不影响数据库数据的情况下测试存储过程?
比如SP里面有个insert查询,会改变数据库的数据。
有没有办法解决这个问题?
【问题讨论】:
标签: sql unit-testing sql-server-2005 testing stored-procedures
您可以在事务中运行存储过程。通过将您的语句放在注释行之间来使用此脚本。运行整个脚本,您的事务将处于未提交状态。然后,突出显示 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
【讨论】:
如果 SP 旨在更改数据,而您不允许更改数据,那么您将如何“测试”SP?你会确保它不会死吗?如果它没有返回错误,但没有插入数据怎么办?
您可以遵循 Valamas 建议的类似路径,但您还需要实际测试 SP。例如,如果要根据特定参数值插入特定数据,那么您必须:
我无法向您展示代码,但我已经成功地使用 Visual Studio 单元测试框架在 .NET 中的代码中完成了上述操作。可以对 NUnit 或任何其他单元测试框架做同样的事情。我没有使用 Visual Studio 数据库项目的数据库单元测试功能。我只是在代码中完成了上述步骤,使用 ADO.NET 和 SqlTransaction 类来控制事务。
【讨论】: