代码之家  ›  专栏  ›  技术社区  ›  ATL_DEV

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

  •  1
  • ATL_DEV  · 技术社区  · 16 年前

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

    1 回复  |  直到 16 年前
        1
  •  2
  •   Ladislav Mrnka    16 年前

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

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