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

根据测试数据库集成测试web服务

  •  4
  • Steve  · 技术社区  · 14 年前

    我目前正在构建一个.net web应用程序,它使用wcfweb服务允许Flex前端访问数据库。

    我正在web服务上建立一些单元/集成风格的测试,并试图找到允许测试访问和修改单独测试数据库中数据的最佳方法。

    目前,单元测试项目中的连接字符串指向我的测试数据库,而web服务项目中的连接字符串指向我的开发数据库。但是,当我使用Linq时,当我从测试类调用web服务方法时,它似乎使用了开发数据库连接字符串。

    我已经研究过创建模拟对象或内存数据库,但我相信同样的问题也会发生。

    有没有办法让它起作用,或者我对我想要的东西的全部想法都不正确,在这种情况下,有没有更好的方法来设置它?我在我的项目中还很早,我并不反对显著地改变解决方案的架构。

    3 回复  |  直到 14 年前
        1
  •  1
  •   Steven    14 年前

    确保web服务中的代码是最小的,并且不超过对服务层的简单调用。当您这样做时,您可以跳过直接调用web服务,并创建一个集成测试套件,该套件还调用您的服务层。在这种情况下,您正在进行进程内调用,而不是通过网络调用。在这种情况下,确保访问正确的数据库会容易得多,而且您可以轻松地用将回滚的数据库事务包装这些调用。您当然希望将任何操作回滚到数据库,因为它将很难维护 RTM tests . 一种方法是使用 TransactionScope

    祝你好运。

        2
  •  5
  •   Andrew Shepherd    14 年前

    史蒂文的建议是取消WCF管道的测试。这当然可以工作并测试大部分业务逻辑,但我希望我的自动化集成测试也能测试WCF交互。

    我已经在我的项目的自动化测试中成功地实现了这一点。

    为了说明这一点,下面是如果客户机和服务处于同一进程中,配置文件的外观。

    <configuration>
      <connectionStrings>
        <add name="ContractsManager" 
             providerName="System.Data.SqlClient" 
             connectionString="Data Source=localhost;Initial Catalog=ContractsManager_AutoTest;Integrated Security=True;Pooling=False;Asynchronous Processing=true;Application Name=CmAutoTests"
             />
      </connectionStrings>
        <system.serviceModel>
    
            <client>
                <endpoint
                    name="LoggingService"
                    address="net.tcp://localhost:9612/loggingService"
                    binding="netTcpBinding"
                    contract="ContractsManager.ILoginService" />
            </client>
            <services>
                <service name="ContractsManager.LoginServiceImpl">
                    <endpoint
                        address="net.tcp://localhost:9612/loggingService"
                        binding="netTcpBinding"
                        contract="ContractsManager.ILoginService">
                    </endpoint>
                </service>
            </services>
        </system.serviceModel>
    </configuration>
    

    这样,您的自动化测试将发现特定于WCF的bug(例如,引发一个未由故障契约指定的异常)。

    您的测试套件应该在运行第一个测试之前设置服务主机。(我试过在每次测试时设置和删除服务主机,但运行速度太慢)。

    祝你好运。

        3
  •  0
  •   Ivan Gerken    14 年前