毕业设计-企业微信实战

企业微信项目

{项目背景 由于公司的组织架构升级,为了提高公司的办公管理效率,需要一款拥有丰富办公应用的在线聊天通讯工具的平台 }

业务架构

1.客户端:
企业微信app:支持手机和电脑端
即时通讯:文本、视频、会议、表情、电话(基本集成了微信的所有功能)
用户管理:通讯录、客户群、用户信息、应用设置,客户朋友圈
企业管理:创建企业、加入企业,成员与部门管理,企业信息
三方平台:
公众平台:小程序、直播、视频号
开放平台:自建小程序、添加第三方应用
支付:收款和付款
2.服务端:
内部应用开发:通讯录管理、客户联系、应用管理、消息推送、身份验证、移动端SDK、基础应用
第三方应用开发
智慧硬件开发

技术架构

客户–>网关–>获取acess_token–>各种业务API接口服务–>数据库和缓存

image

用例设计

本次设计以标签管理模块为出发点进行测试 标签接口:创建标签、修改标签、删除标签、查询标签; 添加标签成员、删除标签成员、查询标签成员

image

脚本编写思路

脚本编写:
接口测试和web测试脚本
测试框架:
api_manage:服务API接口管理
config:持久化数据文件,使之数据驱动
logs:执行用例生成的日志文件目录
protocol:接口测试的协议封装
test_manage:测试用例管理
utils:公共方法,例如获取根路径;获取常用字符串,时间,姓名等;封装日志,封装yaml文件数据流获取等

image

测试问题与解决方案

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,组合成新的字典作为参数)