Skip to content
🎨 作者:mikigo 📔 阅读量:

一种基于Linux系统执行自动化测试用例实现负载均衡的技术交底书

0、缩略语和关键术语定义

术语全称解释
SSHSecure Shell专为远程登录会话和其他网络服务提供安全性的协议,通过SSH服务可以远程连接到一个Linux操作系统,并进行一些远程操作。下文中的ssh表示命令,SSH表示服务。
SocketSocketSocket(套接字),应用程序可以通过Socket向网络发送请求或者应答网络请求。
ps命令process status命令用于显示当前进程的状态,类似于 windows 的任务管理器。
scp命令secure copy是 Linux 系统下基于 ssh 登陆进行安全的远程文件拷贝命令。
pytestpytest基于Python的常用自动化测试框架,可通过命令行执行测试用例。

1、相关技术背景(背景技术),与本发明最相近似的现有实现方案(现有技术)

在对UOS操作系统桌面应用进行自动化测试的过程中,由于自动化测试用例数量很多,单台测试机执行所有自动化用例时间很长。

为了满足持续集成持续交付业务要求,自动化测试用例需在较短时间内完成执行。因此,需要同时在多台测试机上执行测试用例,所有测试机执行完用例之后返回汇总结果。

在现有技术里面,基于云测试的自动化测试用例分发和执行方案,均设计为将自动化用例分发到多台测试机上执行。大多是手机端的APP自动化测试方案,测试端连接多台手机,服务端控制测试机进行分布式执行用例。

1.1、与本发明相关的现有技术

1.1.1、现有技术的技术方案

通过给不同的测试机指定分配对应的测试用例,比如:总共两台测试机,之前需要先在配置文件里面配置好哪台机器执行哪些用例。当然,做的比较好的也有不用配置用例范围的方案,即通过用例管理进行顺序或随机分发,但是这些方案,都是基于socket协议,在服务端和测试段都需要开启socket服务,因此在测试环境部署方面要求偏高。

1.1.2、现有技术的缺点

(1)需要结合用例总体运行时间,单独给每个测试机配置用例执行容量,后续随着自动化测试用例数量增加,需要结合每台测试机的执行容量,合理分配到各个测试机上。

(2)所有测试机同时开始执行时,由于无法提前判断哪台机器先执行完,先执行完的测试机,只能等待后执行完的测试机完成之后才能汇总结果,等待的这段时间,不仅浪费了时间,也浪费了硬件资源。

(3)基于socket协议,通常需要在测试机上提前手动部署socket服务,当测试机比较多的情况下,操作起来就比较麻烦。

(4)没有对用例执行过程中异常情况,如用例进程卡住、测试机系统卡住等情况的处理。

2、本发明技术方案的详细阐述

2.1、本发明所要解决的技术问题

(1)解决执行自动化测试用例,需要配置每台测试机执行的用例容量。

(2)解决先执行完的测试机等待后执行完测试机,造成硬件资源浪费的问题。

(3)解决需要提前在测试机上手动部署测试环境的问题。

(4)解决在用例执行过程中,出现一些异常情况,能自动判断并解决相应异常问题。

2.2、本发明提供的完整技术方案

服务端与测试机采用SSH通讯,SSH通常在Linux系统上都会自带,因此不需要手动部署环境,整个测试过程可以全程自动化无人参与完成。

服务端通过SSH隧道下发命令,测试机被动接受命令执行即可,整个测试过程均由服务端来控制。

如果存在测试用例执行的进程,说明测试机当前正在执行测试用例,服务端将会ssh连接下一台测试机进行相同的检查操作,如果此时这台测试机上不存在测试用例执行的进程,说明测试机当前处于空闲状态,则服务端会通过ssh远程连接测试机执行这条测试用例。

如此循环操作,直至所有测试用例执行完成。

图(一)负载均衡分布式执行测试用例流程图

2.2.1、用例分配管理

服务端通过文件查找,收集项目下所有要执行的用例,将收集到的用例保存为一个序列。获取测试用例名称列表可以参考以下方法:

python
import os
test_case_list = [ ]
for root, dir, files in os.walk(cases_path):
    for file in files:
        if file.startswith("test") and file.endswith(".py"):
            test_case_list.append(file)

测试用例文件名称均为以“test”开头且以“.py”结尾的文件,test_case_list 为测试用例目录下的所有测试用例名称列表。

用例分配可以通过入参决定,可以对测试用例名称列表进行遍历,也可以通过随机从列表中取出。

遍历执行属于正常的功能测试自动化手段,而随机执行的时候可以指定执行的总时长,这种方法通常可以作为一种应用稳定性测试的自动化手段。可以根据要测试

2.2.2、节点分配管理

服务端遍历所有需要执行的用例,通过子进程使用ssh远程连接测试机,使用ps命令查询测试机上是否存在自动化用例执行的进程,如果存在说明当前测试机负载状态为繁忙,测试机会将此状态返回给服务端,服务端接受到繁忙状态之后,会继续通过ssh连接下一台测试机进行相同的进程检测操作;

如果未测试返回给服务端的状态为空闲,则服务端会发起执行测试用例的指令。

服务端远程连接查询自动化用例执行进程的命令为:

shell
ssh user@ip "ps -aux | grep pytest | grep -v grep"

其中user为测试机的用户名,ip为测试机的ip地址,pytest为自动化测试框架,我们通常使用它来执行自动化测试用例,用例执行的进程里面会包含pytest字符。

如果返回的数据为空,表示当前测试机负载状态为空闲。

如果返回的数据不为空,表示当前测试机负载状态为繁忙。

2.2.3、服务端控制测试机执行用例

服务端会提前把所有需要执行的测试用例文件,通过ssh远程拷贝到测试机上,服务端控制测试机执行测试用例的命令为:

shell
ssh user@ip "cd cases/ && pytest test_cases.py"

其中user为测试机的用户名,ip为测试机的ip地址,test_cases.py为测试用例的文件名称。

2.2.4、测试机环境异常处理

每次测试机返回繁忙状态给服务端之后,服务端会通过计时控制模块做对应测试机的计时,如果计时的时长超过了阈值(阈值可以通过配置),我们认为测试环境可能出现一些异常情况,比如测试用例执行进程卡死等,所以服务端会将测试机上的执行进程杀掉。

2.2.5、收集测试报告

测试机每次执行完一条用例之后会生成一个独立的测试报告,所有用例执行完之后,通过命令将测试机上的测试报告返回到服务端,并在服务端完成测试报告的整合,形成最终的测试报告。

从测试机上返回测试报告到服务端的命令为:

shell
scp -r user@ip:~/client_report_path/* server_report_path

2.3、本发明技术方案带来的有益效果

(1)执行前准备工作更加便捷,配置方面只需要指定测试机的user和ip,无需考虑每个测试机具体的用例执行容量;

(2)自动化测试执行更加高效,硬件资源运用更加合理,只要测试机处于空闲状态就能执行自动化用例。

2.4、针对上述技术方案,是否还有替代方案同样能完成发明目的

3、本发明的技术关键点和欲保护点是什么

(1)通过用例管理模块获取需要执行的用例列表,并自动分配要执行的测试用例给节点分配模块,节点分配模块通过子进程使用远程控制服务,控制测试机执行测试用例,实现分布式并行执行测试用例。

(2)测试机通过进程检测当前是否空闲,然后返回当前状态给服务端,服务端接收到测试机状态之后判断是否下发测试任务,提供了测试机执行用例的负载均衡机制。

(3)如果测试机长时间处于繁忙状态,可能存在测试机环境异常情况,因此杀掉进程之后重新执行后续任务,提供了一种测试机环境异常处理的机制。

(4)将测试机上生成的单条测试用例的测试报告全部返回发送到服务端,由服务端完成测试报告的汇总整合,提供了测试结果的标准化输出机制。

(5)提供了一种在大规模部署执行自动化用例场景下,分布式执行测试用例并实现负载均衡的技术方案。

4、附件:

参考文献(如专利/论文/标准等)

l Linux 下 ssh 命令实例指南:

https://linux.cn/article-3858-1.html

l Linux scp命令:

https://www.runoob.com/linux/linux-comm-scp.html

l Linux ps 命令:

https://www.runoob.com/linux/linux-comm-ps.html

l pytest: helps you write better programs:

https://docs.pytest.org/en/6.2.x/