Asp.net 单元测试、Web服务和数据库事务

Asp.net 单元测试、Web服务和数据库事务,asp.net,wcf,unit-testing,mstest,Asp.net,Wcf,Unit Testing,Mstest,我正在尝试为我的web服务编写测试用例,以便能够回滚它们可能进行的任何数据库更改。我可以尝试用一个事务范围来包围它们,但是如何为事务指定上下文呢?换句话说,事务如何知道要回滚哪个数据库和服务器?在我的例子中,SQL server与web服务一样在本地运行。在您告诉我在没有客户机的情况下直接调用web服务之前,请理解web服务具有非常特定的运行时环境设置,这对于我的测试用例来说是一件非常痛苦的事情。也许,事务范围不是我想要使用的,有其他选择吗?是否可以调用数据库函数来启动事务?谢谢。首先,您没有进

我正在尝试为我的web服务编写测试用例,以便能够回滚它们可能进行的任何数据库更改。我可以尝试用一个事务范围来包围它们,但是如何为事务指定上下文呢?换句话说,事务如何知道要回滚哪个数据库和服务器?在我的例子中,SQL server与web服务一样在本地运行。在您告诉我在没有客户机的情况下直接调用web服务之前,请理解web服务具有非常特定的运行时环境设置,这对于我的测试用例来说是一件非常痛苦的事情。也许,事务范围不是我想要使用的,有其他选择吗?是否可以调用数据库函数来启动事务?谢谢。

首先,您没有进行单元测试。单元测试是关于测试单个小的代码单元(函数)。当您测试一个函数时,您正在为每个执行路径创建单元测试,以便能够完全覆盖测试代码。但是您的测试系统包括客户机到服务的通信和服务到数据库的通信=多个代码层+配置。这就是所谓的集成测试

这里的问题是你是如何设计你的服务的?您的服务是否会处理事务?事务流允许在客户端启动事务并将其传递给服务(分布式事务)。这不是默认行为,需要对WCF绑定进行特殊配置。如果您使用这种方法,您可以在测试中执行相同的操作。在测试时启动事务,并在测试结束时回滚事务。如果您没有将服务设计为流事务,您就不能使用它,因为您在测试中启动的事务不会影响服务。在这种情况下,您有几种选择:

  • 创建手动补偿。在每个测试结束时,运行自定义SQL将数据移动到初始状态。这模拟了回滚。我不推荐这种方法
  • 在每个测试开始时重新创建数据库。这很慢,但完全可以接受,因为集成测试通常每天只在构建服务器上运行几次
  • 不要测试WCF服务级别。WCF服务应该只是业务逻辑或数据访问逻辑顶部的一些包装器。因此,不要测试服务级别,而是测试包装层。您可能可以在那里使用事务。这种方法可以与前一种方法很好地结合,这样您就有了一些需要重新创建数据库的小型复杂集成测试集,以及一些可以回滚并使用相同数据库的大型测试集

谢谢。这里真正的问题是我无法控制业务层操作的上下文。它正在调用第三方DAL,该DAL需要在ASP.NET下运行,并检查许可信息。我不能和他们离婚。测试必须在IIS下运行才能工作。第二种方法可能最适合您。上面的答案是正确的,但我要补充的是,应该使用mock来启用单元测试,这样您就可以轻松地在相同的代码基础上构建一套单元和集成测试,mock的问题是它会变成很多代码,你必须精确地模拟你正在模拟的东西。