前言

本章主要以【企业微信】为例讲述api自动化框架搭建

ps:有空再将代码会上传到github

  • github链接:

以前也写过类似简单的接口自动化测试搭建:
如下参考链接:

  • 接口自动化测试小demo:https://blog.csdn.net/Makasa/article/details/123954028?spm=1001.2014.3001.5501
  • 接口自动化测试框架搭建:https://blog.csdn.net/Makasa/article/details/113175512


一、整体框架介绍

apis-base包:封装api的基础类-contract包:封装组织的所有api  data包:参数化数据(excel 或者 yml...)logs包:日志文件testcase包:封装测试用例类utils包:工具包,例如读取参数化数据


二、具体框架搭建

Base包:

1、先创建一个base_api.py

  • 为什么要单独封装一个BasePage呢? 如果说以后,request库等这些第三方库底层进行了修改了,我们只需要更改BasePage即可,不会影响到其他类的代码,从某种程度上来说也就是进行解耦
"""该类为api测试框架的基类可以封装框架本身的东西,例如:request
"""
import requestsfrom mikasa_script.mikasa_auto.workwx_api_autotest.utils.log_utils import loggerclass BaseApi:def send_api(self, req, tools="requests"):"""对发送接口测试的工具进行封装(可以使用urlib3/requests):param tools::param req::return:"""# 如果没有发送工具,则默认使用requests# if not tools:#     tools = "requests"logger.info(f"获取到的工具为:{tools}")logger.info(f"获取到的接口发送的数据为:{req}")if tools == "requests":return requests.request(**req)

2、创建一个workwx_api.py,继承BaseApi

  • 由于以后可能又去测试其他的软件的api,所以我们这边就单独再创建一个workwx_api的类继承BaseApi,为了区分软件api
"""该类为企业微信api类这里可以封装针对企业微信的一些常用方法
"""
from mikasa_script.mikasa_auto.workwx_api_autotest.apis.base.base_api import BaseApiclass WorkWxApi(BaseApi):def __init__(self):self.token = Nonedef get_token(self, corpid, corpsecret):"""获取企业微信accesss_token:param corpid: 企业微信后台,我的企业可以找到:param corpsecret: 企业微信后台,管理工具—通讯录同步可以获取到:return:"""req = {"method": "GET","url": "https://qyapi.weixin.qq.com/cgi-bin/gettoken","params": {"corpid": corpid,"corpsecret": corpsecret}}res = self.send_api(req)self.token = res.json()["access_token"]print("获取到的accessToken:", self.token)return self.token


contract包:

1、创建一个department.py

  • 思路 : 相关的接口放一个类里,例如部门相关接口则创建一个类:department,里面封装部门相关的增删改查接口
  • 企业微信接口文档地址:https://developer.work.weixin.qq.com/document/path/90664
"""具体业务类:该类为企业微信,部门相关接口类注意:所有的具体业务类,需全部继承自WorkWxApi类
"""
from mikasa_script.mikasa_auto.workwx_api_autotest.apis.base.workwx_api import WorkWxApi
from mikasa_script.mikasa_auto.workwx_api_autotest.utils.utils import Utilsclass Department(WorkWxApi):def __init__(self):# 获取到yaml文件里的数据,传参调用get_tokenyaml_data = Utils.get_yaml_data("/corp_data.yaml")self.get_token(yaml_data.get("corpid").get("mikasa"), yaml_data.get("secret").get("department"))def create_department(self, _id):"""创建部门:return:"""req = {"method": "POST","url": "https://qyapi.weixin.qq.com/cgi-bin/department/create","params": {"access_token": self.token},"json": {"name": f"mikasa部门_创建{_id}","name_en": f"mikasa_create_{_id}","parentid": 1,"order": 1,"id": _id}}res = self.send_api(req)print("创建部门:", res.json())return res.json()def update_department(self, _id):"""修改部门:return:"""req = {"method": "POST","url": "https://qyapi.weixin.qq.com/cgi-bin/department/update","params": {"access_token": self.token},"json": {"name": f"mikasa部门{_id}","name_en": f"mikasa_create_{_id}","parentid": 1,"order": 1,"id": _id}}res = self.send_api(req)return res.json()def get_department(self):"""获取部门:return:"""req = {"method": "GET","url": "https://qyapi.weixin.qq.com/cgi-bin/department/list","params": {"access_token": self.token}}res = self.send_api(req)print(res.json())return res.json()def del_department(self, _id):"""删除部门:return:"""req = {"method": "GET","url": "https://qyapi.weixin.qq.com/cgi-bin/department/delete","params": {"access_token": self.token,"id": _id}}res = self.send_api(req)return res.json()if __name__ == '__main__':# Department().create_department(2)# Department().update_department(2)Department().get_department()# Department().del_department(2)


data包:

1、创建corp_data.yaml

  • 该yaml文件封装的是获取accesstoken接口需要的参数
  • 详情可具体看:https://developer.work.weixin.qq.com/document/path/91039
corpid:mikasa: ww0da7c2c6dbb1d65f
secret:department: NHkyn5X__aQTidlgH1fJbNtoAxyj1Nv_b9fwW8tnbuc

utils包:

1、创建utils.py

"""该类为工具类包括读取yaml文件/读取log日志文件路径
"""
import osimport jsonpath
import yamlclass Utils:@classmethoddef get_yaml_data(self, yaml_file):"""封装提取yaml文件的方法:param yaml_file:  传入文件的路径:return:"""with open(f"{Utils.get_data_path()}/{yaml_file}", encoding="utf-8") as f:datas = yaml.safe_load(f)return datas@classmethoddef get_data_path(self):"""获取data文件路径:return:"""path = os.sep.join([os.path.dirname(os.path.abspath(__file__)), "../data"])print("path", path)return path@classmethoddef get_log_path(cls):"""获取日志文件路径:return:"""path = os.sep.join([os.path.dirname(os.path.abspath(__file__)), "../logs"])print("path", path)return path@classmethoddef jsonpath_utils(cls, obj, expt):"""json处理工具:param obj::param expt::return:"""return jsonpath.jsonpath(obj, expt)if __name__ == '__main__':path = Utils.get_data_path()print(Utils.get_yaml_data("/corp_data.yaml"))

2、创建log_utils.py

"""该类为日志封装类
"""
import logging
import os# 实例化logger对象
from mikasa_script.mikasa_auto.workwx_api_autotest.utils.utils import Utilslogger = logging.getLogger(__name__)# 定义日志文件路径
log_path = Utils.get_log_path()# 判断路径是否存在,不存在就创建
if not os.path.exists(log_path):os.mkdir(log_path)# 绑定log的handler
file_handler = logging.FileHandler(filename=f"{log_path}/api_object.log", encoding="utf-8")
# 输出的formatter
formatter = logging.Formatter('[%(asctime).19s] %(process)d%(levelname).1s %(filename)s:%(lineno)d:%(funcName)s: %(message)s]')
# 日志格式与句柄的绑定
file_handler.setFormatter(formatter)
# 控制台句柄定义
steam_handler = logging.StreamHandler()
# 日志格式与句柄的绑定
steam_handler.setFormatter(formatter)
# 与logging进行绑定
logger.addHandler(file_handler)
logger.addHandler(steam_handler)
# 设置展示/写入文件的日志的级别
logger.setLevel(logging.INFO)


case包:

1、创建test_department.py

"""该类为企业微信的部门相关接口的测试用例类
"""
import allurefrom mikasa_script.mikasa_auto.workwx_api_autotest.apis.contract.department import Department
from mikasa_script.mikasa_auto.workwx_api_autotest.utils.log_utils import logger
from mikasa_script.mikasa_auto.workwx_api_autotest.utils.utils import Utils@allure.feature('test_department')
class TestDepartment:def setup(self):self.department_id = 1self.depart = Department()try:self.depart.del_department(self.department_id)except Exception as e:logger.warning("没有待删除的部门")def teardown(self):passdef setupclass(self):passdef teardownclass(self):pass@allure.story('test_create_department')def test_create_department(self):assert self.depart.create_department(self.department_id)["errcode"] == 0# logger.info(self.depart.get_department())obj = self.depart.get_department()department_list = Utils.jsonpath_utils(obj, "$..department..id")assert self.department_id in department_list

三、生成测试报告

1、allure命令

# terminal执行allure命令:  
pytest test_lover_pad.py --alluredir=./result --clean-alluredir #生成result文件allure serve ./result  #生成报告



2、展示报告

Python(十三)企业微信Api自动化框架搭建相关推荐

  1. Appnium(三)企业微信UI自动化框架搭建

    前言 本章主要讲述针对[企业微信App]进行AppUI自动化测试框架的搭建 ps:这里底层用的是Appnium,另外写了一下底层Uiautomator2的简单搭建 UIautomator2框架搭建实战 ...

  2. 基于Appium+WinAppDriver+Python的winUI3应用的自动化框架搭建分享(一)环境配置

    安装WinAppDriver 下载并安装WinAppDriver:来源 https://github.com/Microsoft/WinAppDriver/releases 开启电脑的开发者模式 设置 ...

  3. 基于企业微信api 开发 消息推送提醒 Python与Java

    1.关于脚本 身为一个程序猿,不管你从事什么开发,学会使用一门脚本语言可以提高你的开发效率.我目前使用的是Python,因为它支持的库非常多,拿来即用.在这个快节奏的开发,是非常有效率的,所以我非常强 ...

  4. python自动化框架pytest接口关联串联_基于python接口自动化框架搭建_pytest+jenkins+allure...

    本接口测试框架使用python语言实现,基于pytest测试框架,同时集成Jenkins和Allure 核心特性 封装requests请求,使用装饰器模式 详细的请求日志输出 环境与数据隔离,实现不同 ...

  5. python企业微信特定用户_python3调用企业微信api!开发一款属于自己的企业微信...

    python3调用企业微信api 最后更新时间:2020/5/11 前段时间,我将企业微信官方提供的python接口代码的部分功能修改成了python3的,并且自己也使用并测试过部分功能: 因为并没有 ...

  6. Linux Zabbix——企业监控基于钉钉、企业微信实现自动化报警

    zabbix基于企业微信.钉钉群聊机器人实现自动化报警 在企业中,我们使用zabbix去进行监控,需要时刻关注应用服务的运行情况,这就少不了实时报警,而使用即时通讯软件报警相对就很方便. 监控环境准备 ...

  7. linux 脚本调用企业微信_shell或python调用企业微信发送消息(实现报警功能)

    shell或python调用企业微信发送消息(实现报警功能) 官方文档 注册登陆企业微信 登录企业微信管理端 -> 应用与小程序 -> 应用 -> 自建,点击"创建应用&q ...

  8. insert时调用本身字段_python3调用企业微信api!开发一款属于自己的企业微信

    python3调用企业微信api 最后更新时间:2020/5/11 前段时间,我将企业微信官方提供的python接口代码的部分功能修改成了python3的,并且自己也使用并测试过部分功能: 因为并没有 ...

  9. 【Linux学习】如何编写Shell脚本调用企业微信api来发消息给企业微信成员?

    一.前言 最近通过python实现了发送消息给企业微信的功能,参考链接: [Jenkins学习 ]如何编写Python脚本来调用企业微信的api通知企业微信成员关于Jenkins的编译结果? http ...

  10. 利用企业微信API实现天气机器人、故障报警机器人等

    概述 很多公司内部都会使用企业微信进行通讯,恰恰企业微信又对我们开放了API,我们可以很方便的使用它提供的API实现一些自动化的功能. 比如在我们公司内部,定加班餐都需要在美餐页面点,并且只能是当天且 ...

最新文章

  1. php学习之Model类
  2. C#中实现js中的eval函数功能
  3. Java Bean + 注册验证
  4. 颠覆传统!麦肯锡的数字化咨询:只用5步,打造创新的数据架构
  5. HTML网页设计原理是什么,HTML+CSS网页设计详解
  6. hls ask 调制
  7. 多变量微积分(4)——多重积分之三重积分
  8. Origin introduction and install
  9. 编程学习视频网站汇总
  10. 球面坐标系与三角函数 Spherical Coordinates and Trigonometric Functions
  11. 服务器双向同步文件,lsyncd配置两台服务器文件双向实时同步
  12. 儿童摄影html代码源,HTML5织梦dede儿童摄影/影楼/写真/摄影工作室网站模板
  13. 裸金属服务器能虚拟化吗,市场需求多样化,裸金属服务器如何“吃得开”?
  14. 解决mac右键谷歌翻译失效
  15. STOP 0X0000007B蓝屏故障处理一例
  16. 10.9 顾z校内互坑题
  17. 我喜欢夜晚,黑黑的夜色带给人安全感
  18. 亿赛通携手湖北省勘察设计协会 共建数据安全
  19. python大神代码_求python大神写一个windows可运行的代码,学习学习。
  20. 【三维点云】CC教程1(Context Capture)

热门文章

  1. TraceView issue
  2. 什么是java句柄_JAVA中的术语:句柄是啥意思
  3. 聊聊ConcurrentHashMap
  4. SD-Host 控制器设计
  5. 【离散数学】图论 第七章(6) 图的结点着色和Welch Powell法、平面图着色、希伍德五色定理、四色定理
  6. 手机APP物联网远程控制开关
  7. linux系统怎么关闭445端口,如何关闭window 系统的445端口等方法 预防勒索病毒
  8. JavaScript BOM
  9. 内外网同时使用-路由配置
  10. 网上购物html5 sqlserver,网上购物商城系统的设计与实现(SQLServer)