【问题标题】:How to test synchronization between C# code and Sql Server stored procedure如何测试 C# 代码和 Sql Server 存储过程之间的同步
【发布时间】:2013-10-12 04:02:16
【问题描述】:

为了在 SQL Server 和 C# 之间进行交互,我使用了SqlCommand 对象、参数和存储过程。

我的问题是我不知道,直到我执行它,如果它仍然与数据库同步。

例如,如果我有以下存储过程:

create procedure psSync
(
    @Argument VARCHAR(50)
)
--do stuff

我将在我的代码中:

String myArgument="20131110"
SqlCommand sqlcmd = new SqlCommand { CommandType = CommandType.StoredProcedure, CommandText = "psSync"};
sqlCommand.Parameters.AddWithValue("@Argument", myArgument);
//execute sql command

这里的一切都很好。

但如果我将我的 proc 更改为

create procedure psSync
(
    --Desync!
    @Argument Datetime
)
--do stuff

忘记将 myArgument 更改为 datetime,它会崩溃,而且我经常会太晚才注意到这个错误。

我首先尝试运行单元测试,使用开始事务和回滚在我的开发数据库中执行存储过程,但我不喜欢它:

  • 需要很长时间
  • 它可能在 prod 中误运行
  • 它将数据库配置存储在测试 dll 中

所以我的问题是:

如何快速、高效、安全地测试 C# 代码和 SqlServer 代码(SqlCommand->Stored Procedure)之间的所有 sql 链接?

【问题讨论】:

  • 这是 ORM 被发明的原因之一。 NHibernate 或 Entity-Framework 或其他。

标签: c# sql-server testing stored-procedures


【解决方案1】:

只是好奇,为什么要添加这种模式验证? 更改过程参数不会像那样发生,对。进行修改的人必须知道,这也需要更改代码。

但是,如果您有任何情况并且确实需要这样做,您必须提出自己的框架或 API 集,您可以在实际调用数据库过程之前从 C# 代码调用它们。到目前为止,我还没有看到这种类型的验证,因为它会增加很多开销,具体取决于它是针对一个或两个过程还是跨所有 DB 调用实现的。

您可以编写 SQL API,该 API 将返回数据库所有/选定的过程以及当前的架构定义。检查这个查询。 sys.parameters 表中还有其他有用的信息。

SELECT  OBJECT_NAME(ssp.object_id) objectName
        ,ssp.name ParameterName
        ,sst.name ParameterDataType
        ,ssp.max_length
        ,ssp.precision
        ,ssp.scale
FROM sys.parameters  ssp
JOIN sys.types sst
    ON ssp.system_type_id=sst.system_type_id
WHERE OBJECT_NAME(ssp.object_id) = 'pr_test1'

示例结果将是这样的。

但请记住,如果您没有提出正确的频率或何时获取此信息,异步问题仍然可能发生。您能做的最好的事情就是在该对象调用之前获取此信息。而且您知道一直这样做的开销是什么。

【讨论】:

  • 感谢这个有用的答案。我想做模式验证,因为你永远不知道一个过程是在 C# 代码中使用还是仅用于 Db 使用 => 存储过程修改并不总是意味着 C# 代码修改。我知道这个问题似乎缺乏严谨性,但在我看来,这与推动单元测试创​​建的逻辑相同。一旦我为此测试实施了正确的框架,我将回到这个线程。
【解决方案2】:

与环境的交互,例如:数据库、服务等是功能和集成测试的工作。这些测试很慢,而且数量应该很少。

如果单元测试需要很长时间,则它不是单元测试。 单元测试可能会检查预期参数是否设置为 SqlCommand 并调用了执行方法。应该模拟数据库上下文。

此类单元测试的更正由更新存储过程的那个人负责。或者应该有一些 DB 规范应该与单元测试同步。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-11
    • 2014-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-07
    • 1970-01-01
    相关资源
    最近更新 更多