开源测试平台横向测评系列『流马』篇:测试界的“木牛流马”
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了开源测试平台横向测评系列『流马』篇:测试界的“木牛流马”相关的知识,希望对你有一定的参考价值。
前言
我是从今年5月份第一次接触流马这个平台。第一次听到这个名字的时候,就觉得挺有趣的,猜测其名字应该是取自诸葛亮的“木牛流马”,后来和作者证实了一下,确实如此。当初诸葛亮发明木牛流马是为了提高运输效率,而流马测试平台是为了提高测试效率,可以说这个名字取得“恰到好处”。
本文一万两千字左右,我写了好多天,可能是我耗时最久的一篇文章。其实写文章不是最难的,难的是边学习、边摸索、边踩坑、边解决问题、边写文章记录、边总结。所以写得还算是比较用心的,整体来说也比较详细。读起来可能会有点长,大家可以先关注收藏、后期有时间、空下来了再照着文章内容仔细研究。内容大致分为以下四个部分:
【简介篇】
- 项目概述:技术栈、工作原理
- 项目功能简介:功能特点
【部署篇】
- 部署规划
- 依赖环境部署(JDK、MySQ、nginx、Git、NodeJS、Python3)
- 代码打包:克隆项目、前端代码打包、后端代码打包
- 项目部署:前端部署、后端部署、执行引擎部署
【使用篇】
- 接口测试:创建接口(添加引用公共参数、添加引用自定义参数)、测试用例(参数关联)、业务流程测试实践
- web自动化测试:元素管理(添加元素)、测试用例(添加元素)、设计测试场景
- 测试计划、测试集合与测试用例相互之间的关系
【总结篇】
- 使用总结:常见的使用注意事项,如变量引用、函数引用、关联参数引用等
- 优化建议:结合真实使用过程,从用户角度出发,提出的7条优化建议
- 优缺点总结:优点、缺点、评分(从不同角度评测打分)
【简介篇】
以下项目概述及功能介绍内容来自官网及GitHub项目介绍
一、项目概述
流马是一款低代码自动化测试平台,旨在采用最简单的架构统一支持API/WebUI/AppUI的自动化测试。平台采用低代码设计模式,将传统测试脚本以配置化实现,从而让代码能力稍弱的用户快速上手自动化测试。同时平台也支持通过简单的代码编写实现自定义组件,使用户可以灵活实现自己的需求。
项目分为平台端和引擎端,采用分布式执行设计,可以将测试执行的节点(即引擎)注册在任意环境的任意一台机器上,从而突破资源及网络限制。同时,通过将引擎启动在本地PC上,方便用户快速调试测试用例,实时查看执行过程,带来传统脚本编写一致的便捷。
官网:http://www.liumatest.cn/
代码地址:https://github.com/Chras-fu/Liuma-platform
部署文档:https://docs.qq.com/doc/p/c989fa8bf467eca1a1e0fa59b32ceab017407168
使用手册:https://docs.qq.com/doc/p/1e36932d41b40df896c1627a004068df9a28fc3f
平台技术栈:前端VUE+ElementUI,后台Java+SpringBoot,测试引擎Python。
二、功能介绍
1.API测试
- 支持单接口测试和链路测试。
- 支持接口统一管理,支持swagger导入。
- 支持一键生成字段校验的接口健壮性用例。
- 支持全局变量、关联、断言、内置函数、自定义函数。
- 支持前后置脚本、失败继续、超时时间、等待/条件/循环等逻辑控制器。
- 支持环境与用例解耦,多种方式匹配域名,让一套用例可以在多个环境上执行。
2.WebUI测试
- 支持关键字驱动,零代码编写用例。
- 支持UI元素统一管理,Excel模板批量导入。
- 支持自定义关键字,封装公共的操作步骤,提升用例可读性。
- 支持本地引擎执行,实时查看执行过程。
- 支持与API用例在同一用例集合顺序执行。
3.AppUI测试(1.1版本上线)
- 支持WebUI同等用例编写和执行能力
- 支持安卓和苹果系统
- 支持持真机管理、投屏和在线操作
- 支持控件元素在线获取,一键保存元素
- 支持实时查看执行过程
【部署篇】
一、部署说明
1.部署说明
官方部署文档地址:https://docs.qq.com/doc/p/c989fa8bf467eca1a1e0fa59b32ceab017407168,共提供了两种部署方式,一种是容器部署,一种是常规部署。容器部署的好处是简单、快捷,常规部署方式的好处是相对于容器来说、出现问题容易排查,缺点是步骤较为繁琐。两种方式各有优劣,根据自己的喜好自由选择即可。本文采用的是常规部署方式。
2.部署规划
机器/系统 | 部署环境 | 说明 |
192.168.1.123,CentOS7 | JDK8 Nginx | CentOS7内网服务器:
|
192.168.1.131,Windows10 | Git JDK8 Maven IDEA编辑器 NodeJS | 个人Windows10办公电脑:
|
192.168.1.188,Windows7 | Python3 Selenium Chrome ChromeDriver | 同一内网下的其他Windows主机:
|
关于执行引擎机,也可以继续使用个人办公电脑作为执行引擎机,考虑到个人电脑经常会关机重启,就需要来回启动执行引擎,比较麻烦,所以我就选了一台本地Windows主机。当然也可以部署在Linux系统上,不过对于UI自动化测试而言,没有可视化的界面展示,调试起来相对麻烦一些。
二、依赖环境部署
1.安装Java1.8
CentOS服务器和个人Windows电脑分别需要安装JDK。CentOS下,推荐脚本部署方式:
安装脚本下载:https://share.weiyun.com/6JMLvSyK
JDK包下载地址:https://share.weiyun.com/mKDxXd1x
source jdk_install.sh # 通过source命令安装,省去配置环境变量步骤
2.安装mysql
1)安装mysql
CentOS下安装,本次通过docker进行快速安装,如服务器或其他内网机器已安装mysql,直连即可,可以忽略此步。注意要使用8.0+版本的mysql,我用的是5.7.33版本,启动时候就会报错不支持。
docker run -d --restart always --name mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3307:3306 mysql:8.0.28
2)登录mysql
进入mysql容器
docker exec -it mymysql sh
连接mysql
mysql -uroot -p # 登录mysql,根据提示输入密码123456
2)创建数据库
进入mysql命令行执行:
mysql> create database liuma character set utf8 collate utf8_general_ci;
3.安装nginx
CentOS下安装,推荐脚本部署方式
nginx安装脚本下载地址:https://share.weiyun.com/HLuVRTO2
nginx安装包下载地址:https://share.weiyun.com/uhffdijl
将其下载下来,上传到服务器,执行以下命令安装:
source nginx_install.sh
4.安装git
Windows下安装,用于拉取项目代码,下载后双击、按照提示一步步安装。
5.安装node.js
Windows下安装,用于安装前端依赖、打包编译。
下载地址:https://share.weiyun.com/2PpWyXkz,下载下来后双击安装即可。
更换淘宝镜像源
1.临时更换
npm --registry https://registry.npm.taobao.org install node-sass(要安装的模块)
2.永久更换
npm config set registry https://registry.npm.taobao.org
npm config get registry # 查看是否更换成功
3.通过cnpm使用
npm install -g cnpm --registry=https://registry.npm.taobao.org
6.安装python3
CentOS或Windows下安装均可,执行机选用哪个系统就安装在哪个系统下。如果是Linux系统,可以参考之前的文章《Linux下一键安装Python3&更改镜像源&虚拟环境管理技巧》,如果是Windows系统,则在Windows系统下安装python3.
三、代码打包
1.克隆项目代码
git clone https://github.com/Chras-fu/Liuma-platform.git # 克隆平台代码
git clone https://github.com/Chras-fu/Liuma-engine.git # 克隆引擎代码
平台代码目录:
- LiuMa-backend:后台代码
- LiuMa-frontent:前端代码
2.打包前端代码
进入前端文件目录,安装相关依赖并执行构建
npm install # 安装相关依赖
npm run build # 构建
出现"Build complete."提示代表构建成功:
构建成功后,目录下会生成dist文件目录,可以将其打包成.zip格式并上传至服务器,然后再解压
3.打包后端代码
1)安装依赖包
用IDEA打开liuma-platform/LiuMa-backend,使用maven安装依赖
2)修改配置
① 数据库配置
文件位置:liuma-platform/LiuMa-backend/src/main/resources/application.properties,配置如下所示:
- username:数据库用户名;
- password:数据库密码;
- url:连接数据库的URL地址;
# database
spring.datasource.password=123456
spring.datasource.username=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3307/liuma?serverTimezone=UTC&characterEncoding=utf-8
注意事项:
- 项目部署的服务器与数据库处于同一主机时可使用127.0.0.1,如不在同一主机下,需改为该主机的IP地址;
- 3307为前面docker部署mysql时映射的端口号,按照你自己的数据库端口号配置即可;
② 邮件配置
文件位置:liuma-platform/LiuMa-backend/src/main/resources/application.properties,配置如下所示:
# aliyun 阿里云
# 阿里云邮件key
aliyun.email.accessKey = LTAI5tDVn8kT1avi84cFX8TT
# 阿里云邮件secret
aliyun.email.accessSecret = Dq8pm0DkZSqeMwRKOQhEid3fGPkL09
# 发送人邮箱地址
aliyun.email.runnerSenderAddress = jigang.chen@1897745962796526.onaliyun.com
aliyun.email.runnerSenderName = 执行通知机器人
③ 七牛云配置
文件位置:liuma-platform/LiuMa-backend/src/main/resources/application.properties,配置如下所示:
# 七牛云配置,全部改成你自己的
# 七牛云ak
qiniu.cloud.ak = xxxxxx
# 七牛云sk
qiniu.cloud.sk = xxxxxx
# 七牛云空间名
qiniu.cloud.bucket = xxxxxx
# 七牛云加速域名
qiniu.cloud.downloadUrl = xxxxxx
qiniu.cloud.uploadUrl = xxxxxx
3)maven打包
提示“BUILD SUCCESS”即表示打包成功,目录下会多出一个LiuMa-1.0.3.jar的jar包(我目前拉的最新代码,打包出来的是1.0.3,还有个LiuMa-1.0.0.jar包是两个月前打包的)
四、项目部署
1.平台部署
1)上传打包后的前端文件
将前端打包后的文件夹dist上传到:nginx安装目录/usr/local/nginx/html/下
2)上传打包后的后端文件
可以在/home目录下新建一个文件夹liuma,用于存放前面打包的jar包文件:LiuMa-1.0.3.jar,执行命令,后台启动服务:
nohup java -jar LiuMa-1.0.3.jar > logs.log 2>&1 &
启动后,可以查看logs.log日志文件,看看是否启动成功,以及是否成功连接到数据库,连接成功后自动创建相关数据表:
3)配置Nginx
① 新建nginx_liuma.conf
在nginx的/usr/local/nginx/conf目录下新建nginx_liuma.conf,nginx用于配置server的代理转发,详细配置如下:
#user nobody;
worker_processes 1;
events
worker_connections 1024;
http
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server
listen 8888;
server_name 192.168.1.122;
location /
index index.html index.htm;
root /usr/local/nginx/html/dist;
location /autotest
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Origin "";
location /openapi
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Origin "";
access_log /usr/local/nginx/html/wwwlogs/access.log;
② 测试配置
nginx -t -c /usr/local/nginx/conf/nginx_liuma.conf
测试过程中可能会出现失败提示"nginx: [emerg] open() "/usr/local/nginx/html/wwwlogs/access.log" failed (2: No such file or directory)",原因是html目录下没有wwwlogs/access.log这个文件路径,直接新建一个wwwlogs目录和access.log文件即可。
③ 指定配置文件启动nginx
nginx -c /usr/local/nginx/conf/nginx_liuma.conf
4)验证部署情况
访问前端:http://192.168.1.122:8888/,管理员账号:LMadmin,密码:Liuma@123456
登录后的页面如下所示:
5)问题排查
因为流马是前后端分离项目,所以前端能访问并不代表后端也是正常的。如果登录遇到502,则是后台服务器没启起来,多半是数据库的问题,可以通过以下方式排查:
- 数据库版本,建议用8.x版本,5.7版本不支持
- 查看后端配置文件application.properties中数据库配置是否正确
- 可以通过前面提到的logs.log日志查看,也可以查看数据库是否自动创建相关数据表
- 检查数据库端口及Nginx反向代理的端口在防火墙中是否放开
另外,如果前端页面访问不了,很可能是防火墙没开放权限,需要在防火墙中放开上述配置文件中配置的8888端口:
firewall-cmd --permanent --add-port=8888/tcp
firewall-cmd --reload
如果是前后端服务是部署在云服务器,需要在安全组中放开8888端口。
2.测试引擎部署
测试引擎可以理解为接口测试和UI自动化测试的运行环境。测试引擎可以选择部署在Linux系统,也可以选择使用个人Windows电脑,最好处于同一局域网下。当然如果服务端是部署在云服务上,有公网IP地址,Windows是个人办公电脑也可以,只要引擎电脑能要连上部署后端服务的那台服务器就行。以下是引擎部署过程:
1)上传代码
前面已经通过“git clone https://github.com/Chras-fu/Liuma-engine.git”克隆好了引擎代码,直接上传到对应的服务器即可,比如我选用的是Windows作为引擎,那么直接拷贝到Windows即可。
2)安装依赖
前面依赖环境部署已经安装好了Python3,创建并激活了虚拟环境,下面直接进入项目所在目录liuma-engine,安装依赖即可。
pip install -r requirements.txt
3)下载Chrome驱动
对照引擎机的Chrome浏览器版本,下载对应驱动,存放在/browser目录下
4)添加引擎
① 注册引擎
流马平台环境中心-引擎管理-注册引擎,输入引擎名称,名称任意,自己能识别即可,如:engine-192.168.1.188,确认后,会弹出一个提示框,复制里面的引擎code和引擎秘钥,后面会用到。
② 配置引擎服务器
编辑liuma-engine/config目录下的配置文件config.ini,进行配置,几个重要配置如下:
- url:后台服务所在的URL;
- engine-code:前面注册引擎成功后,提示框中的引擎code;
- engine-secret:前面注册引擎成功后,提示框中的引擎秘钥;
- options:如果引擎机是Linux系统,则改为headless,即无头模式,如果是Windows则保持默认的normal;
- path:如果引擎机是Linux系统,则改为chromedriver,如果是Windows则保持默认的chromedriver.exe;
- token:后面注册成功后会自动生成,可以不用管;
[Platform]
url = http://192.168.1.122:8888
enable-proxy = false
enable-stderr = true
[Engine]
engine-code = 9d4358f0c8a34a2ab7e4c297949149fa
engine-secret = 86a2f8f8bd654e03a60da9f19cdec017
[Header]
content-type = application/json;charset=utf-8
token = eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NjI2Mjk4OTQsImVuZ2luZVNlY3JldCI6IjVhM2ZhYzdlYzJiODQ4NDlhYzJhNjY4ZGRlNjRhMDk0IiwiaWF0IjoxNjYyMDI1MDk0LCJlbmdpbmVJZCI6ImU3ZWMzOTllZDdkZDRkMmFiZWIxNGNiNTE2NGNiNGVkIn0._LVsCKIauFxV4IKAUNgYS1lVbD5twO_2E39QCOufKH8
[WebDriver]
options = normal
path = chromedriver.exe
[PlatformProxy]
url = http://0.0.0.0:80
username = ****
password = ****
5)启动引擎
python startup.py
6)验证引擎是否添加成功
引擎启动成功后,即可在流马平台环境中心-引擎管理中查看引擎在线情况。一台服务器可以启动多个引擎,一般默认有四个系统引擎,启动后互不影响。
【使用篇】
一、接口测试
1.前置准备
在开始创建接口测试之前,我们需要先做一些最基础的准备工作,例如:注册一个项目,添加或注册一个账号,将新注册的账号添加到项目中。先看一下官方文档对项目、角色、用户的关系介绍:
注册账号
登录页面注册新账号
注册完成后,登录管理员账号,在【系统管理-用户管理】中能看到注册的用户:
创建项目
创建项目时,可以选择新注册的账号作为管理员,后续此账号登录时即可看到此项目。
2.创建接口
这个平台的最大功能是自动化测试,而我们本次的目的就是体验这个平台的自动化相关的功能好不好用,所以重点会从接口自动化测试及UI自动化测试着手。至于其他相关功能,官方使用手册的内容已经写得非常详细,这里就不做过多介绍。
接口测试需要先创建接口,在创建接口前需要先创建各个接口的执行环境,也就是域名或URL:
新增环境
① 新增域名标识
在新增环境前,需要先新增域名标识,否则在新增环境的时候无“域名标识”内容可供选择
右上角配置中心-域名标识-新增标识,填入标识名称和标识描述,确认。
② 新增环境
添加好域名标识,就可以新增环境了,添加环境的目的主要是为了后面运行测试用例的时候是基于哪套环境,比如同一个项目,可能会有开发环境、测试环境、预发环境等等:
环境中心-环境管理-新增环境,输入环境名称、环境描述,确认。
③ 新增域名
在刚新增的环境下新增域名,匹配类型选择“域名标识”,匹配标识选择第一步新建的域名标识的名称,域名填写接口请求的URL地址。同Metersphere的环境管理类似,此处新建环境后,后面发起的接口测试请求,就是基于这个环境的URL发起。
新增并填写接口信息
① 创建模块
既然是接口测试,就需要先创建接口,在新增接口前需要先创建各个模块,用于分类管理各个模块下的接口
② 新增接口
新增接口可以选择手动新增和导入两种方式,导入的方式支持文件导入、postman、swagger导入,此处我选择的是手动新增,以登录接口为例:
基础信息部分就是接口地址、描述、名称等信息,各个字段简洁明了,不再赘述;请求参数部分主要涉及到请求头、接口的请求体等。为了满足不同用户的登录需求,我的接口请求参数是采用引用变量的形式来传参。提到变量就不得不提到下面的公共参数。
新增、引用公共参数
① 流马与Metersphere的公共参数的设计上的区别
新增公共参数的目的主要是为了后面在接口中引用,类似于全局变量。Metersphere和流马都是基于项目进行管理其下的环境、变量,最顶层是项目。Metersphere的公共参数是放在环境中进行管理,它是一个环境下挂多个变量的概念,而流马中环境则是和变量进行分开,一个项目可以新增多个环境,一个项目可以新增多个公共参数,环境和公共参数之间互不干扰。
公共组件-公共参数-自定义参数-新增自定义参数,填入参数名称、类型、参数值等。注意:同一项目下变量名称不可重复。例如,新增一个登录用户名的公共参数:
② 流马公共参数引用
Metersphere对于公共参数的引用与Jmeter一致,都是采用$name的形式,而在流马中,则是通过$username形式进行引用,与postman类似,但比postman多了个$符,postman是username。请求头和请求体中都可以通过此种方式引用公共参数,但是要注意参数的类型,请求头中一般都是string类型的参数。
内置函数
与Jmeter类似,流马中内置了函数助手,提供很多函数可供选择
比如我的某个接口传参中需要一些指定长度的随机数字,那么则可以使用random_number函数,引用方式见下图标:
添加、引用自定义函数
某些情况下,内置函数可能无法满足生成参数的需求,这是则可以创建一些自定义函数。按照官网文档的介绍,平台支持Python Faker库的方法(毕竟执行引擎就是Python),那么我们就可以创建一个Python方法来自定义生成一些参数。不过有一点需要注意,函数的返回值要使用sys_return(value)来返回。
① 创建自定义函数
例如我想生成随机手机号,则可以通过如下方式常见:公共组件-函数管理-新增函数,内容如下:
可以看出,语法其实就是Python语法,只不过最后的返回值使用了sys_return代替。
② 引用自定义函数
添加完自定义函数,就可以在接口传参中引用,方式为:@function()
其实上述三个参数:姓名、手机号、身份证号我都是通过自定义函数来生成的。最后发起请求时,通过日志可以看到生成的参数值:
特别注意
有个很重要的细节需要注意,也是我在使用过程中遇到的一些小坑:
接口传参中引用string类型的公共参数时需要加引号
定义参数时,如果是string类型变量:
- 参数值没加引号、在传参时不会自动带上引号
- 也不能在定义变量时给参数值加上引号
- 只能在接口引用变量时,外层带上双引号
举个例子可能会直白一点:
假如我们登录接口需要传入密码参数,而我们提前在公共参数中定义了这个变量password,值为e10adc3949ba59abbe56e057f20f883e,是一个string类型,如下图所示:
假如值没加双引号的话,传参的时候不会自动带上引号(通过执行打印结果可以看出),哪怕定义时选择的是string类型,被测接口的服务端也会认为它不是一个string类型
如果我们在公共参数中手动给它加上双引号,此时执行引擎Python那边就会报错JSONDecodeError:
解决办法是在定义公共参数时不加引号,在接口中引用参数时,加上引号
此时就会识别成合法的string类型值:
3.测试用例
创建用例并添加接口
添加模块,新增用例页面:
一条用例是由一个or多个接口组合而成,从而形成不同场景的业务流。前面接口管理中新建接口后,就可以在用例中选择添加该接口,一次可选择单个或多个。
添加断言
断言的类型有多种,比如某个添加用户的接口,添加成功后返回值是"a":"200","d":"30200",其中a是固定的,即接口响应码,d的值用户ID,是不固定的,那么这里就可以通过jsonpath提取器先提取d节点的值,用“整数”来进行断言:
导入配置信息
如果某些接口用到了自定义的函数(内置函数不需要导入)、公共参数、公共header等,则需要在用例中一一将它们选择导入,否则接口中引用不会生效。很多时候,用例执行不同都是因为没有导入这些元素导致:
关联参数
通常,一条用例可能会包含多个接口,而接口参数之间可能会相互关联,比如B接口的入参用到A接口的出参,就需要先提取A接口的出参,再在B接口中进行引用。
① 提取返回值
与Jmeter和Metersphere一样,提取返回值支持正则表达式和jsonpath提取两种方式,与与Jmeter和Metersphere不同的是,流马提取返回值时,表达式不需要加$符号:
② 引用返回值
与前面引用公共参数不同,引用返回值的内不需要加$符号,直接填写变量名即可:
特别注意
接口管理与用例管理中的接口信息不同步
若用例中添加了接口A,则:
- 编辑接口A详情后,编辑后的内容不会同步到接口管理的接口A中;
- 在接口管理中编辑接口A,也不会同步到用例中的接口A;
比如我们创建了一条用例,其中添加了接口A,并在用例中给接口A添加了一个请求头参数,此时,到接口管理中查看接口A则不会同步这个请求头参数;而在接口管理中添加的请求头参数也不会同步到用例中,相当于用例管理和接口管理做了隔离。此时就需要两边各修改一次接口A,或是在接口管理中修改后再重新添加到用例中。
说实话我觉得这个设计很不好用,因为在现实使用中,会有很多测试用例用到同一个接口。举个例子,如果我只在测试用例A中添加或更改了某个接口的请求头,那么其他测试用例B、C、D中则需要一一更改。
起初我以为是bug,后来特地问了作者,就是这么设计的,也不是不能改,只是处理起来会很麻烦,而且很多其他平台也都是这么设计的,后期会慢慢优化。
4.业务流程测试实践
此处以在测试中常见的某个业务流程场景为例,来串联前面提到的公共参数、自定义函数、关联参数等等,流程如下:用户登录->添加一个商品->获取商品详情->删除商品,从添加到删除,这样既形成了一个小的业务流程的闭环,也避免我们后期到数据库中手动删除数据,这也是现在接口流程测试中一种较为常见的做法。
完善用例信息
一个完善的业务流程的测试用例,通常需要做以下工作:
- 填写基础信息;
- 导入配置信息:自定义函数、公共参数、共用header;
- 添加接口并调整好接口顺序;
- 为每个接口添加合适的断言;
- 配置接口之间的关联取值;
执行用例
以上是关于开源测试平台横向测评系列『流马』篇:测试界的“木牛流马”的主要内容,如果未能解决你的问题,请参考以下文章
前百度工程师融200万推财税SaaS 提升代账机构30%签单率
Python接口自动化测试框架(工具篇)-- 接口测试工具HTTPRUNNER