(武汉市江夏区藏龙北路1号 武汉 430205)
软件即服务(Software-as-a-Service,SaaS)又被称为服务化软件,是一种通过Internet提供软件服务的模式,服务化软件可以使用户在多种途径登录使用,一般是基于Web的方式,用户只需要按需定制、付费使用即可[1]。现有的服务化软件一般都是通过对数据层或数据库层进行设计从而实现定制特性。从数据库的类型角度进行划分,可以将实现定制特性的数据库类型分为以下几种模式[2]。
1)每一个租户均有自己独有的、隔离的数据库;
2)租户之间有一个共享的数据库,但是通过数据架构实现隔离;
3)租户使用共享的数据库和共享的数据架构,但是通过基于数据库的操作实现多租户架构的数据隔离和定制。
服务化软件的定制特性满足了用户的个性化需求的同时,又给服务化软件的质量验证带来新的挑战,如何应对定制特性带来的软件测试挑战是我们要重点关注的[3]。目前已经有学者进行了相关的研究。Tsai W T等[4]针对多租户特性和定制特性带来的数据库设计、数据库隔离、数据库恢复以及持续测试等问题进行了相关研究,提出了一种双层数据库技术以支持定制特性,通过引入本体论的相关方法和元数据驱动的方法实现了SaaS软件的持续测试,提高了SaaS软件的可恢复性。针对服务化软件的可配置性和定制特性的测试问题,侯可佳等[5]针对多租户模式下的SaaS软件的定制特性和可配置性的测试问题进行了研究,提出了一种基于配置之间约束依赖关系生成约束依赖图的方法,通过该方法采用组合测试算法实现了多配置组合的测试,验证了该方法提高了测试效率。针对服务化软件的可伸缩性相关的测试问题,Tsai W T等[6]通过对SaaS的伸缩性进行研究,提出了一些对现有SaaS软件的伸缩性、可拓展性等的测试的评价准则,并提出了一种结合数据挖掘技术和该评价准则的测试方法用于测试SaaS的伸缩性。魏丽佳[7]对SaaS软件的弹性特征进行了研究,提出了一种利用LoadRunner的测试方法,通过该方法可以有效地提高云端资源的利用率。
本文首先从服务化软件与传统软件进行对比的角度展示了服务化软件测试的特点。然后明确服务化软件测试的重点:服务化软件新特性的测试,阐述对不同特性的测试问题以及SaaS技术带来的相关问题。最后对服务化软件测试面临的其他挑战进行总结,为测试人员提高测试效率提供一定的思路。
本文通过将服务化软件与传统软件进行对比,从两者区别的角度对服务化软件的测试定义内容进行描述,分别为传统软件的测试方面和区别于传统软件的服务化软件特性测试方面两个部分。
如表1,从测试类型的角度展示了服务化软件测试内容与传统软件的测试内容的区别和测试重点。
通过表1可以总结出,与传统软件的测试进行对比,服务化软件测试具有以下特点:
1)服务化软件的软件测试类型更多。由于服务化软件采用的是与传统软件不同的开发模式、部署方式、维护方式以及收费方式,其测试类型也因此增加;
2)服务化软件的测试内容更加复杂。由于服务化软件的多租户特性、定制特性、持续更新特性的存在,在给服务化软件带来新的优势的同时也给整个系统架构和维护等多方面带来了影响,不同的测试类型下的测试内容注定更加复杂;
3)服务化软件的软件测试环境和测试工具要求更高。由于服务化软件部署于云端,在搭建测试环境的时候必须考虑云环境下配置影响、访问数量以及Web环境等因素,在这些因素的影响下,测试工具更需要进一步研究,以应对服务化软件在线演化、持续更新的特点,在回归测试以及成本控制方面达到自动化测试的状态是服务化软件带来的新挑战;
4)服务化软件在软件测试的配置管理方面要求更高。因为服务化软件需要在线部署演化和持续更新的特点,在测试过程中的测试介入时间、版本控制和回归测试等多方面都需要优化测试进程管理,需要更加合理的、保证质量的配置管理方法和评价准则。
5)服务化软件在软件测试中的评价准则需要进一步明确。服务化软件由于采用的是一种基于Web的服务的模式,如何评价测试结果与传统的软件测评不同,需要更加关注云环境下的评价准则。
从与传统软件的对比可以发现,服务化软件由于具有新的特性,给服务化软件的测试带来了新的挑战和需求,如何明确新特性下的测试需求和测试重点是测试人员需要关注的,下面针对SaaS新的特性带来的测试问题进行进一步说明。
服务化软件会发展的越来越好,是因为服务化软件有诸多的新特性在应用领域、维护成本和用户体验等方面有更加卓越的优势,而正是因为这些优势,给服务化软件的质量需求带来了新的挑战[8]。通过现有的服务化软件应用的特点可以发现,SaaS应用具有以下新特性:多租户特性、定制特性和持续更新特性,因SaaS技术属于云计算技术,还需考虑SaaS应用实现过程中相关的特性,如可伸缩性、基于SLA(Service-Level Agreement,SLA)的验证问题[9]。
多租户特性是服务化软件的一个基本属性[10],服务化软件为了实现“软件即服务”的理念,需要从软件架构上进行设计实施。多租户是指软件的一个实例在服务器上运行,但是支持多个租户进行登录使用,且各租户使用的软件是独立的软件。服务化软件系统中多租户的主要思想是提供一个基于代码的多态应用程序,该应用程序可以基于用户的需求进行定义和伸缩,这样服务化软件服务提供商可以降低软件生成和维护成本,多租户特性的存在还让用户获得更大的自由度,是服务化软件的一种趋势。
表1 服务化软件测试与传统软件测试对照表
多租户软件即服务(Multi-Tenancy Soft⁃ware-as-a-Service,MTA SaaS)是服务化软件发展的一种主流模式,MTA SaaS提供可共享的、可重用的基础代码和基础数据库,租户在个性化定制的基础上进行使用。多租户特性的实现一般通过以下三种方法:使用数据库、使用虚拟化和通过物理隔离。目前更多的是使用数据库的方式实现多租户特性。具体来说,可以从用户界面层、应用程序层和数据存储层等层次实现多租户特性。
1)SaaS用户界面层上,多租户用户界面实体需要包含客户端组件、用户界面表单、事件流、用户操作流。租户可以通过定制,实现租户所需要的界面需求;
2)SaaS应用程序层上,SaaS应用程序层需要包含多租户应用程序的业务实体,包括业务逻辑、功能需求等多方面的需求,某些功能可以让租户共享,而某些功能依据租户需求定制生成;
3)SaaS数据存储层上,每个租户的SaaS软件对数据存储的隔离以及安全性需求都是测试内容的重点。基于SaaS多租户的特性,一般来说数据库有共享的公共数据库和隔离的租户所属定制内容的对应数据库,云数据的存储不仅需要能共享,还需要实现不同租户的数据隔离。
基于多租户特性,测试人员需要从多个角度对其进行测试。首先需要针对多租户特性的功能性需求进行测试,从用户界面、功能实现、应用程序业务逻辑、数据集成等方面针对多租户特性进行验证测试;其次面对非功能性的需求,如服务的质量、软件的性能、可伸缩性、系统负载和吞吐量等进行严格的测试;最后,需要进行基于租户的安全性测试,安全性测试包括权限安全、网络安全、数据安全等多方面的测试。多租户的架构给软件带来了许多新的挑战,软件的数据库、功能实现、系统稳定都会受到影响,在测试中,需要对多租户特性进行充分的测试。
定制特性是服务化软件系统的一个区别于传统软件的重要特性,通过定制特性,服务化软件系统提供的是一种服务,而不仅仅是一种软件。利用定制特性给用户提供个性化的功能需求,与传统的按需定制软件不同的是,服务化软件不仅提供基于共享特性的软件服务,还可以根据企业本身的特性进行定制功能需求,这一特点使得服务化软件发展迅速[11]。
传统软件中,按需定制是将软件的代码修改进行应用程序重新部署从而达到用户的需求,但是在MTA SaaS模式下,这种定制方式不再适用,由于所有租户共用相同的应用程序实例,一旦采用传统的定制模式,为特定的用户完成定制将会影响所有用户的软件服务,随着租户的增加、功能的更新,这种持续更新的特性将会导致非常严重的服务可用性。所以,目前的MTA SaaS系统一般都是面向特定的领域在提供基础服务的层次上提供定制功能,面向特定领域的定制可以有效地提高公共共享部分代码的利用率,同时在领域范围内进行多层次的定制。一般租户可以从三方面进行租户的个性化定制。
1)用户界面层,租户通过用户界面层的定制,可以定制符合租户要求的个性化的界面;
2)应用程序层,租户可以通过将现有的业务流程、服务功能、业务规则进行个性化的选择,完成符合企业需要的业务功能定制;
3)数据库层,租户可以从配置数据库的模式,包括表和数据属性等相关的数据访问功能进行定制。
SaaS的安全特性和服务功能都可以通过定制,实现符合企业要求的软件服务。面对定制特性,测试人员需要从多方面对其进行测试。
面向定制特性下数据库的共享、定制、备份和恢复,需要能测试出不同场景下,租户权限不同的数据库稳定性和可靠性。用户界面的定制必须符合租户个性化定制的功能需求和业务逻辑,如何测试界面层的稳定性和一致性是保证SaaS质量的重要需求。在应用程序层,定制特性中不同的业务逻辑组合、服务功能的更新等都需要测试人员进行关注。在数据库层,需要考虑不同租户定制后,验证数据库的安全性,确保不同租户的数据的隔离和共享,这对系统的稳定性提出了新的要求。
与传统软件的更新不同,SaaS程序由于多租户的特性以及定制特性的存在,需要更加频繁的更新和升级[12]。每当添加或减少一个租户时,必须对软件进行更新和升级,同时由于软件本身的缺陷修复和定制服务内容的更新,这种升级存在持续性[13]。对于SaaS软件而言,持续更新的特性意味着更多的测试轮次和成本,需要不断的动态测试以保证软件质量,而由于回归测试等多方面的因素导致测试成本很高。
面对这种持续更新的特性,实现在线自动化测试、测试脚本、在线回归测试等需求是必不可少的,而目前大多数的测试更多的是离线测试,所以面对持续更新特性,对测试工具和测试方法要求更高。面对持续更新特性,还需要考虑这种特性下,服务化软件的可伸缩性和定制特性的影响,因为可伸缩性的测试目前还没有一个良好的测试评价标准,这对测试工作也是一个新的挑战。
除了多租户特性、定制特性以及持续更新特性,在SaaS应用中还存在其他的由于SaaS技术带来的测试问题。由于SaaS应用部署在云端,采用云计算技术,同时还具有新的技术特性,所以在这种独特的环境和技术下,对测试的重点、测试的环境都有一定的影响。
3.4.1 可伸缩性测试
在云计算技术中,服务化软件的可伸缩性是一个非常主要的优势,可伸缩性指的是依据负载的增加或减少进行合理地增加或移除云端资源,良好的可伸缩性能根据实际的使用需求分配云端资源,从而从资源的角度实现按需使用,不仅保障云服务的质量,同时也可控制成本[14]。针对可伸缩性的测试,目前还存在以下问题:
1)如何评价服务化软件的可伸缩性。目前还没有一个统一的、公认的标准对云服务的可伸缩性进行衡量,目前评价一个系统的可伸缩性大多集中在资源消耗、处理时间和性能资源比较等方面,也有学者提出一些标准,但都具有一定的局限性,一个统一的评价标准是可伸缩性测试必不可少的;
2)如何测试服务化软件的可伸缩性。目前也有许多学者提出了相关的测试方法,但是由于基于云的可伸缩性分析需要强大的仿真环境、需要构建合理的模型,针对可伸缩性的测试方法还需要进一步研究。
对于可伸缩性的测试问题,需要进一步明确评价一个SaaS应用的标准,虽然一般采用云端应用资源的占有率进行评价,但是该标准不能体现系统对资源的调节情况,不能显示出系统在不同情况下的伸缩性的表现,因此还需要进一步研究,寻找一个更加合适的评价标准。
3.4.2 基于SLA的软件验证测试
服务化软件一般采用基于SLA的形式对客户发布相关的服务级别协议,通过相关的服务级别协议让用户获取对应的服务。一般可以将SaaS应用涉及的SLA协议分为三部分:
1)SaaS功能服务协议。本协议主要用于建立SaaS功能测试中的测试目标和测试重点;
2)SaaS 非功能 QoS(Quality of Service,QoS)协议。本协议主要用于定义QoS的相关需求和目标,尤其是在服务的可伸缩性、可靠性、可用性、性能等方面的相关需求;
3)SaaS计算资源协议和计费标准。本协议包含了SaaS应用使用的云计算资源和相应的收费标准。
通过SLA中的相关的定义,可以让测试人员明确被测SaaS软件的测试重点和测试要求,同时对SLA内容本身的测试也是测试人员需要关注的重点之一。
3.4.3 服务化软件测试环境
由于服务化软件与传统软件存在许多差异,服务化软件的测试环境也有新的要求。一般服务化软件测试环境必须满足以下要求:
1)服务化软件的测试必须要能提供云环境的仿真、能够模拟出系统的可伸缩性或者弹性表现;
2)支持对服务化软件的自动部署和访问验证,由于云设施和传统软件不同,自动化要求较高;
3)能提供大规模的测试模拟和访问仿真;
4)允许测试数据的迁移和测试工具的交互;
5)能够合理分配相应的资源,对回归测试提供便利。
良好的测试环境需要依据被测SaaS应用具体的部署方式、用户群体以及收费方式进行合理的搭建,对于测试人员而言,搭建合理的环境并使用对应的测试工具是我们面临的新挑战。
3.4.4 隔离测试
根据SaaS应用如何实现多租户和定制的方式进行分类,可以将服务化软件的分为以下四个成熟层次[15]。
第一个层次,每一个用户有自己定制版本的SaaS应用,应用实例运行于提供商的服务器上,这个层次与传统的ASP模式类似;第二个层次,提供商为每个用户提供独立的SaaS应用实例,在这个层次中虽然从代码级别上看,应用的彼此相似,但是每个实例与其他的实例完全隔离;第三个层次,提供商通过一个实例为每个用户提供服务,但是可以通过可配置的、可定制的方式为每个用户提供独特的用户需求;第四个层次,提供商将多个用户的实例运行在一个负载均衡的环境中,每个租户的数据保持独立,并可通过可配置的方式为租户提供对应的服务。
通过不同成熟度的SaaS应用对比可以发现,服务化软件的多租户特性和定制特性给测试人员带来了一个需要重点关注的测试内容:隔离测试。在SaaS应用中,隔离测试的目的是保证在多租户架构下各租户数据和配置等的隔离,确保不同租户之间的操作和数据具有独立性,由于这些数据隔离涉及到租户安全和使用体验,在测试过程中需要重点关注[16]。隔离测试中主要关注的内容如下:
1)租户界面定制后的隔离测试;
2)租户数据库内容的隔离测试;
3)租户定制的工作流等配置的隔离测试;
4)租户的权限隔离测试。
租户之间的数据隔离不仅仅是测试人员需要关注的重点,更是服务提供商需要关注的技术重点,目前很多服务提供商通过重新架构或者将软件转为一个服务的方式达到SaaS应用的状态,但是其技术成熟度不足,租户数据隔离技术还需要进一步的测试和研究。
服务化软件采用的是一种部署于云端服务器,用户通过Internet进行访问的软件模式,面对服务化软件新的特性和新的测试环境的挑战,从服务化软件的测试方法的角度看,主要面临以下挑战问题:
可测性是指软件在测试过程中,在一定的测试成本的前提下,进行测试、设计测试流程、实现测试过程、执行测试用例以及对测试结果的定位和回归的能力,可以理解为软件能被测试人员设计和执行测试的难易程度。
由于服务化软件中采用的是一种功能封装,将不同的服务进行封装,成为了相对独立的接口,通过服务的接口的相关描述或定义体现服务对应的需求功能、参数描述等信息。面对服务化软件中不同服务的测试过程,可测性是一个需要面对的挑战问题,由于服务的可测性包含很多方面,如服务的可操作性、可控制性,如何更加高效地对服务进行测试是一个需要关注的重点。
在Web服务中,服务的接口的描述形式存在很多样式,没有一个统一的、适的形式化标注。由于服务接口的描述内容包含了接口的参数的具体要求、约束条件等,服务接口的描述的解析是提高可测性的关键。在提高可测性方面,如何对接口进行测试需要的操作也是一个重点,由于测试的需要,对接口的操作依据不同的需求和协议会有更高的要求。
由于服务化软件的规模一般较大,持续更新特性的存在和多租户的加入都会对服务化软件的测试方法带来影响,自动化测试是服务化软件测试的一种趋势。服务化软件一般采用的是在线部署、在线升级等维护方式,服务化软件面向的互联网环境和复杂的用户群体,对测试而言也提出了新的问题。
由于服务化软件用户数量的庞大、用户操作的不可控性,同时服务化软件运行的系统环境多种多样,因此对于服务化软件的测试来说,需要大量的测试用例以提高测试的覆盖率、解决软件应用场景的复杂性、验证不同用户访问情况下的软件表现等多方面的问题,自动化测试是必不可少的。同时,采用自动化测试可以有效地减少回归测试的成本,提高系统的稳定性。但是服务化软件的自动化测试需要考虑服务化软件在互联网环境下的不同表现,同时需要更好地关注SaaS应用新特性下软件的表现,这对自动化测试的设计和实现都提出了新的挑战,在自动化测试中,如何生成合适的测试数据、如何提高测试的覆盖率、如何更好地测试SaaS新特性下的软件表现都是测试人员需要关注的。
数据库测试包含数据的存储功能测试、安全性测试和恢复性测试等内容。在服务化软件中,由于定制特性和多租户特性的存在,对数据库测试提出了新的要求。由于租户所属的定制内容、定制功能和工作流的不同,租户存储的数据也存在差异,对数据库的操作也会因此产生不同的结果;同时,因为服务化软件部署在云端服务器,对数据迁移有一定的要求,这对测试而言也是必须要考虑的。
现有的数据库测试方法不能完全适用于服务化软件,因此在面对服务化软件带来的新问题时,需要更好的测试环境允许测试人员对数据库的各种表现进行测试,需要更有效的测试方法测试不同租户的数据存储、隔离和迁移等方面的问题。
回归测试是软件测试中一个重要的过程,由于测试是在有限成本的情况下尽可能发现更多的问题,通过回归测试,即可以对上一轮测试进行补充,同时还可以测试因为软件缺陷修改带来的新问题。对于服务化软件而言,由于不断有租户的加入和退出,同时系统本身还存在更新和维护,使得系统处于持续更新的状态,在这种情况下,回归测试会更加频繁。
对于传统的软件而言,客户使用的应用程序版本和配置较为固定,回归测试的成本可以控制,面对服务化软件的持续更新状态,需要测试人员需要使用更加有效率的测试方法,在服务化软件回归测试方面,对应的测试方法研究还不足,需要进一步研究。
目前服务化软件的测试方法多采用传统软件的测试方法,目前的发展趋势是模型驱动的测试方法[19],然后使用自动化测试工具进行测试,在回归测试中,自动化测试也是发展的一种趋势[20]。面对着SaaS技术和服务化软件的应用带来的挑战,还需要进一步研究,采用更加有效的测试方法和更加便捷的测试工具以应对新的挑战。
本文讨论了服务化软件软件测试的测试内容、测试目的、测试对象,并从测试类型和测试内容上与传统软件的测试进行了对比。通过服务化软件多租户特性、定制特性和持续更新特性的方面出发,讨论了测试服务化软件新特性所面临的主要问题、测试对象以及测试重点,以及SaaS技术在实现过程中测试所需要关注的主要问题,最后对服务化软件的测试面临的其他挑战进行了明确。面对这些新的挑战,已经有一些学者提出一些新的测试方法,但是如何解决服务化软件新特性带来的新挑战还需要进一步研究。