云端测试和性能测试实战

2020-11-03 10:06:50 浏览数 (1)

来源:http://www.uml.org.cn

随着越来越多的应用程序开始采用云端部署的方式,包括微软 Azure、谷歌云、亚马逊 AWS 或者国内的阿里云、腾讯云等, 怎样确保在本地正常工作的生产代码(Production Code)在部署到云端以后,还能继续提供符合预期的结果?另外,当应用程序部署到不同平台之后,其响应速度是否还能像在本地一样快?这涉及到两个专门的课题:云端测试和性能测试。

本课将分别介绍这两种测试的方法和策略。

云端测试的方法和策略

“云端测试”这个概念实际上包括两层含义:

1.从本地测试机器,测试部署在云端的应用程序(这种方式又称“测试云端程序”)。

2.用位于云端的测试机器,测试部署在本地或者云端的应用程序(又称“用云测试”,或者 TaaS,即 Test as a Service)。

从本地测试机器,测试部署在云端的应用程序

根据我的经验,本地程序和云端程序的测试,主要区别包括以下两点:

1.登录机制:在本地环境中,因为大部分都是位于企业网络内部,所以登录机制可能较为简单。但是在公共云环境中,处于安全考虑,云服务供应商都提供了一系列的登录机制,这可能会使本地的测试代码失效。针对这种方式的不同,就需要开发人员在开发阶段就考虑到云端测试的需要,提供一定的 API 级访问方式。如果是前端的 UI 测试,一般可以直接通过鼠标点击、输入账号的方式直接进入程序界面,但是这面临着是否需要在测试代码中写入登录密码的安全问题。

2.网络状态:在本地企业网络中,网络条件是可以预期的,但是在公有云中,网络和虚拟机的配置往往是存在一定不确定性的。这意味着测试可能会因为一些未知因素而失败。这意味着在本地进行测试时,也要模拟出一定的网络故障、配置错误,检查生产程序对于这些情况的处理。

同时,云端测试也提供了很多有用的功能,譬如云服务供应商一般都提供了全面的监控、诊断工具,便于测试人员、维护人员分析运行状态和查找日志。以微软 Azure 所提供的 ApplicationInsight 服务为例,用户可以看到每个微服务的响应速度、状态和访问负载,所有日志都可以通过查询获得,便于在出现故障时发现根本原因。

总而言之,如果是从本地测试机器,对部署在云端的应用程序进行测试,需要注意下面三点:

1.在开发阶段考虑到云端部署的登录机制与本地的差异;

2.在本地测试时模拟云端可能出现的网络故障和错误;

3.使用云服务商所提供的监控工具,对微服务的运行情况进行全面监控。

用云测试(TaaS)

这种新兴的模式,就是所谓的测试即服务(TaaS)。简单地说,其过程就是:云服务商提供包含多种浏览器、多种配置的测试平台(也被称为“测试云”),开发团队先在本地把自动化测试脚本编写好,再上传给测试云,从云端运行这些脚本,从而测试所指向的本地或者云端应用程序。

这种方式的好处非常明显:

节约环境配置时间。云测试提供了一整套测试环境,测试人员利用虚拟桌面等手段登录到该测试环境,只需设置简单的一些参数,或者提供简单的测试脚本,就能立即在云端执行测试。这将软硬件安装、环境配置、环境维护的代价转移给了云测试提供者(公共云的经营者或私有云的维护团队)。以现在的虚拟化技术,在测试人员指定硬件配置、软件栈(操作系统、中间件、工具软件)、网络拓扑后,创建一套新的测试环境只需几个小时。如果测试人员可以接受已创建好的标准测试环境,那么可以立即登录。而且,由于是基于网络的应用,当测试中遇到软件使用上的问题时,亦可获得云测试服务商远程快速支持,而很少会出现停滞甚至停止测试现象。

装配完备。云测试不但可以提供完整的测试环境,还可以提供许多附加服务。对于测试机,它可以提供还原点,以便测试人员将虚拟机重置到指定状态。对于测试执行,它可以监控被测试程序的一举一动,例如注册表访问、硬盘文件读写、网络访问、系统日志写入、系统资源占用率、内存映像序列化、屏幕录像等。将这些信息与测试用例一起展现出来,可以帮助测试人员发现问题,定位错误。对于大规模的测试,云测试可以提供多台测试客户机,从主控机上下载测试用例,执行并汇报测试结果,主控机将结果汇总后报告给测试人员。实际上,这些功能已经被各种工具所实现,云测试平台的任务是整合它们,提供统一、完备的功能。这样,测试人员就可以将精力最大限度地投入到专属的测试领域中,而不是管理各种工具。

节约成本。每个企业都在追求成本最低和利润最大化。软件测试作为研发生产过程的一部分也有降低成本的要求,即使用最少的机器购买最少的测试软件来完成软件测试工作。利用云测试可实现巨大节省,不需要购买或准备很多的个人电脑,购买和安装各类测试用软件,也不再需要部署复杂的网络。只需要列出测试目的、环境的要求、虚拟机台数、何时间断租用即可,实现按需支付。在没有测试需求时,用户并不用为机器的运行和维护买单,大大降低了用户实施性能测试的成本,为一些没有大型长期性能测试需求的企业节省了许多开支。同时随着企业软件版本和技术的发展,依赖的测试软件或环境亦需要升级换代,又会产生升级和维护费用。而在云测试环境中这些因素都无须企业考虑,交由提供云测试服务的供应商完成即可。

便于扩展。特别对于压力测试,用户通过在云端迅速启用大量虚拟机,可以对被测系统进行施压,从而完全可以模拟生产环境中可能面对的超大压力。而且,跨国云服务商提供的测试硬件资源大多分布在全球不同区域,在进行性能测试时,用户可以根据可能的实际情况选择不同区域的机器定制化的为被测系统加压,所得的测试结果由于更接近真实的网络情况,因而更加准确。

云测试的类型主要分为:

功能测试:即确保被测系统所提供的服务符合客户预期。这包括:

系统验证测试:类似于上一节课所介绍的端到端测试;

用户验收测试:由代表用户执行的功能测试;

互操作性测试:即被测系统可以在从一种基础设施切换到另外一种基础设施时(例如从微软云切换到阿里云),仍然可以无缝工作。

非功能性测试:即确保被测系统可以满足用户的非功能性需求。这包括:

可用性测试:保证被测系统能够在要求的期限内始终稳定运行。

用户划分测试:在同一个云平台上,可能需要提供服务给不同的客户(multi-tenant)。这需要测试人员检查不同用户的数据是否会混乱。

性能测试:验证被测系统的响应时间是否符合预期。详细请见下一课《性能测试的方法和策略》。

安全测试:如果被测系统部署到云端,那么对安全性的检查就变得非常重要,确保所有用户的敏感信息都不会遭到未经授权的访问,而且用户的隐私不受影响。

灾难恢复测试:如果发生网络中断、极度过载、系统崩溃等灾难性事件,必须确保被测系统能够妥善处理,不对丢失任何数据。

可扩展性测试:确保被测系统能够根据需要,增加或者减少部署资源。

目前最常见的云端测试工具包括:

SOASTA CloudTest

Jmeter

CloudTestGo

AppPerfect

一些常见的安全测试工具包括:

Nessus

Wireshark

Nmap

性能测试的方法和策略

性能测试也是微服务测试的重要组成部分,特别是对于网页端程序,在流量急剧增加时还能否保持稳定运行,是每个产品经理都需要了解的信息。性能测试包括负荷测试、压力测试、尖峰测试、持久性测试、可扩展性测试等,它可以证明系统能否符合预期的性能指标(SLA),也可以找出系统中导致性能下降的部分。

它的总体流程包括:

确定测试环境

确定性能验收标准(SLA)

计划和设计测试方案

配置测试环境

部署测试方案

执行测试

分析测试结果

目前可供选择的主要工具包括:

Microsoft Visual Studio Load Testing

HP LoadRunner

NeoLoad

Rational Performance Monitor

Silk Performer

Gatling

其中,目前应用最为广泛的是微软的 Microsoft Visual Studio Load Tester。它完全基于 HTTP 协议,所以不需要使用浏览器。换句话说,就是和前端的所有 JS 方法都无关,它只记录 HTTP 的请求。除此之外,它和 UI 的端到端测试很接近,都是基于请求响应,从返回结果中提取验证规则,判断是否成功。它的参数化、数据源管理功能都很全面,自定义的验证规则(Validation Rule)也可以应付大多数的情况。另外,它所记录下来的脚本还可以用做手动的测试代码(用于微软的 Coded UI 自动化测试环境),这是一个额外的好处。

在具体执行测试时,需要构建一个负载模拟测试体系,其中包含了 Visual Studio 客户端、测试控制器(Test Controller)和测试代理(Test Agent)。

客户端用于开发测试、运行测试,以及查看测试结果。

测试控制器用于管理测试代理和收集测试结果。

使用测试代理来运行测试并收集数据,包括系统信息和测试设置中定义的数据分析方法。

这样的体系结构提供了以下好处:

通过将其他测试代理添加到测试控制器增加负载生成的功能。

在相同或不同计算机上灵活安装客户端、测试控制器和测试代理软件。

例如:

本地配置:

Machine1:Visual Studio、控制器、代理。

使用控制器和代理的本地计算机:

典型远程配置:

Machine1 和 Machine2:Visual Studio(多名测试人员可以使用同一个控制器)。

Machine3:控制器(也可安装代理)。

Machine4-n:与 Machine3 上的控制器关联的一个或多个代理。

即使测试控制器通常管理多个测试代理,代理也只能关联到一个控制器。每个测试代理可以由一组开发人员共享。

此体系结构可以轻松地增加测试代理数量,从而生成更大的负载。测试控制器管理一组测试代理来运行测试。

测试控制器与测试代理进行通信,以启动测试、停止测试、跟踪测试代理状态和收集测试结果。

测试控制器提供了运行测试的一般体系结构,并且包含运行加载测试的特殊功能。测试控制器会将负载测试发送到所有的测试代理并等待,直到所有的测试代理都初始化该测试。

所有的测试代理准备就绪后,测试控制器会将消息发送到测试代理,以启动测试。

测试代理作为一种服务运行,它侦听来自测试控制器的请求以启动新的测试。当测试代理收到请求时,测试代理服务将启动在其上运行测试的一个进程。每个测试代理都运行相同的负载测试。

测试代理由管理员分配权重,并且根据测试代理的权重分配负载。

例如,如果测试代理 1 的权重为 30,测试代理 2 的权重为 70,而且负载设置为 1000 个用户,则测试代理 1 将模拟 300 个虚拟用户,而测试代理 2 将模拟 700 个虚拟用户。

下图展示了测试控制器、测试代理和客户端之间的连接方式,尤其是传入和传出连接的端口以及在这些端口上使用的安全限制。注意,在这些主机上,必须打开对应端口的防火墙,否则无法连接成功。另外,图中显示的均为缺省端口,用户可以根据需要修改端口配置。

除了上述工具以外,目前最新的趋势是利用 Microsoft Visual Studio Team Services(VSTS)的压力测试(Load Test)功能,直接从云端执行性能测试。这要求用户具有 VSTS 账户,直接登录 Visual Studio Team Services 帐户并单击 Load Test,如下图所示,就可以逐步完成负载测试的配置,非常简单易用。

其中,还可以从网页上直接设置压力测试的持续时间、负载模式等,非常方便。

最终结束以后的结果显示如下图所示,非常直观明了。这种方式节约了大量的配置和调试时间,简单易行,不过用户要注册云账号,需要考虑成本因素。

本课总结

本课介绍了两个新的测试主题:云端测试和性能测试。对于云端测试,主要区分两种情况:

从本地测试机执行测试(测试云端程序)

从测试云平台执行测试(TaaS)

我们还了解了性能测试的主要流程和工具,尤其是 Microsoft Visual Studio Load Tester 和基于 VSTS 的性能测试。

0 人点赞