4 Star 18 Fork 7

CrazyG / 自动化测试平台

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

前言

2022年4月6日18:57:42:
代码已下架,仅开放使用文档为同好小伙伴提供设计思路
作者微信:SSR_SandMan(1、备注来意;2、不再提供代码,免开尊口)



☆ 功能介绍&使用文档详情可查看:
github:https://github.com/GuoJinga/CrazyTester_pub
码云:https://gitee.com/Crazy__G/CrazyTester.git

☆ 全栈开发简而精但功能又丰富强大、可视化强、用户易上手、高可用的自动化测试平台。
集成了接口、UI、MQTT、报表四大方向,并通过定时任务、报警通知、统计看板等功能持续监控产品质量,及时通知反馈任务测试结果。

意义:降本提效
1、摒弃传统手动测试阶段、代码框架管理阶段、直接进入可视化平台阶段。使即使不会代码的测试小伙伴也能轻松使用平台,参与自动化测试建设,实现自动化复测&回归;
2、团队在平台共同协作,将所有自动化测试数据资产落库留存,以便复用&流传;
3、通过自动化运行降低测试人员的测试时间成本、人力成本,提高测试效率、测试准确率、测试可靠性。

技术构架:
前端bootstrap、后端python+Django、数据库mysql、消息列队RabbitMQ等
python包:requests、APScheduler、selenium、appium、阿里云SDK等

项目功能:
登录、项目管理、分组管理、用例管理、测试任务(定时任务)、
全局环境(全局变量、全局域名、全局请求头、全局cookies)、
统计看板、测试报告、报告通知(企业微信、邮箱、办公OA)等

落地成果:
总计管理13个项目,通过自动化运行,减少繁琐复杂的人工操作,在多套环境下减轻接口、 UI、MQTT、报表 复测与回归成本,为测试工作降本提效,持续监控产品质量并持续供质量保障。
1、接口测试:
目前管理 3126个接口、11032条用例、306个测试任务。
每日定时任务执行用例5455个,平均执行时长10min。相比手工执行5455min+,提效545倍+。
2、UI测试:
目前管理505条用例、18953步有效步骤。112个测试任务。
每个任务平均执行时长10min,每执行一个任务解放人力10min。
3、MQTT测试:
目前管理 1002条Topic、2612条用例、95个测试任务。
每日定时任务执行用例1033,平均执行时长15min。相比手工执行3099min+,提效206倍+。
4、报表测试:
目前管理报表43张。



自动化测试平台 使用文档

目录



平台简介

1. 为什么实现平台化

  • 摒弃传统手动测试阶段、代码框架管理阶段、直接进入可视化平台阶段。使即使不会代码的测试小伙伴也能轻松使用平台,实现自动化测试建设。
  • 团队在平台共同协作,将测试用例、测试数据等质量过程资产归档落库留存,以便复用&流传;
  • 通过自动化运行降低测试人员的测试时间成本、人力成本,提高测试效率、测试准确率。在回归测试,冒烟测试等场景下效率显著。

2. 本平台接口测试优势

  • 打通Yapi,支持Yapi项目接口一键同步到平台并生成初始化用例
  • 丰富的用例功能,样例数据、断言、参数化、个性化前后置等操作
  • 支持多用例串联集成场景化定时任务
  • 支持多任务集成任务组,减少项目下多任务的繁琐管理
  • 任务支持测试多套全局环境
  • 报告支持发送至OA、邮箱,实现告警通知
  • 支持接口AKSK鉴权
  • 可通过任务接口打通devops平台

3、平台功能平铺图


4、平台功能结构图


5. 接口业务使用流程


6. 平台中单用例测试执行流程详解


7. 平台中接口用例设计思想

  • 1、用例设计维度:
    ① 一个接口 由多条用例 不同数据 验证不同的验证点(即断言)
    ② 一条用例 由多条断言 去支撑测试结论
    ③ 一条用例 由多组数据 (样例数据)扩充用例的测试范围、支撑用例可靠性的强度

  • 2、举例:新开发的登录接口
    ① 接口多条用例:账号不可为空、密码不可为空、密码错误、禁用账户....     ② 一条用例多组数据:这10条密码应都错误     ③ 禁用账户用例设置断言接口状态码成功400、返回code400、用户状态为-1    

  • 3、一条用例不代表只发送一次请求,会发送(样例数据+全局变量)次

  • 4、样例数据虽然有多组数据,但视为一条用例,其中一组数据失败则用例失败

基础通用功能

一、登录、登出

1. 登录

  • 界面如下:

2. 登出

  • 点击页面右上方用户名按钮即可退出
  • 界面如下:



二、项目配置

1、新增项目

2、项目配置参数

  • 必填:
    • 项目标题
    • 可见用户:手动填写可见用户账号,用英文逗号分割,注意是测试平台人员账号
    • 项目类型:一般填写接口项目
  • 选填:
    • 描述
    • 版本
    • MQTT实例
    • 同步yapi配置信息:Yapi host、Yapi 项目id、Yapi 项目token



三、全局环境

1、全局环境

  • 全局环境包含:全局域名、全局变量、全局请求头、全局cookie。
  • 在接口测试、UI测试、MQTT测试的单用例&任务测试中都需要选择全局环境。

2、全局域名

  • 接口测试专用

3、全局变量

  • 全局变量格式如下:
[
	{
		"key": "参数名",
		"value": "参数值",
		"description": "参数描述",
		"enabled": false	// 是否启用
	},
	{
		"key": "key",
		"value": "value",
		"description": "description",
		"enabled": false
	},
	......
]

4、全局请求头

  • 接口测试专用
  • 全局域名格式如下:
{
	"key1": "value1",
	"key2": "value2",
	"key3": "value3",
	......
}

5、全局cookies

  • 接口测试专用
  • 全局域名格式如下:
{
	"key1": "value1",
	"key2": "value2",
	"key3": "value3",
	......
}



四、参数化功能

  • 参数化来源

  1. 全局变量:通过全局变量中的参数 参数化用例中的变量
  2. 前置操作:通过前置操作获取的参数 参数化用例中的变量
  3. 变量方法:通过特定方法 参数化用例中的变量
  • 参数化格式

  1. 普通参数化格式:{{variable}}
    可被参数化的项:请求地址、请求参数、请求体、请求头、请求cookies、样例数据、方法断言
	使用示例:
	
	当前全局变量中数据:
	[
		{
			"key": "name",
			"value": "张三",
			"description": "姓名",
			"enabled": true
		},
		{
			"key": "phone",
			"value": "13120009968",
			"description": "手机号",
			"enabled": true
		}
	]
	
	当前用例中请求体数据:
	{
		"name": "{{name}}",
		"phone": "{{phone}}"
	}
	
	发送用例后,实际请求体数据:
	{
		"name": "张三",
		"phone": "13120009968"
	}
  1. 变量方法格式:{@xxx}
	变量方法:
	{@date}:当天日期:2021-04-12
	{@date+n}:当天日期+n天
	{@date+n}:当天日期-n天
	{@timestamp}: 毫秒级时间戳:1618209388194
	{@num}: 自增长int数字,从1开始
	
	使用示例:
	
	参数化前:
	{
		"key1": "{@date} {@date+1} {@date-2} {@date}",
		"key2": "{@timestamp} {@timestamp} {@timestamp}",
		"key3": "{@num} {@num} {@num} {@num}"
	}
	
	参数化后:
	{
		"key1": "2021-04-17 2021-04-18 2021-04-15 2021-04-17",
		"key2": "1618630477124 1618630477124 1618630477124",
		"key3": "1 2 3 4"
	}



五、报告通知





接口自动化测试

快速上手

一、新增项目

  • 1、新增项目

  • 2、项目配置参数

    • 必填:
      • 项目标题
      • 可见用户:手动填写可见用户账号,用英文逗号分割,注意是测试平台人员账号
      • 项目类型:一般填写接口项目
    • 选填:
      • 描述
      • 版本
      • MQTT实例
      • 同步yapi配置信息:Yapi host、Yapi 项目id、Yapi 项目token



二、新增全局环境

  • 位置
1、新增全局域名
- 点击全局域名后面的+号
![](img2/4.jpg)
- 填写标题、选择项目、填写域名(字符串格式、按需填写)
- 域名示例:https://xxx-xxx.uat.xxx.com/
![](img2/34.jpg)
2、新增全局变量
- 点击全局变量后面的+号
- 填写标题、选择项目、填写变量(json中[]格式、按需填写)
- 请求头示例:
	``` json
	[
		{
			"key": "cklphone",
			"description": "登录账号",
			"enabled": true,
			"value": [
				"18681552452"
			]
		},
		{
			"key": "变量名称",
			"description": "变量描述",
			"enabled": true, //是否禁用此变量
			"value": [
				"20210801"	// 变量值
			]
		}
		...
	]
	```
![](img2/6.jpg)
3、新增全局请求头
  • 点击全局请求头后面的+号
  • 填写标题、选择项目、填写请求头内容(json中{}格式、按需填写)
  • 请求头示例:
{
    "Authorization": "123456xxx",
    "Content-Type": "application/json"
	...
}

4、新增全局cookies
  • 点击全局cookies后面的+号
  • 填写标题、选择项目、填写cookies内容(json中{}格式、按需填写)
  • cookies示例:
{
    "token1": "79b134wIjoxNjY",
    "token2": "r7XWRtudJ-qI"
	...
}

5、保存

三、项目下创建分组、接口

  • 方式一、手动创建分组&接口
  • 方式二、使用yapi同步功能自动创建分组&接口
    详情查看文档 Yapi同步功能 部分内容

四、创建用例&用例调试

  • 1、创建分组&接口后,点击接口名称,进入接口用例管理界面
  • 2、填写用例数据
    ① 选择刚才创建的全局环境
    ② 填写url
    ③ 填写请求参数或请求体
    ④ 按需使用参数化:
    示例中:调用全局变量参数: tenantId、account、password
    ⑤ 设计断言:
    示例中:
    1、验证状态码=200;
    2、验证响应code=200
    3、验证auth不为空
    4、验证auth=123456(错误断言)
    ⑥ 将响应中userId数据取出,并放到全局变量命名为userId,以便后续接口调用全局变量
    ⑦ 将响应中auth数据取出,并放到全局请求头中命名为Authorization,后续接口请求头中会自动添加Authorization
    ⑧ 发送请求调试用例:看到请求成功,并且调试断言直至符合需求即可

五、创建任务&执行定时任务

  • 1、测试任务中,添加任务

    • ① 填写任务名称
    • ② 测试类型选择:场景测试(目前只场景测试即可)
    • ③ 选择所属项目
    • ④ 选择要运行的环境
    • ⑤ 填写用例id:用例管理页面中会展示用例id
    • ⑥ 勾选要运行的环境:
    • ⑦ 选填定时表达式,六位:秒分时天月周:例子:0 17 8,13 * * 0-4
    • ⑧ 配置报告接收
    • ⑨ 保存即可
  • 2 运行测试任务

    • 执行完成后,从页面提示,或任务执行记录中查看执行详情
    • 查看历史执行记录
    • 查看执行详情
    • 查看OA通知
    • 填写定时任务并启动定时任务后,会定时执行任务



功能详情

一. 系统看板

1. 用例统计图

2. 测试任务分布图

3. 最近7天测试结果统计图

4. 近七周用户新增用例统计

5. 用户新增统计



二. 项目管理

界面如下:

1. 新增项目

按钮权限:仅超级管理员可见

新增后 项目只有创建者可见;添加可见用户格式: zhangsan,lisi,wangwu

2. 上传excel用例

1. 用例模板可从分组、接口中下载用例的excel文件作为模板使用。  
2. excel数据格式  
	① 项目名、分组名、接口名、接口描述、请求方式、用例状态、用例描述、请求地址 为 字符串格式  
	② 入参-url参数、入参-请求体、样例数据、headers、cookies、断言、前置操作、响应设置全局变量 为 json格式
		每个json格式参数具体json内容,下载用例后参照已有数据。  
3. 上传逻辑:  
	① 没有查到项目名称 则自动创建此新项目  
	② 没有查到分组名称 则在对应项目下创建分组  
	③ 没有查到接口名称 则在对应分组下创建接口  
	④ 没有查到用例名称 则在对应分组下创建用例  
	⑤ 同接口下 已存在相同用例名称 则会更新  

3. 项目配置

按钮权限:仅超级管理员可见

可配置项目名称、描述、版本号、可见用户



三. 分组管理

界面如下:

1. 新增分组

1. 点击【分组管理】
2. 输入 分组名称
3. 点击【新增】

2. 编辑分组

1. 点击【分组管理】
2. 选择 要编辑的分组
3. 输入 新的分组名称
4. 点击【更新】

3. 删除分组

1. 点击【分组管理】
2. 选择 要编辑的分组
3. 输入 新的分组名称
4. 点击【删除】

下载用例

下载所选分组下所有接口下的所有用例信息。文件格式:excel,下载后可修改excel后使用【上传用例】功能 上传更新



四. 接口管理

界面如下:

1. 新增接口

1. 点击【新增接口】
2. 选择 所属分组、请求方式、接口名称、接口描述
3. 点击【新增】
4. 即可在所选分组下新增接口

2. 编辑接口

3. 删除接口

4. 下载接口用例

下载接口下所有用例信息。文件格式:excel,下载后可修改excel后使用【上传用例】功能 上传更新



五. 用例管理

界面如下:

1. 新增用例

  • 方法一:新增

    1. 点击【清空】
    2. 填写用例数据
    3. 点击【保存】
    4. 即可将页面上用例数据作为一个新用例 新增到当前接口下
  • 方法二:另存

    1. 选择已有用例
    2. 在用例中修改参数
    3. 点击【另保】
    4. 即可将页面上新数据作为一个新用例 新增到当前接口下

2. 更新用例

1. 选择要修改的用例
2. 在页面修改用例数据
3. 点击【更新】
4. 此用例更新成功

3. 删除用例

1. 选择要修改的用例
2. 点击【删除】
3. 删除后会自动进入下一个用例

4. 清空用例

清空用例:所有数据清空(只是在页面展示上清空用例数据),不会做保存操作



六. 用例参数详解

  • 用例标题、用例描述、用例url地址

    类型:字符串

  • 请求参数:请求参数query & 请求体body

    • 请求参数query:
      无论在get还是post请求中,都会把 键值对 拼接到地址中
    • 请求体body:
      在get请求方式中,拼接到地址中;
      在post请求方式中,会作为单独的请求体;
  • 样例数据

    样例数据的作用是 期望自己添加的数据都符合断言,会循环请求每一条数据,直到数据都循环完毕,
    如果某条数据断言失败则停止循环,断言会显示此条数据的失败信息 为了方便添加样例数据,可以在excel中粘贴数据,在点击【excel与json互转】是粘贴数据转为json格式数据
    首行为数据名称(用例参数格式化名称),后面的每一行都为实际的数据

  • 断言

    • 1、字段说明
      | 项 | 说明 | | -------- | -----: | | 状态 | 为1代表启用,非1代表禁用,默认1 | | 变量路径 | 要取出的响应内容(python格式的取值写法格式) | | 断言方式 | 提供了一些封装好的方法,也可以选择最后一个方式自己写代码断言 | | 期望值 | 可以写str格式、json格式 | | 实际值 | 发送请求后可查看实际值 | | 断言结果 | 发送请求后可查看断言结果 |

    • 2、断言方式如下:

    • 3、部分断言方式实际使用示例:

  • 实际请求参数

    发送请求后,所有变量 都会被全局变量、前置操作、样例数据 参数化后的实际值
    测试人员可参考实际请求参数 调试优化所写的断言、前置、后置。
    发送请求后可查看实际请求参数

  • 响应体

    响应体:返送请求后展示响应的内容
    发送请求后可查看响应体

  • 请求头 & 响应头

    请求头:请求接口所用的请求头,正常填写即可 响应体:返送请求后展示响应的内容 发送请求后可查看响应体

  • 前置操作

    1、功能说明: 可以调用其他用例,并取出指定响应数据,放到全局变量中 2、字段详情:

    说明
    状态 为1代表启用,非1代表禁用,默认1
    调用用例id 已有用例id
    设置参数名 为要取出的内容设置变量名
    参数键 要取出的响应内容(python格式的取值写法格式)
    实际值 发送请求后可查看
  • 后置操作:响应体中的参数设置到全局变量

    1、功能说明:
    本次用例执行完毕之后 ,将响应体中的参数提取出来放到全局变量中

    2、字段详情:

    说明
    状态 为1代表启用,非1代表禁用,默认1
    变量名称 为要取出的内容设置变量名
    变量键 要取出的响应内容(python格式的取值写法格式)
    实际值 响应体中对应的值(发送请求后可查看)

    3、使用示例:

    1. 发送请求后得到响应体:

    ① 将响应体中的 ["code"] 设置到全局变量中(同名变量覆盖),并命名为code1
    ② 将响应体中的 ["code"] 设置到全局变量中(同名变量追加),并命名为code2

    1. 发送请求后,查看全局变量是否设置成功
     此时全局变量值:
     [
     	{
     		"key": "code1",
     		"value": [
     			"200"
     		],
     		"enabled": true,
     		"description": ""
     	},
     	{
     		"key": "code2",
     		"value": [
     			"200",
     		],
     		"enabled": true,
     		"description": ""
     	}
     ]

    可以看到都设置成功

  • 后置操作:响应体中的参数设置到全局请求头

    1、功能说明:
    本次用例执行完毕之后 将相应体中的参数提取出来放到全局请求头中
    具体操作同 [响应体中的参数设置到全局请求头]

  • 后置操作:响应cookies全部设置到当前全局cookies中

    1、功能说明:
    本次用例执行完毕之后 将本次响应cookies放到全局cookies中

  • 后置操作:清空全局cookies

    1、功能说明:
    本次用例执行完毕之后 清空全局cookies

  • 自定义代码(前置、断言、后置)

    0、功能说明:
    在前置方法、断言方法、后置方法中无法完善用例时,可用自定义代码功能补充 自定义代码-前置:作用在发送请求之前 自定义代码-断言:作用在发送请求之后(偏重断言) 自定义代码-后置:作用在发送请求之后(偏重设置变量、请求头等)

    1、自定义代码中可用的变量:

     	原生模块:time、json
    
     	响应体:response 类型--> response.json()["code"]	# 响应体变量在自定义前置操作中不可用
     	错误信息:error_msg = ""  # 错误信息为空代表设置成功,不为空代表失败,初始为空
    
     	全局域名:global_host --> str
     	全局变量:global_variable --> [{}, {},....]
     	全局请求头:global_header --> {}
     	全局cookies:global_cookie --> {}
    
     	请求地址:url  --> str
     	请求url参数:params --> {}
     	请求体:data --> {}
     	请求头:headers --> {}
     	请求cookies:cookies --> {}

    2、使用方法:
    ① 字符串str类型 只可修改:

     	示例数据:args = "这是一段str字符串"
     	
     	改:args = "这是一段str文字"	# 直接赋值即可

    ② 字典{}类型 增删改:

     	示例数据:args = {"key1": "value1"}
     	
     	1、获取:xx = args["key1"]			--> xx: value1
     	2、增:args["key2"] = "value2"		--> args: {"key1": "value1", "key2": "value2"}
     	3、删:del["key1"]					--> args: {}
     	4、改:args["key1"] = "new_value"	--> args: {"key1": "new_value"}

    ③ 全局变量比较特殊,使用以下为提供的方法增删改:

     	示例数据 args:
     	args = [
     		{
     			"key":"示例key",
     			"value":[
     				"示例value"
     			],
     			"description":"示例描述",
     			"enabled":true
     		}
     	]
     	1、获取全局变量的值:xx = get_global_variable(key)
     	v = get_global_variable("示例key")	--> v: 示例value
    
     	2、添加或修改全局变量都使用这个方法:add_global_variable(key, value, desc)
     	
     		修改:add_global_variable("示例key", "更新的值 必填", "更新的描述 选填")
     			--> 
     			args: [
     				{
     					"key":"示例key",
     					"value":[
     						"更新的值 必填"
     					],
     					"description":"更新的描述 选填",
     					"enabled":true
     				}
     			]
     			
     		新增:add_global_variable("新的key", "新的key的值", "新的key的描述")
     			--> 
     			args: [
     				{
     					"key":"示例key",
     					"value":[
     						"示例value"
     					],
     					"description":"示例描述",
     					"enabled":true
     				},
     				{
     					"key":"新的key",
     					"value":[
     						"新的key的值"
     					],
     					"description":"新的key的描述",
     					"enabled":true
     				}
     			]
    
     	3、删除某个全局变量:delete_global_variable(key)  -->  args: []

七. 测试任务

界面如下:

1. 新增任务

界面如下:

全量测试: 测试范围:(分组id下所有接口 + 接口id)去重后,所有接口下的用例,多线程执行用例

冒烟测试: 测试范围:(分组id下所有接口 + 接口id)去重后,所有接口下的第二个用例(每个接口只测一条用例),多线程执行用例

场景测试: 测试范围:填写用例id,按顺序执行用例(只处理用例id,写分组id、接口id无效)

选择项目: 在全量测试、冒烟测试情况下,可以在测试分组id中填写"all", 代表测试此项目下所有分组所有接口所有用例

cron表达式: 6位的cron表达式(秒 分 时 天 月 周):例: 每小时定时执行:0 0 * * * *

2. 编辑任务

3. 删除任务

4. 开始定时任务/停止定时任务/查看正在进行中的任务

cron表达式为空,或者不符合规范时,会有错误提示。

5. 执行记录

点击会跳转到报告列表页面,并且只展示此任务的执行报告记录。

6. 详情

点击可查看任务详情,如果启动了此任务的定时任务,则会在详情中展示下次执行时间。



八. 任务组

界面如下:

把多个任务放到一起形成一个任务组,方便定时任务的统一管理和任务的复用 界面功能基本与测试任务一致



九. 测试报告

1. 报告列表

界面如下:

2. 报告详情

① 查看报告详情

② 查看失败用例详情



十、Yapi同步功能

1、配置项目信息

2、同步yapi菜单&创建接口用例

  • 进入项目后,点击【同步Yapi】-【立即同步】即可实现同步yapi菜单&接口,并自动创建一条初始化用例
  • 如果有报错,会展示报错信息,没有报错展示统计信息
  • ① 同步接口结果统计
  • ② 新增接口后新增其下用例统计

3、同步细则(了解即可)

	yapi有分组,库里没有:新增分组、新增接口
	yapi有分组,库里也有:更新(名称),并下探接口
		1、yapi有,库里没有:新增
		2、yapi有,库里也有:更新
		3、yapi没有,库里有:提示“非yapi接口”,清空yapi_api_id
	yapi没分组,库里有:提示“非yapi分组”,清空 分组中yapi_group_id,和其下接口中yapi_api_id

	新增接口后是否新增用例:
		请求方式:GET:
			新增用例
		请求方式:POST:
			如果请求数据类型为json:
				新增用例
			如果请求数据类型为file、raw、form:
				不新增
		请求方式:其他:
			不新增



十一、AKSK功能

1、功能简介

AKSK:根据入参(请求头、请求体)、AK、SK 自动生成鉴权头authorization

2、使用限制

  • 请求体body仅限{}格式
  • 请求方式仅限 GET、POST

3、使用方法

  • 1、接口启用AKSK: 新增或编辑时,勾选AKSK

  • 2、全局变量中配置access_key、secret_key
    配置参考如下:

     [
       {
     	  "key": "access_key",
     	  "value": [
     		  "xxxxxxx"
     	  ],
     	  "description": "",
     	  "enabled": true
       },
       {
    
     	  "key": "secret_key",
     	  "value": [
     		  "yyyyyyy"
     	  ],
     	  "description": "",
     	  "enabled": true
       }
     ]
  • 3、用例中自动生成AKSK鉴权头authorization

    • 发送用例前:此时用例没有添加请求头authorization:
    • 发送用例后:实际发送请求后会自动添加authorization:





UI测试

核心思想与功能用法基本与接口测试一致,大同小异,略



MQTT测试

使用前请先了解MQTT整体使用流程、单用例测试流程&参数详解,以便高效进行MQTT测试。

1. 阿里云MQTT与自动化平台交互构架

2. 界面展示

3. 相关参数

4. 单用例测试流程与用例参数详解

5. 功能使用

其他功能与接口测试使用思路基本一致,略



报表测试

定制化需求,略

空文件

简介

集成接口、UI的易上手且功能强大的自动化测试平台 展开 收起
Python
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Python
1
https://gitee.com/Crazy__G/CrazyTester.git
git@gitee.com:Crazy__G/CrazyTester.git
Crazy__G
CrazyTester
自动化测试平台
master

搜索帮助

344bd9b3 5694891 D2dac590 5694891