接口自动化学习代码

apiobject模式(学习代码:部门管理增删改查自动化测试框架)

1.代码目录

    -接口测试po模式训练
      -api
        -__init__.py
        -department.py
        -firstwork.py
        -baseapi.py
      -data
        -config.yml
      -interface
        -__init__.py
        -test_department.py
        -utils.py
      -logs
        apitest.log 

2.代码

api代码

baseapi.py

class BaseApi:
    #设置logging
    fileHandler = logging.FileHandler(filename="../logs/apitest.log")
    #设置日志等级
    logging.getLogger().setLevel(0)
    #设置日志内容格式
    formatter = logging.Formatter('%(asctime)s %(name)s %(levelname)s %(module)s:%(lineno)d %(message)s')
    fileHandler.setFormatter(formatter)
    #设置生效
    logging.getLogger().addHandler(fileHandler)

    def log_info(self,msg):
        '''
        写日志的方法
        :param msg: 要打印都日志的信息
        :return: info级别的日志
        '''
        return logging.info(msg)

    def send_api(self,req):
        '''
        对requests进行二次封装
        :param req:
        :return:返回接口响应结果
        '''
        self.log_info("----------request data----------")
        self.log_info(req)
        r = requests.request(**req)
        self.log_info("----------response data----------")
        self.log_info(r.json())
        return requests.request(**req)

firstWork.py

'''
企业微信调用部门接口前,需要信息认证
'''
import requests
import pytest

from 接口测试po模式训练.api.send_api import BaseApi


class firstWork(BaseApi):

    def __init__(self, corpid, corpsecret):
        self.token = self.get_access_token(corpid, corpsecret)

    def get_access_token(self,corpid,corpsecret):

        '''
        获取access_token
        :return:
        '''

        # corpid = "ww02f9f41e1958d910"
        # corpsecret = "v_xbPx4VWhwQkiz7lZz3JJWcPH_WQOly3UvfTYZjyHo"
        # 请求地址
        url =f" https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={corpid}&corpsecret={corpsecret}"


        #把接口封装到字典中
        req = {
            "method": "GET",
            "url": url,

        }
        # 调用方法对字典解包,发出get请求(原始响应结果)
        r = self.send_api(req)
        print(r.json())
        token = r.json()["access_token"]
        return token

department.py

'''
接口信息描述:不加断言,不加测试数据,只写方法
每个方法需返回接口响应体
'''
import requests

from 接口测试po模式训练.api.firstWork import firstWork
from 接口测试po模式训练.interface.utils import Utils


class Department(firstWork):

    #描述接口方法时,将测试数据以参数形式展示,方便后面测试脚本调用接口中的方法进行传参测试
    def create_department(self,create_data):
        '''
        创建部门
        :return:
        '''
        params = {
            "access_token": self.token
        }

        create_url = 'https://qyapi.weixin.qq.com/cgi-bin/department/create'
        # 发送请求
        #r1 = requests.post(create_url, params=params, json=create_data)
        #把接口内容封装到字典里面
        req = {
            "method": "POST",
            "url": create_url,
            "params": params,
            "json": create_data
        }
        #调用接口封装方法解包接口,发出请求
        r = self.send_api(req)
        print(r.json())
        return r.json()

    def update_department(self,update_data):
        '''
        更新部门
        :return:
        '''
        update_url = f"https://qyapi.weixin.qq.com/cgi-bin/department/update?access_token={self.token}"

        #r2 = requests.post(update_url, json=update_data)
        #把接口内容进行封装
        req = {
            "method": "POST",
            "url": update_url,
            "json": update_data
        }
        #调用封装方法解包接口内容,发出请求
        r = self.send_api(req)
        return r.json()

    def get_department(self):
        '''
        获取部门
        :return:
        '''
        get_data ={

        }
        get_url = f'https://qyapi.weixin.qq.com/cgi-bin/department/list?access_token={self.token}'

        #r3 = requests.get(get_url, params=get_data)
        #把接口内容进行封装
        req ={
            "method":"GET",
            "url": get_url,
            "params":get_data
        }

        #调用接口封装方法对接口内容进行解包
        r = self.send_api(req)

        return r.json()

    def delete_department(self,depart_id):
        '''
        删除部门
        :return:
        '''
        url = 'https://qyapi.weixin.qq.com/cgi-bin/department/delete'
        params = {
            "access_token":self.token,
            "id":depart_id
        }
        #r4 = requests.get(url, params)

        #把接口内容进行封装
        req = {
            "method": "GET",
            'params': params,
            "url": url
        }
        #调用接口函数对接口内容进行解包,发送请求
        r = self.send_api(req)
        return r.json()

    def clear_department(self):
        '''
        清理已经存在的部门
        :return:
        '''

        #查询当前存在的部门
        depart_list = self.get_department()
        #提取部门id
        id_list = Utils.base_jsonpath(depart_list,"$..id")
        #id 为1 的最基础的父部门,不能删除
        for i in id_list:
            if i !=1:
                #调用删除部门的接口完成清除操作
                self.delete_department(i)

测试代码

utils.py

# -*- coding:UTF-8 -*-
'''
@Project : 607project
@file : utils.PY
@Date : 2021/10/18 11:53
@Author : Fairy
'''
import yaml
from jsonpath import jsonpath


class Utils:

    @classmethod
    def base_jsonpath(cls, obj, json_expr):
        '''
        封装jsonpath断言方法
        :param obj: 要断言的json格式的响应内容
        :param json_expr: jsonpath表达式
        :return: 断言结果
        '''
        return jsonpath(obj, json_expr)

    @classmethod
    def get_yaml_data(cls, file_path):
        '''
        封装yaml文件读取方法
        :param file_path:yaml文件路径
        :return:返回字典格式yaml文件
        '''

        with open(file_path) as f :
            datas =yaml.safe_load(f)

        return datas

test_department.py

'''
测试用例
'''
from 接口测试po模式训练.api.department import Department
from 接口测试po模式训练.interface.utils import Utils
import allure
import pytest

'''
第一版框架
1.根据ApiObject模式完成了分层
2.从firstWork中获取token,department中描述接口完成身份认证
3.测试用例中通过setup_class实例化接口描述的类
4.测试用例中传入测试数据,完成断言
'''
@allure.feature("部门管理")
class TestDepartment:

    def setup_class(self):
        #获取通讯录管理的token参数
        conf_data = Utils.get_yaml_data("../data/config.yml")
        corpid = conf_data["corpid"]["qiyeceshi"]
        corpsecret = conf_data["secret"]["department_secret"]


        #实例化部门类
        self.department = Department(corpid, corpsecret)
        #清除部门数据
        self.department.clear_department()

        #准备测试数据
        #创建部门的测试数据
        self.depart_id = 5

        self.create_data = {
            "name": "天津研发中心",
            "name_en": "TJ",
            "order": 11,
            "id": self.depart_id,
            "parentid": 1
        }


        #更新部门的测试数据

        self.update_data = {
            "id": self.depart_id,
            "name": "天津研发中心——更新"
        }

        # self.delete_data = {
        #     "id": self.depart_id
        # }
    @allure.story("部门操作场景用例")
    def test_department_scene(self):
        '''
        部门增删改查测试
        :return:
        '''
        # 创建部门
        with allure.step("创建部门"):
            self.department.create_department(self.create_data)

        #查询创建是否成功
        with allure.step("查询部门创建结果"):
            res1 = self.department.get_department()
            #assert res1["department"][6]["name"] == "天津研发中心"

            #通过jsonpath断言
            name_list = Utils.base_jsonpath(res1,"$..name")
            print(name_list)
            assert "天津研发中心" in name_list
            print(res1)

        # 更新部门
        with allure.step("更新部门"):
            self .department.update_department(self.update_data)

        # #查询更新是否成功
        with allure.step("查询部门更新结果"):
            res2 = self.department.get_department()
            #assert res2["department"][3]["name"]=="天津研发中心——更新"

            #通过jsonpath断言
            name_list = Utils.base_jsonpath(res2,"$..name")
            print(name_list)
            assert "天津研发中心——更新" in name_list

        # 删除部门
        with allure.step("删除部门"):
            self.department.delete_department(self.depart_id)

        #查询删除是否成功(通过验证删除一个部门后,部门列表的长度)
        with allure.step("查询部门删除结果"):
            res3 = self.department.get_department()
            #assert len(res3["department"])==4

            #通过jsonpath断言
            id_list = Utils.base_jsonpath(res3,"$..id")
            #操作的部门id删除后不在部门id列表中
            assert self.depart_id not in id_list

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容