Asp.net 针对测试数据库集成测试web服务
我目前正在构建一个.net web应用程序,它使用WCF web服务允许Flex前端访问数据库 我正在web服务上设置一些单元/集成风格的测试,并试图找出允许测试访问和修改单独测试数据库中数据的最佳方法 目前,单元测试项目中的连接字符串指向测试数据库,web服务项目中的连接字符串指向开发数据库。然而,当我使用Linq时,当我从测试类调用web服务方法时,它似乎使用了开发数据库连接字符串 我曾研究过创建模拟对象或内存数据库,但我相信同样的问题也会发生Asp.net 针对测试数据库集成测试web服务,asp.net,wcf,linq,unit-testing,linq-to-sql,Asp.net,Wcf,Linq,Unit Testing,Linq To Sql,我目前正在构建一个.net web应用程序,它使用WCF web服务允许Flex前端访问数据库 我正在web服务上设置一些单元/集成风格的测试,并试图找出允许测试访问和修改单独测试数据库中数据的最佳方法 目前,单元测试项目中的连接字符串指向测试数据库,web服务项目中的连接字符串指向开发数据库。然而,当我使用Linq时,当我从测试类调用web服务方法时,它似乎使用了开发数据库连接字符串 我曾研究过创建模拟对象或内存数据库,但我相信同样的问题也会发生 有没有办法让它发挥作用,或者我关于我想要什么的
有没有办法让它发挥作用,或者我关于我想要什么的全部想法都不正确,在这种情况下,有没有更好的方法来设置它?我在项目中的时间还早,因此我不反对对解决方案的体系结构进行重大更改。确保web服务中的代码是最少的,而不仅仅是对服务层的简单调用。当您这样做时,您可以跳过直接调用web服务,并创建一个也调用您的服务层的集成测试套件。在这种情况下,您正在进行进程内呼叫,而不是通过网络进行呼叫。在这种情况下,确保访问正确的数据库会容易得多,并且您可以轻松地用将回滚的数据库事务包装这些调用。您当然希望将任何操作回滚到数据库,因为这将很难维护。一种方法是使用内部测试
祝你好运。史蒂文的建议是在测试中取消WCF管道。这当然可以工作并测试大部分业务逻辑,但我希望我的自动化集成测试也可以测试WCF交互 我已经在我的项目的自动化测试中成功地实现了这一点 请注意,WCF客户端和WCF主机可以共享同一进程。在这种情况下,它仍在通过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(例如,抛出一个故障契约未指定的异常)。
今天我的代码有一个bug,这意味着频道没有被正确关闭。我的测试一直挂起,因为达到了节流极限。花了一些时间才弄明白,但我很庆幸这个bug没有进入生产
您的测试套件应该在运行第一个测试之前设置服务主机。(我曾尝试在每次测试中设置和拆除服务主机,但运行速度太慢)
祝你好运。由于WCF web服务类没有绑定到ASP.Net基础结构(不必从Syste.web.Services.WebService继承),因此可以轻松地将对存储库或对象上下文的引用插入到服务中。然后,您可以使用单元测试来测试web服务本身中的任何逻辑,单元测试将使用一些内存中的模拟存储库,然后快速运行。另一方面,集成测试将使用一些真实的数据库,您可以捕获与持久层相关的错误。因此,我不同意Steven的观点,即web服务方法应该是调用某个服务层的单行方法,除非逻辑太重,应该有自己的类。我决定使用TransactionScope将调用保留在流程中,而不是保存到数据库中。这似乎也会减少运行测试所需的时间。