企业微信项目
{项目背景 由于公司的组织架构升级,为了提高公司的办公管理效率,需要一款拥有丰富办公应用的在线聊天通讯工具的平台 }
业务架构
1.客户端:
企业微信app:支持手机和电脑端
即时通讯:文本、视频、会议、表情、电话(基本集成了微信的所有功能)
用户管理:通讯录、客户群、用户信息、应用设置,客户朋友圈
企业管理:创建企业、加入企业,成员与部门管理,企业信息
三方平台:
公众平台:小程序、直播、视频号
开放平台:自建小程序、添加第三方应用
支付:收款和付款
2.服务端:
内部应用开发:通讯录管理、客户联系、应用管理、消息推送、身份验证、移动端SDK、基础应用
第三方应用开发
智慧硬件开发
技术架构
客户–>网关–>获取acess_token–>各种业务API接口服务–>数据库和缓存
用例设计
本次设计以标签管理模块为出发点进行测试 标签接口:创建标签、修改标签、删除标签、查询标签; 添加标签成员、删除标签成员、查询标签成员
脚本编写思路
脚本编写:
接口测试和web测试脚本
测试框架:
api_manage:服务API接口管理
config:持久化数据文件,使之数据驱动
logs:执行用例生成的日志文件目录
protocol:接口测试的协议封装
test_manage:测试用例管理
utils:公共方法,例如获取根路径;获取常用字符串,时间,姓名等;封装日志,封装yaml文件数据流获取等
测试问题与解决方案
1.获取token的corpid与corpsecret需要自己账号
解决方案:要数据持久化,方便切换账号,引入yaml文件,由于其他场景也需要用yaml文件读取的方式获取,所以进行二次封装
class Yamls:
@classmethod
def get_yaml(cls, filename):
with open(f'{GetPath.get_path()}/config/{filename}.yml', encoding='utf-8') as f:
data = yaml.safe_load(f)
logger.debug(f"yaml文件数据流为:{data}")
return data
同时发现open读取文件用相对路径部分场景会报错,所以取项目根路径,根路径获取进行二次封装
def get_path(cls):
root_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
return root_dir
2.调试日志打印太多,不方便定位问题
解决方案:日志二次封装,设置日志级别并方便随时切换日志级别
3.执行过程中标签名称重复,导致测试案例数据耦合,执行失败
解决方案:增加后置步骤,删除新建标签 self.label.delete_label(tagid)
4.json格式的返回报文,如果是两个list比较,不校验顺序,如何断言
解决方案:考虑到一般返回的类型主要两种,list或者ditc,所以进行二次封装 查询发现有三种解决方案: (1).用sorted+operator方法进行排序后校验 (2).用set方法使之改成无序的集合类型 (3).使用Counter方法进行比较 结合使用情况,优先选择第1种方式,原因是set集合会把相同数据删除,而operator的传参可以是任意对象
def cmp(cls, x, y):
"""
json字符串全量比对
:param x: 预期值
:param y: 实际值
:return: 布尔值
"""
if isinstance(x, dict):
return operator.eq(x, y)
elif isinstance(x, list):
if len(x) == len(y):
l = []
for src_list, dest_list in zip(sorted(x), sorted(y)):
s = operator.eq(src_list, dest_list)
l.append(s)
if False in l:
return False
else:
return True
else:
return False
else:
if str(x) != str(y):
return False
5.如果切换环境,请求域名改变,所有涉及域名的地方都要修改,维护工程大
解决方案:设置默认环境,域名和环境参数结合保存到yaml文件,添加系统变量env为切换域名的参数,进行二次封装
env:
defult: "test"
test: "qyapi.weixin.qq.com"
sit: "qyapisit.weixin.qq.com"
prd: "qyapiadmin.weixin.qq.com"
def get_env(cls):
envs = Yamls.get_yaml("env")
key = envs.get('env').get('defult')
host = envs.get('env').get(key)
get_env = os.getenv('host')
if get_env == None:
env = host
elif envs.get('env').get(get_env) == None:
env = host
else:
env = envs.get('env').get(get_env)
return env
其中:window设置环境变量–>set env=test(不带引号) linux设置环境变量–>export env=“test”
6.测试案例的数据设置参数化过程中发现ids为中文时案例名称出现乱码
解决方案:新建conftest文件,使用勾子函数–》收集案例之后执行
def pytest_collection_modifyitems(session, config, items:list):
# 解决中文乱码
for item in items:
# 用例名
item.name = item.name.encode('utf-8').decode('unicode-escape')
# 用例路径
item._nodeid = item.nodeid.encode('utf-8').decode('unicode-escape')
后续优化问题
1.后置步骤删除操作,部分案例不需要执行,所以造成代码重复,如何提取这部分代码
2.添加标签员工,数据是获取成员接口获取,对原账号有数据依赖(后续可以通过添加成员接口创建成员,然后添加标签成员)
3.对于请求接口参数过多的,如果快速构建报文(设想是用schema生成模板报文,yaml文件存储参数值,取模板报文字段作为key,取文件值为value,组合成新的字典作为参数)