Java 如何最好地使web服务使用者能够集成测试事务性web服务?

Java 如何最好地使web服务使用者能够集成测试事务性web服务?,java,web-services,unit-testing,Java,Web Services,Unit Testing,我希望允许web服务层(web服务是用Java编写的)的使用者创建自动集成测试,以验证使用者将使用的web服务层版本是否仍然适用于使用者(也就是说,web服务与使用者处于不同的发布生命周期中,它们的API或行为可能会发生变化——它们不应该在不通知使用者的情况下发生变化,但此自动测试的目的是验证它们没有发生变化) 如果web服务实际执行一个事务(更新数据库表),我该怎么办?是否有一种常见的做法,即如何处理这个事务,而不必将逻辑放入web服务本身,以便在单元测试中了解其内容,并在完成后回滚事务?(基

我希望允许web服务层(web服务是用Java编写的)的使用者创建自动集成测试,以验证使用者将使用的web服务层版本是否仍然适用于使用者(也就是说,web服务与使用者处于不同的发布生命周期中,它们的API或行为可能会发生变化——它们不应该在不通知使用者的情况下发生变化,但此自动测试的目的是验证它们没有发生变化)

如果web服务实际执行一个事务(更新数据库表),我该怎么办?是否有一种常见的做法,即如何处理这个事务,而不必将逻辑放入web服务本身,以便在单元测试中了解其内容,并在完成后回滚事务?(基本上是处理web服务测试的能力).或者这是推荐的方法吗


消费者由我们公司的一个开发团队创建,web服务由一个单独的团队创建。测试将在集成环境中运行(集成环境是QA功能测试人员使用的测试环境后面的一个环境,产品环境后面的一个环境)

我的选择是在生产和预生产中托管web服务层。您的客户可以根据预生产进行测试,但不会为他们的交易付费


显然,这需要您同时更新生产和预生产。

解决这类问题的最佳方法是

将数据库处理代码放入一个或多个注入webservice的服务中,并创建在测试环境中使用的模拟版本,这些版本不会实际更新数据库,或者在测试控制下添加重置功能

通过这种方式,您的测试可以运行真正的Web服务,而不是真正的数据库,并且测试可以更容易地重复

Java中的依赖项注入可以使用(除其他外)或.Guice来完成。Guice稍微轻量级一些

在您的情况下,根据系统属性在应用程序启动期间做出注入决策可能是明智的,正如您所注意到的


如果某些测试需要实际更新数据库以使其有效,那么数据库处理的测试版本将需要使用真实的数据库,但还应提供一种可从测试访问的方法,以将数据库重置为已知的(可能为空)状态,以便可以重复测试。

让web服务不加更改地运行,并更新数据库中需要的任何内容

集成测试应检查每个测试步骤后是否写入/更新了正确的数据库记录。
我们使用soapUI测试床来实现这一点。
您可以用Groovy和Java编写测试后断言脚本,它可以使用JDBC轻松地连接到db并检查记录

人们担心使用实际的数据库——我不会对此挂断电话,这实际上是一件好事,有助于建立一个真正准确的测试平台。
关于db的“状态”,您可以通过多种方式进行处理:

  • 在测试运行之前,将数据库还原为已知状态
  • 让测试自行清理
  • 让db随着更多测试的运行而充满,并偶尔清理它
我们现在已经采取了最后一种方法,但如果出现问题,将来可能会改变。
实际上,我并不介意用记录填充数据库,因为它使数据库更像一个真正的客户数据库。在调查测试失败时,它也非常有用。

例如,cxf允许您更改传输层。因此,您只需更改配置并使用localTransport。然后,您就可以在不使用y网络活动。非常适合测试(联合国)marhasling。其他所有内容都应该分开,以便业务逻辑不知道Web服务,因此可以将其作为任何其他类进行测试

谢谢--请参阅第三段中的其他上下文。也许您可以在WSDL中定义一些版本号,并让开发消费者系统的团队检查该版本号?我很高兴ont希望必须修改测试环境和生产环境之间已部署的工件(修改注入的内容),或者使用单独的工具来执行DI,例如Spring(除非有我可以轻松部署的非常轻量级的东西)。我可以在代码中添加一个检查来检查系统属性,如果我们在测试环境中,那么将创建的web服务实例就是测试实例。好主意/坏主意?如果我真的想执行db事务呢?(有些情况下我必须执行它才能成为有效的测试)