2009-05-01 70 views
1

第一次海报和TDD采用者。 :-)我会有点冗长,所以请耐心等待。Webservices的端到端测试

我最近开始使用Apache CXF框架Spring和Commons Chain开发基于SOAP的Web服务来实现业务流。我在这里面临的问题是测试Web服务 - 像单元测试和功能测试一样进行测试。

我在单元测试中的第一次尝试是完全失败。为了保持单元测试的灵活性,我使用了一个Spring XML文件来保存测试数据。另外,我没有创建要测试的“组件”实例,而是从我的Spring应用程序上下文中检索它们。包含数据的XML文件很快就失控了;用XML创建对象图变成了一场噩梦。由于要测试的“组件”是从Spring应用程序上下文中选取的,因此每个测试运行都会加载我应用程序中涉及的组件,使用的DAO对象等。此外,与单元测试案例集中或专注于测试组件,单元测试开始触及数据库,与邮件服务器进行通信等。糟糕,非常糟糕。

我知道我做错了什么,并开始想办法纠正它。根据本主板的其中一篇帖子的建议,我查阅了Java嘲笑框架Mockito,以便我可以不使用真正的DAO类和邮件服务器,只是模拟功能。由于单元测试有点受到控制,这引起了我的第二个问题;对数据的依赖。我一直在开发的Web服务几乎没有逻辑,但对数据依赖性很强。作为一个例子,考虑我的组件之一:

public class PaymentScheduleRetrievalComponent implements Command { 
    public boolean execute(Context ctx) { 
    Policy policy = (Policy)ctx.get("POLICY"); 
    List<PaymentSchedule> list = billingDAO.getPaymentStatementForPolicy(policy); 
    ctx.put("PAYMENT_SCHEDULE_LIST", list); 
    return false; 
    } 
} 

大多数我的组件都遵循同样的路线 - 从上下文选择一个域对象,打DAO [我们正在使用iBATIS的SQL映射在这里]并检索结果。

所以,现在的问题:
- 如何在DAO类ESP测试时,一个插入或更新用可能会留下一个“不稳定”状态的数据库[在情况下,假设3插入到不同的表实际上形成一个单一交易]?
- 功能测试Web服务的事实标准是什么,它围绕着大量数据移动,即从数据存储区无意识插入/检索?

您的个人经验/评论将不胜感激。请让我知道,以防我在解释手边的问题时遗漏了一些细节。

-sasuke

回答

1

我会建议的内存数据库针对运行单元测试,如HSQL。您可以使用它来即时创建模式(例如,如果您使用的是Hibernate,则可以使用XML映射文件),然后在单元测试结束之前销毁数据库之前根据需要插入/更新/删除。您的测试在任何时候都不会干扰您的实际数据库。

对于第二个问题(Web服务的端到端测试),我已经成功地单元测试过基于CXF的服务。诀窍是在测试开始时使用轻量级Web服务器发布您的Web服务(Jetty是理想的),然后使用CXF将客户端指向您的Web服务端点,运行您的调用,然后关闭Jetty实例在您的单元测试完成后托管您的Web服务。

为了实现这一目标,您可以使用JaxWsServerFactoryBean(服务器端)和JaxWsProxyFactoryBean(客户端)提供了CXF班,看到这个页面的示例代码:

http://cwiki.apache.org/CXF20DOC/a-simple-jax-ws-service.html#AsimpleJAX-WSservice-Publishingyourservice

我也给对SOAP UI进行功能测试的重要工具。 JMeter对于Web服务的压力测试也非常有用,这对于那些进行数据库查询的服务来说是特别重要的。

+0

使用JaxWsServerFactoryBean的简单Junit规则:https:/ /github.com/skjolber/mockito-soap-cxf – ThomasRS 2016-11-24 12:56:01

1

首先:有没有你要检索的Spring应用程序上下文中测试(SUT)这个问题的原因是什么?对于高效的单元测试,您应该能够在没有上下文的情况下创建SUT。听起来你在某处有一些隐藏的依赖关系。这可能是你头痛的根源。

如何DAO类ESP测试时 单个插入或更新用可能 留下一个“不稳定” 状态的数据库[在情况下,假设3 插入到不同的表 实际上形成一个单一的交易] ?

在运行测试后,您似乎很担心数据库的一致性。如果可能的话,使用自己的数据库进行测试,在那里你不需要关心它。如果你有这样的沙箱数据库,你可以根据需要删除数据。在这种情况下,我会执行以下操作:

  1. 用一些通用标识符标记所有假数据,例如为字段添加特殊前缀。
  2. 在运行测试之前,删除删除语句,删除标记的数据。如果没有,那么没有什么不好的事情发生。
  3. 运行您的单个DAO测试。之后重复步骤2.进行下一个测试。

什么是 功能测试的Web服务, 移动的事实上的标准各地大量的数据,即 盲目插入/从 数据存储检索?

我不知道任何。从你所问的问题中,我可以推断出你有一方面是Web服务,另一方是数据库。分解责任。为每一方都有独立的测试套件。一方只是测试数据库访问(如上所述)。另一方面只是测试Web服务请求和响应。在这种情况下,它支付存根/伪造/模拟与网络交谈的层。或考虑https://wsunit.dev.java.net/

如果程序只是推进数据进出,我认为没有太多的行为。如果是这种情况,那么最难的工作是单元测试数据库端和Web服务端。关键是你可以做单元测试,而不需要“现实”的数据。对于功能测试,您将需要手写的数据,这接近实际。这可能很麻烦,但如果您已经单元测试了数据库和Web服务部件,这应该大大减少对“实际”测试用例的需求。

0

我必须说我并不真正了解 您确切的问题。问题 在运行 测试后,数据库是否处于 更改的状态?

是的,这里实际存在两个问题。首先是运行测试用例后数据库处于不一致状态的问题。第二个是我正在寻找一个优雅的Web服务端到端测试解决方案。

对于高效的单元测试,您应该能够在没有 上下文的情况下创建SUT。这听起来像你在某处有一些隐藏的依赖关系 。那 可能是你头痛的一些根源。

这确实是我头痛的根本原因,现在我正要用一个嘲讽框架的帮助来消除这个问题。

看来你是担心 数据库的constistency你有 运行测试后。如果可能,请使用 自己的数据库进行测试,其中 不需要关心它。如果您有 这样的沙盒数据库,您可以根据需要删除 数据。

这的确是解决我在以前的文章中提到的问题之一,但在其数据库/数据是不是在你的控制遗留系统集成时,这可能不是在所有情况下工作ESP以及在某些DAO方法要求某些数据已经存在于给定的一组表中的情况下。我应该看看像DBUnit这样的数据库单元测试框架吗?

在这种情况下,它支付 存根/假/嘲笑交谈 网络层。或考虑 https://wsunit.dev.java.net/

啊,看起来很有趣。我也听说过SOAPUI等可用于功能测试的工具。这里有人有这种工具的成功吗?

感谢所有的解答和道歉模棱两可的解释;英语不是我的第一语言。

-sasuke

1

首先,把事情弄清楚。

在一个理想的世界,你正在构建软件的生命周期是这样的: - SY使得与客户的报告,这样你就得到了一个用户故事有关程序应该如何工作 例子 - 你概括用户故事,所以你有规则,你称为用例 - 你开始写一个功能(端到端)测试,并失败... - 之后,你建立用户界面和模拟出服务,所以你得到了一个绿色的功能测试和一个关于你的服务应该如何工作的规范...... - 你的工作是保持功能测试为绿色,并逐步实现服务,编写集成测试,并嘲笑依赖直到达到单位t的水平ests - 之后,您将对用例进行下一次迭代,编写下一个功能测试,直到项目结束 - 之后,您将与接受该产品的客户进行验收测试,并支付一个很多

那么,为什么我们从中学到了:

  • 有许多类型的测试(不互相混淆)
    • 功能测试 - 用于测试使用情况(模拟出没有)
    • 集成测试 - 用于测试应用程序,组件,模块,类交互(模拟出不相关的组件)
    • 单元测试 - 用于测试与其环境隔离的单个类(模拟出所有内容)
    • 用户验收测试 - 她接受产品(手动功能测试或自动功能测试在工作中的演示)
  • 您不需要通过功能测试和集成测试来测试所有内容,因为这是不可能的。通过功能和集成测试只测试相关部分,并通过单元测试测试所有内容!熟悉testing pyramid
  • 使用TDD,它使生活更轻松!
  • 如何DAO类ESP测试时,一个插入或更新用可能使数据库处于“不稳定”状态[在情况下,让我们 说3插入到不同的表实际上形成一个 交易]?

您不必测试数据库事务。假设它们工作正常,因为数据库开发人员已经对它们进行了测试,并且我相信您不想编写并发性测试... Db是外部组件,因此您不必亲自测试它。您可以编写数据访问层以使数据存储适应您的系统,并仅为这些适配器编写集成测试。在数据库迁移的情况下,这些测试也可以通过新数据库的适配器工作,因为您编写它们以实现特定的接口...通过任何其他测试(功能测试除外),您可以嘲笑数据访问层。对所有其他外部组件也一样,写适配器并将它们模拟出来。将这些集成测试放到与其他测试不同的测试套件中,因为它们由于数据库访问,文件系统访问等而速度很慢......

  • 什么是它周围很多从数据存储中的数据,即无意识的插入/检索 的移动功能测试Web服务的事实标准?

你可以模拟出你的数据存储与中实现相同的存储适配器内存数据库,直到你实现一切,除了数据库的人。之后,您将实现数据库的数据访问层,并使用功能测试对其进行测试。它会很慢,但它只能运行一次,例如每次发布新版本......如果您需要通过开发来进行功能测试,那么您可以再次使用内存解决方案进行嘲讽...另一种方法是仅运行受影响的功能测试,通过开发或修改测试数据库的设置以使事情更快,等等......我确信有很多测试优化解决方案......