-
Q:框架的能力是什么?
A:统一标准,数据管理(测试数据,环境变量),可观测和报告,扩展能力,执行能力等,与业务无关
-
Q:是不是只能用Excel 写测试用例
A:不是,对于API 功能,步骤不多但测试数据多,适合excel数据驱动。后续会补充pytest 用例及其例子。其他的测试场景需评估测试数据。但是只要不是有逻辑分支的(类似于如果条件A下一步B否则C),都可以用Excel
-
Q:框架只能做API测试?
A:不是,目前UI(进行中),sql(进行中),websocket(进行中),还会支持kafka,linux等等
-
Q:为什么用Excel
A:数据驱动的测试用Excel,业务功能为主的团队首选Excel
数据驱动举例:
YML和Excel都是常用的自动化测试的文件,一旦测试用例和测试数据达到一定规模, YML在维护和管理上表现就不如Excel好
| 方案 |
适用场景 |
优势 |
劣势 |
技术门槛 |
版本控制 |
| Excel |
• 业务验收测试 |
• 业务友好,可视化编辑 |
• 版本控制困难 |
低 |
差 |
| • 非技术人员维护 |
• 批量管理方便 |
• 依赖较重 |
| • 中等数据量 |
• 组织结构化 |
• 类型安全性差 |
| YAML |
• 技术团队自动化 |
• 版本控制友好 |
• 缩进敏感易错 |
中 |
优秀 |
| • CI/CD集成 |
• 结构清晰 |
• 非技术人员学习成本 |
| • 需要版本控制 |
• 注释支持 |
• 工具支持弱 |
| |
• 轻量快速 |
|
| JSON |
• API测试 |
• 通用性强 |
• 可读性差 |
中 |
优秀 |
| • 前后端分离 |
• 解析性能好 |
• 无注释支持 |
| • 系统间数据交换 |
• Web友好 |
• 编辑繁琐 |
| SQL Database |
• 大规模测试数据 |
• 动态数据支持 |
• 环境依赖复杂 |
高 |
困难 |
| • 动态数据生成 |
• 强大查询能力 |
• 维护成本高 |
| • 多团队共享 |
• 数据一致性 |
• 版本管理复杂 |
| |
• 高性能 |
|
| 代码硬编码 |
• 简单测试场景 |
• 开发简单直接 |
• 维护灾难 |
低 |
优秀 |
| • 快速原型验证 |
• 无外部依赖 |
• 无法复用 |
| • 固定测试数据 |
• 类型安全 |
• 业务逻辑混杂 |
-
Q:之前已有自动化,需要转用现有框架吗?
A:不是必须,自动化目的是提效,如果之前写的测试用例在维护和测试方面都表现很好不需要迁移
-
Q:子系统自动化是不是只用写auto-test-icc2?
A:不是,也需要整理business层,做业务抽取
-
Q:后续devops整合后期望的执行流程
A:例子
上午8点:执行公共前置数据准备(各种配置,环境检查)
上午8点半:各个子系统用例执行
用例执行完触发:清理数据
-
Q:Excel 中Json格式小技巧
A:https://www.bejson.com/
把参数copy 到上述在线格式校验工具中,验证对了再copy 到Excel中(一定要保证json格式是正确无误的)
请把参数那一列Excel单元格格式改为文本
-
Q: pip install 报错No matching distribution found
ERROR: Could not find a version that satisfies the requirement playwright (from auto-test-framework-common) (from versions: none)
ERROR: No matching distribution found for playwright
A:安装python > 3.8+
-
Q: API 参数是json格式的string
A: 双引号里面要用单引号, sample如下
{
"Content-Type": "application/json",
"x-zkj-header": "{'type':'web','tenant':'$demo.tenant','version':'v2','product':'zrtc','user':'@user.string:value'}"}
-
Q: No module named 'src'
A:看看python解释器有没有配对, 进入虚拟环境, 安装依赖
# 创建虚拟环境 python -m venv .venv
激活虚拟环境
.venv\Scripts\activate
安装依赖
pip install -r requirements.txt
-
Q: git 配置令牌
A:到git上生成token
-
Q:saveAsVariable是什么?
A:是框架用来存返回结果的参数,如果期望返回结果到下一步使用, 要给返回值一个变量名。 Sample 如下, 红线部分会把响应结果存入这个response变量中,(saveAsVariable一般是必填的,否则框架给了默认的保存地址,下面步骤想取到你想获取的对应地址的结果就不对了。比如 api的response的默认保存地址是 api_response, 你在测试用例的参数里面没有指定特定的保存地址response,但是你下面的步骤中直接从@resonse.json:data里面取值,肯定是空值)
-
Q:请求参数无名,要放data里
例子:
以下API的data参数为一个string的数值,不是json
接口文档说明为:
A: 请在header中加 "Content-Type":"text/plain",
-
Q:Python版本一直不对,如果修改环境变量?
账户的环境变量可自行添加;系统的环境变量需授权,联系管家洋远程协助授权,修改系统环境变量,重新打开命令行工具检查版本。
-
Q:环境管理,不同环境的yml
A: 后续会改为perf.yml, test1.yml
-
Q:执行脚本之后的log优化
是否可以添加log记录当前组装之后的url请求以及request body具体内容?现在log显示出的url是带组装参数的,有时候无法确定组装的这个url是否是正确有效的,request body同理
A:会改进
-
Q:如何将响应的部分字段作为变量传值给下一个请求?
A:可以使用将所需要字段存为变量,作为下一个请求的输入
context_manager = get_context_manager()
context_manager.set(save_as_variable, result_data)
例如:
response=self.ruleservice_api.send_request(params=data_for_rule_getStrategyByCode)
context_manager = get_context_manager()
context_manager.set("strategyCode_to_delete", response['data']['data'][0]['strategyCode'])
data_for_rule_getStrategyByCode=self.test_data["hook_before_ruleservice_api_rule_deleteStrategy"]
hook_before_ruleservice_api_rule_deleteStrategy:method: "post"API: "/strategy/deleteStrategy"header: |{"tenantId": "TE16801824195507778","content-type": "application/json"}body: |{"tenantId": "TE16801824195507778","strategyCode": "@strategyCode_to_delete.string:value","updatedBy": "auto_test","newValue": 1}
-
Q: 使用pytest怎么使用进行数据校验?
A: 两种方法
方法一:独立判断
result=self.data_validator.validate_data(**self.test_data["validate_200"])
validate_200:{"field_name": "status_code","actual_value": "@init_rule_param_response.json:data.code","operator": "equal","expect_value": "500"}
方法一:放在同一个数据对应的"params"下:
result = self.data_validator.validate_data(**self.test_data["hook_before_ruleservice_api_init_rule_param"])
hook_before_ruleservice_api_init_rule_param:method: "get"API: "/strategy/initData"header: |{tenantId:TE16801824195507778content-type:application/json}saveAsVariable: "init_rule_param_response"'params': |{"field_name": "status_code","actual_value": "@init_rule_param_response.json:data.code","operator": "equal","expect_value": "500"}