基于Golang语言的服务器压力测试系统、方法及计算机可读存储介质与流程


基于golang语言的服务器压力测试系统、方法及计算机可读存储介质
技术领域
1.本发明涉及服务器压力测试领域,尤其涉及一种基于golang语言的服务器压力测试系统、方法及计算机可读存储介质。


背景技术:

2.在应用使用过程中,可能存在成千上万的用户基于智能终端同时对应用服务器进行访问,应用服务器可能由于负载压力过大而导致响应迟缓或者宕机等情况,严重影响应用的使用体验,因此,在软件产品正式上线前,进行应用服务器的压力测试(stresstest)是必要且十分重要的环节。
3.压力测试,或称为负载测试,是确定服务器系统稳定性的一种测试方法,通常在系统正常运作范围之外进行,以考察服务器的功能极限和隐患。例如对于网络游戏的服务器压力测试,可以对网络游戏的服务器不断施加压力,以通过确定网络游戏的服务器的瓶颈或者不能接受的性能点,来获得网络游戏的服务器能提供的最大服务级别。现有的压力测试所采用的通常为locust测试框架,其采用python语言编写,呈分布式的测试框架,即采用master和slave的结构,测试时,master有一个web ui界面,通过在页面上填写测试参数,然后点击开始测试;然后master会把测试任务分发给在线的slave。slave收到请求后,会开始执行测试任务并收集每个请求的结果,然后进行统计上报给master。master收到上报的结果后,在web ui界面展示测试结果。
4.上述压力测试过程中,由于locust测试框架采用的是python语言编写,因此,其所支持的测试用例也需要用python语言编写,从而对于基于其他语言,如go语言开发的项目,无法复用在locust测试框架内,以至于测试用例编写复杂,造成工作效率变低。此外,python仅能对项目暴露的外部接口(如http、tcp)进行测试,无法对项目内部的组件进行测试。
5.因此,需要一种新型的服务器压力测试系统,可在支持go语言下的测试框架,同时,支持测试场景的扩展,测试结果更具有真实性。


技术实现要素:

6.为了克服上述技术缺陷,本发明的目的在于提供一种基于golang语言的服务器压力测试系统、方法及计算机可读存储介质,可更高效地模拟真实的用户,提供测试框架的扩展性。
7.本发明公开了一种基于golang语言的服务器压力测试系统,服务器压力测试系统包括:
8.启动模块,接收启动指令后激活服务器压力测试系统内的模块;
9.模式选择模块,内存有至少一种压力测试模式,根据启动模式的激活指令,选择压力测试模式之一;
10.控制模块,与模式选择模块连接,根据选择的压力测试模式,形成任务执行指令;
11.任务执行模块,内置有至少一个任务集,与控制模块连接,接收任务执行指令,选择任务集中的至少一个执行;
12.统计模块,与任务执行模块连接,接收执行后的任务集的执行结果,并统计形成测试报告;
13.模式选择模块自统计模块调取测试报告并输出。
14.优选地,任务执行模块具有初始化接口、随机等待接口、任务调用接口;
15.初始化接口在接收任务执行指令时,初始化压力测试环境;
16.随机等待接口在接收任务执行指令时,模拟向服务器延时发送操作指令;
17.任务调用接口在接收任务执行指令时,选择任务集中的至少一个。
18.优选地,压力测试模式包括:本地执行、客户端执行、平台执行;
19.压力测试模块接收增加指令或修改指令,以增加或修改支持与不同应用场景的压力测试模式。
20.优选地,任务执行模块还包括任务选择器,基于选择规则选择任务集中的至少一个,其中选择规则包括:权重选择、顺序选择、随机选择、重复选择。
21.优选地,每一任务集存储于golang的goroutine内并发执行。
22.本发明还公开了一种基于golang语言的服务器压力测试方法,包括以下步骤:
23.启动模块接收启动指令后激活服务器压力测试系统内的模块;
24.内存有至少一种压力测试模式的模式选择模块根据启动模式的激活指令,选择压力测试模式之一;
25.与模式选择模块连接的控制模块根据选择的压力测试模式,形成任务执行指令;
26.内置有至少一个任务集的任务执行模块与控制模块连接,接收任务执行指令,选择任务集中的至少一个执行;
27.与任务执行模块连接的统计模块接收执行后的任务集的执行结果,并统计形成测试报告;
28.模式选择模块自统计模块调取测试报告并输出。
29.优选地,任务执行模块具有初始化接口、随机等待接口、任务调用接口;
30.初始化接口在接收任务执行指令时,初始化压力测试环境;
31.随机等待接口在接收任务执行指令时,模拟向服务器延时发送操作指令;
32.任务调用接口在接收任务执行指令时,选择任务集中的至少一个。
33.优选地,压力测试模式包括:本地执行、客户端执行、平台执行;
34.压力测试模块接收增加指令或修改指令,以增加或修改支持与不同应用场景的压力测试模式。
35.本发明还公开了一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现如上所述的步骤。
36.采用了上述技术方案后,与现有技术相比,具有以下有益效果:
37.1.支持go语言编写的测试用例,使用场景更为丰富;
38.2.任务类型更模拟于真实的用户,从而增加测试结果的实用性;
39.3.提供高扩展的测试框架,可解决更复杂的测试需求。
附图说明
40.图1为符合本发明一优选实施例中服务器压力测试系统的结构示意图;
41.图2为符合本发明一优选实施例中服务器压力测试方法的流程示意图。
具体实施方式
42.以下结合附图与具体实施例进一步阐述本发明的优点。
43.这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本公开相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本公开的一些方面相一致的装置和方法的例子。
44.在本公开使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本公开。在本公开和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本文中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。
45.应当理解,尽管在本公开可能采用术语第一、第二、第三等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本公开范围的情况下,第一信息也可以被称为第二信息,类似地,第二信息也可以被称为第一信息。取决于语境,如在此所使用的词语“如果”可以被解释成为“在
……
时”或“当
……
时”或“响应于确定”。
46.在本发明的描述中,需要理解的是,术语“纵向”、“横向”、“上”、“下”、“前”、“后”、“左”、“右”、“竖直”、“水平”、“顶”、“底”“内”、“外”等指示的方位或位置关系为基于附图所示的方位或位置关系,仅是为了便于描述本发明和简化描述,而不是指示或暗示所指的装置或元件必须具有特定的方位、以特定的方位构造和操作,因此不能理解为对本发明的限制。
47.在本发明的描述中,除非另有规定和限定,需要说明的是,术语“安装”、“相连”、“连接”应做广义理解,例如,可以是机械连接或电连接,也可以是两个元件内部的连通,可以是直接相连,也可以通过中间媒介间接相连,对于本领域的普通技术人员而言,可以根据具体情况理解上述术语的具体含义。
48.在后续的描述中,使用用于表示元件的诸如“模块”、“部件”或“单元”的后缀仅为了有利于本发明的说明,其本身并没有特定的意义。因此,“模块”与“部件”可以混合地使用。
49.参阅图1,为符合本发明一优选实施例中基于golang语言的服务器压力测试系统,一方面为实现在golang语言环境下,仍可进行go语言编写的测试用例下的服务器测试,另一方面,为实现测试环境下,更靠近于真实的使用环境(如用户的点按操作、用户对服务器的访问情况等),服务器压力测试系统包括有:
[0050]-启动模块
[0051]
启动模块类似于locust工具下的locust入口,首先以抽象化的模块(虚拟的或具有虚拟模块的设备)提供整个服务器压力测试系统的启动、关闭接口。当接收到用户输入的对服务器压力测试系统的压力测试启动指令时(如以电脑端网页界面、智能终端ui界面显
示的启动模块具象化的接口内,用户输入的测试时长、模拟用户数量、模拟用户访问度等),启动模块将识别压力测试启动指令,并读取与启动指令关联的测试参数(用户所输入的或预先配置的),从而激活服务器压力测试系统内的其他模块。
[0052]-模式选择模块
[0053]
模式选择模块同样呈抽象化,向用户提供高扩展性的功能组件。在进行服务器压力测试前,模式选择模块可在与启动模块相同的交互界面上,向用户提供压力测试模式的选择性,例如本地执行、slave执行(客户端执行)、接入所选平台执行、远程执行等。也即,上述可执行的压力测试模式均存储在模式选择模块内,并根据用户的选择执行相应的所选。
[0054]-控制模块
[0055]
控制模块与模式选择模块连接,当模式选择模块根据用户的选择确定压力测试模式后,将发送该模式信息至控制模块处,控制模块根据所选的压力测试模式,以及对压力测试工具的编译下,与压力测试模式对应的测试策略,形成一任务执行指令。控制模块同样呈抽象化,使得任务执行指令下发至后续模块后,后续模块可根据任务执行指令所承载的任务信息,如压力测试时长、模拟用户数量、任务选择形式等来执行相应的模拟任务。可以理解的是,控制模块为下发任务的模块,默认为独立运行或组队运行,并发不同的任务。
[0056]-任务执行模块
[0057]
任务执行模块与控制模块连接,内置有至少一个任务集,任务集为模拟用户在终端处的操作,以向服务器的访问,各任务集的差异在于用户的数量、操作的不同(如游戏类操作——短时间的大量点击、视频类操作——长时间无点击或少点击、社交类操作——间断性的大量点击或少点击等)。任务执行模块根据所接收到的任务执行指令,选择与压力测试模式对应的任务集中的至少一个执行。可以理解的是,对应于一种压力测试模式,可以有多个任务集中的一个或多个任务,或是一个任务集中的多个任务,不限于任务集与压力测试模式一一对应。
[0058]-统计模块
[0059]
统计模块同样为抽象化,与任务执行模块连接,任务执行模块所执行任务后,服务器对于所模拟的用户操作的响应,例如耗时、错误等将被统计在统计模块内,所有统计的内容定义为执行结果,并对外输出基于执行结果的测试报告,例如对执行结果的分析后所得到的服务器负载、解决方案、冗余处理资源等,向用户输出。
[0060]
后模式选择模块与统计模块连接,从统计模块调取测试报告,从而向用户输出,供用户获取服务器在设定的测试模式下的表现,从而提出针对性的解决方案。
[0061]
具有上述配置后,各抽象化模块可被用户根据实际测试场景替换或扩展,以适用于不同场景。
[0062]
一优选实施例中,任务执行模块具有初始化接口、随机等待接口、任务调用接口。初始化接口,即init接口,初始化接口在接收到任务执行指令时,初始化压力测试环境,类似于用户对于所测试终端内应用程序的启动;随机等待接口为接收到任务执行指令时,模拟向服务器延时发送操作指令的操作,例如模拟用户在终端的应用程序内登陆后,相隔1秒、3秒等再点击终端,以开始游戏、点击设置、修改配置等;任务调用接口在接收任务执行指令时,将选择任务集中的至少一个,也即,在golang语言的环境下,可实现如python语言下的任务选择性。具有上述配置后,初始化接口和任务调用接口使得本实施例中的任务集
可真正模拟用户。
[0063]
又一优选实施例中,压力测试模块可接收用户对测试模式的修改指令,从而增加或修改支持于不同应用场景的压力测试模式。
[0064]
优选或可选地,任务执行模块内还包括有任务选择器,其内存储有任务选择规则,例如权重选择、顺序选择、随机选择、重复选择,其中权重选择,为基于对每一任务分配的权重,而依权重排序后对任务选择执行;随机选择,顾名思义在任务集内随机挑选任务执行;顺序执行,即基于对每一人物分配的编号,根据编号顺序依次选择执行;重复选择,则为在某些固定的任务集内,反复执行一个或多个任务。相较于python语言下或boomer开源库的仅具有权重选择的模式,为用户提供更加丰富的测试环境。
[0065]
优选或可选地,任务集存储于golang的独立的goroutine内,以并发执行。更进一步地,可采用actor模式再增加一任务执行模块,以实现任务集中间的相互配合。
[0066]
参阅图2,示出了符合本发明一优选实施例中6.基于golang语言的服务器压力测试方法,包括以下步骤:
[0067]
s100:启动模块接收启动指令后激活服务器压力测试系统内的模块;
[0068]
s200:内存有至少一种压力测试模式的模式选择模块根据启动模式的激活指令,选择压力测试模式之一;
[0069]
s300:与模式选择模块连接的控制模块根据选择的压力测试模式,形成任务执行指令;
[0070]
s400:内置有至少一个任务集的任务执行模块与控制模块连接,接收任务执行指令,选择任务集中的至少一个执行;
[0071]
s500:与任务执行模块连接的统计模块接收执行后的任务集的执行结果,并统计形成测试报告;
[0072]
s600:模式选择模块自统计模块调取测试报告并输出。
[0073]
本发明还公开一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现如上所述的步骤。
[0074]
应当注意的是,本发明的实施例有较佳的实施性,且并非对本发明作任何形式的限制,任何熟悉该领域的技术人员可能利用上述揭示的技术内容变更或修饰为等同的有效实施例,但凡未脱离本发明技术方案的内容,依据本发明的技术实质对以上实施例所作的任何修改或等同变化及修饰,均仍属于本发明技术方案的范围内。