测试服务:SOA的完整性和扩展性

日期: 2008-08-03 作者:Daniel Rubio 来源:TechTarget中国 英文

随着开发软件往可复用服务的迁移,很多软件开发生命周期中的范式被开发了出来。正如面向对象要求一个特别的概念集合来达到有效的开发,面向对象架构也带来了它共享的具体途径。在接下来的段落中,我们将会我们将会探索开发服务的许多重要方面中的一个:测试。   依赖于你们组织中的软件管理类型,测试可以通常作为一个全局过程或者最高优先权的过程。

以前的方法,在代码行之间用敏捷开发技巧,强迫把测试推迟到服务被完全实现以后才进行测试,而随后的服务就会采用这个还没有经过测试的服务,并且不等到你使之成为一个“准备好”的服务。   当有支持者确认了一个调查,在开始就 进行测试并且采用敏捷原则比直到最后的开发阶段才测试更有好……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

随着开发软件往可复用服务的迁移,很多软件开发生命周期中的范式被开发了出来。正如面向对象要求一个特别的概念集合来达到有效的开发,面向对象架构也带来了它共享的具体途径。在接下来的段落中,我们将会我们将会探索开发服务的许多重要方面中的一个:测试。

  依赖于你们组织中的软件管理类型,测试可以通常作为一个全局过程或者最高优先权的过程。以前的方法,在代码行之间用敏捷开发技巧,强迫把测试推迟到服务被完全实现以后才进行测试,而随后的服务就会采用这个还没有经过测试的服务,并且不等到你使之成为一个“准备好”的服务。

  当有支持者确认了一个调查,在开始就 进行测试并且采用敏捷原则比直到最后的开发阶段才测试更有好处,我们暂且不管这些,我们先把关于何时把测试引入到你具体的工程中去的讨论搁置一边,让我们关注一下如何进行测试。

  测试决不是一个简单的东西,有很多不同的测试类型可以应用在软件上。依据测试的复杂性和领域 ,即使专业的团队——QA团队——可以被雇来完成特定的任务,但是是为了特定的目定,我们将会关注两种类型的测试,他们都相对容易的开发:单元测试和压力测试。

  单元测试是指通过预先定义的一些列数据集合来验证一个服务的既定目的的过程,这个数据集合是用来模拟显示世界的用法从而能够及时的方式来探测到缺陷。当为你的服务进行单元测试的时候, 在服务被发布为正是的产品以前你可以把他们看成安全保护网,因为你能够在实际数据流在这个系统运行之前使用这些预先的数据集合来测试你的服务的逻辑。

  另外一个单元测试为你的开发带来的那些好处在当你的系统开始用上了一段时间之后就会更加突出了。因为演化的服务意味着底层逻辑的修改,这些修改可能会破坏服务本来被希望忙足的一些具体的使用设定。尽管如此,通过现有的单元测试套件,并且保证一直保持同这些测试的一致,保护任何使用你服务的依赖部分免受在以后可能新的修订中带来的任何破坏

  实际的单元测试的进行很大程度上依赖于编程语言或者你使用来部署你的服务的平台,但是更加可能的情况是为了能更容易的进行测试的步步为营,确认和部署,将会通过一个特定的框架来完成这些 ——换一句话说就是, 自动化的进行所有的能够使得单元测试成为必需的过程。

  在所有的最流行的单元测试的框架中有:Java的JUnit 和.NET的Unit Testing Framework ,Unit Testing Framework 构成了Visual Studio的一部分。对于深度的解释他们的框架或者其他的一些单元测试套件将不会在本文中讨论,但是列表1.1展示的就是一个Java支持的服务的Junit测试是怎样的。

  列表1.1 对Java类构成的Web Services的Junit单元测试

  import junit.framework.*;
  public class PayrollTest extends TestCase {
      private Payroll basePayroll;
      private Employee accountingE;
      public PayrollTest(String type) {
          super(type);
      }
     protected void setUp() {
   // Initialize Payroll object
          basePayroll = new Payroll();
    // Generate employee, assign to payroll
          accountingE = new Employee("John Smith", 5743.00);
          basePayroll.addEmployee(accountingE);
      }
      protected void tearDown() {
   // Reinitialize Payroll object
          basePayroll = null;
      }
      public void testAddEmployee() {
          Employee contractE = new Employee("Auditor", 2843.00);
          basePayroll.addEmployee(contractE);
           double totalPayroll = accountingE.getSalary() +   contractE.getSalary();
          assertEquals(totalPayroll, basePayroll.getTotal(), 0.0);
           assertEquals(2, basePayroll.countEmployees());
      }
      public void testEmptyPayroll() {
          basePayroll.emptyPayroll();  
          assertTrue(basePayroll.emptyPayroll());
      }
         public void testEliminateEmployee() throws EmployeeNotFound {
          basePayroll.eliminateEmployee(accountingE);
          assertEquals(0, basePayroll.countEmployees());
          assertEquals(0.0, basePayroll.getTotal(), 0.0);
      }
       public static Test suite() {
          TestSuite suite = new TestSuite(PayrollTest.class);
   return suite;
       }
      public static void main(String args[]) {
          junit.textui.TestRunner.run(suite());
       }
   }

  这个测试列表表示的是对两个将会用来构成决定薪水册的数据的Web service进行测试的一个例子。请注意Payroll和Employee类的实例是如何创建的,它们都会被后面的testXXX()命名的方法来操纵。一旦被这些方法操作,请注意看到是通过不同的以assertXXX()命名的Junit方法来调用的。

  用来调用预先定义的数据块的不同的断言方法的参数在底层的服务类之间传递,在这些类上进行同所期望的值进行比对,这个比对是在当测试框架给出一个错误或者返回一个正确的执行的时候进行。

  单元测试是用来验证一个服务逻辑的完整性,重点测试是用来决定一个服务在一个特定的用户附载的时候应该具有什么样的行为,它是一个可以帮助决定对一个服务的基础架构的适当支持的过程,这些基础架构包括如硬件能力,应用程序配置和可以获得的网络带宽,以及其他的东西。

  一个可以帮助你进行压力测试的工具是JMeter ,它是一个由Apache组织开发的一个开源项目。尽管Jmeter是基于java的,它可以产生SOAP和XMLRPC类型的请求,有效地发挥一个Web services客户端的功能,来压力测试任何服务端的部署。图1.1展示的是一个使用这个工具进行的在SOAP/XML-RPC服务上的附载测试。

  图1.1:Jmeter对Web services的压力测试

  在Jmeter中创建上述的压力测试的过程如下:

  1. 在Jmeter的主界面,将你的鼠标移动到Test Plan按钮上并点击右键。从弹出的菜单中选择:Add – Thread Group。Thread Group按钮将会被创建。

  2.定位在Thread Group按钮上左边的窗体中将会显示不同的参数。参数Number of threads 表示的是你的压力测试将会对你的服务仿效的请求的数。

  3.下一步,当鼠标在Thread Group按钮上点击右键,从弹出的菜单中选择:Add – Sampler – SOAP/XML-RPC Request。SOAP/XML-RPC请求按钮将会被创建。

  4.鼠标定位在SOAP/XML-RPC请求按钮,左边的窗体中将会显示不同的参数。有关于你的Web service的URL的介绍,以及你希望发出的每一个请求的载荷。

  5.当鼠标在SOAP/XML-RPC请求按钮上时,点击右键,从弹出的菜单中选择:Add – Listener – Monitor Results,和Add – Listener – View Results。两个显示压力测试结果的按钮将会生成。注意:如果需要,你可以添加更多的监听者,这是Jmeter进行压力测试结果的表示术语。

  6.保存你的测试,并从最高层的菜单中选择Run-Start选项开始你的压力测试。

  7.最后移动你的鼠标到每一个不同的Listener按钮上, 观察你在对你的Web service进行压力测试时获得的性能参数。

  和单元测试框架相类似的本质,解释Jmeter的许多复杂——或者任何其他压力测试工具的这方面的问题——将会超出本文的范围,但是Jmeter提供了全面可理解的并可自由获取的文档来解释不同的压力测试功能。

  我们总结我们对在Web services环境下单元测试和压力测试的认识,这是在很多的测试过程中你可以在你的面向服务设计中的两个方法,从而能够确保你的部署的完整性和可测量性。

相关推荐

  • 事件驱动框架和SOA在空军的应用

    空军正在利用SOA来改善数据共享,并实时跟踪战机,美国空军机动司令部的Michael Marek解释了企业可从中学习的经验。

  • 揭秘New Relic APM技术细节

    New Relic应性能管理(APM)套件主要用于Web软件开发。它允许用户在面向服务的架构(SOA)上跟踪关键事务性能,并且支持代码级别的可见性来评估特定代码段和SQL语句对性能的影响

  • 仅凭SOA和云无法解决业务数据管理风险问题

    SOA和云可以是某些恼人问题高效的解决方案;这一点我们已经知道了。但是也要记住它们并不是所有事情的直接答案,特别是当你的问题是业务数据管理风险,而不是技术问题时。

  • 为什么必须使用构建服务器?

    技术经理有时质疑构建服务器没用,因为似乎单个开发人员通过在本地机器上构建也能达到相同的结果。但是,构建服务器和开发人员自行构建方案相比有几个重要优势。