python-接口自动化 token 的处理

前言

关于token,如果不了解的,先去看Jmeter这篇文章
https://www.cnblogs.com/wwho/p/14154786.html


思路跟 jmeter 中一样,在 python 中取 token 的值,可以通过 re 正则来取,也可以通过 json 解析来取。



一、提取token

1、json解析提取

# -*- coding:utf-8 -*-
import requests
host = ""
user = ""
pwd = ""

url = host + "/pub/api/v1/web/web_login"
body = {
    "phone": user,
    "pwd": pwd
}
r = requests.post(url=url, data=body).json()  # .json() 就是 json 解析,把json格式转为字典
token = r["data"]["token"]  # 字典取值
print(token)



2、正则提取json

# -*- coding:utf-8 -*-
import requests, re
host = ""
user = ""
pwd = ""

url = host + "/pub/api/v1/web/web_login"
body = {
    "phone": user,
    "pwd": pwd
}
r = requests.post(url=url, data=body).text
print(r)
token = re.findall('"token":"(.+?)"', r)
token = token[0]  # 正则取出来的值是 列表 类型,所以要进行列表取值
print(token)


二、结合框架使用 token

python里面有个全局变量global,但这个只是针对于在同一个.py里才有效,跨脚本就不起作用了。

整体的思路:

1、登录后返回 token,把 token 写入 yaml 文件中,yaml 文件放在公共模块 commen 中
2、需要 token 的时候(一般是调用写用例的时候),在初始化中读取 yaml 文件中最新的 token 值
3、每个用例的 package 执行的时候去调用获取 token
4、最后执行所有用例,生成报告,发送邮件等


所以先把读写 yaml 的方法封装好

headle.py

# -*- coding:utf-8 -*-
import os, yaml


def write_yaml(token):
    cur = os.path.dirname(os.path.realpath(__file__))  # 获取当前路径
    yaml_path = os.path.join(cur, "token.yaml")  # 获取yaml文件的路径
    print(yaml_path)
    t = {"token": token}  # 写入的内容

    with open(yaml_path, 'w', encoding='utf-8') as f:
       yaml.dump(t, stream=f, allow_unicode=True)


def get_yaml(yaml_file):
    # yaml_file = "D:\\code\\api_test\\commen\\token.yaml"
    f = open(yaml_file, 'r', encoding='utf-8')
    cfg = f.read()
    d = yaml.load(cfg, Loader=yaml.FullLoader)
    """
    用load转字典
    yaml5.1版本后弃用了yaml.load(file)这个用法,因为觉得很不安全,5.1版本之后就修改了需要指定Loader,通过默认加载器(FullLoader)禁止执行任意函数
    Loader=yaml.FullLoader 加上这行代码,告警就没了
    """
    d = d["token"]
    return d


if __name__ == '__main__':
    r = write_yaml("token的值")

封装接口的时候,把 token 设置成变量

user.py

# -*- coding:utf-8 -*-
import requests


def user_info(host, token):
    url = host + '/pub/api/v1/web/user_info'
    headers = {"token": token}  # token 放在请求头
    r = requests.get(url=url, headers=headers)
    return r


编写用例的时候先获取 yaml 文件中 token 的值

test_user_info.py

# -*- coding:utf-8 -*-
from interface.user import user_info
from commen.headle_token import *
import unittest, os
current_path = os.path.dirname(os.path.realpath(__file__))  # 获取当前路径
# 获取 token 的路径
token_path = os.path.join(current_path, "commen")
token_path = os.path.join(token_path, "token.yaml")


class TestUserInfo(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        cls.token = get_yaml(token_path)
        print("获取token")
        print(cls.token)

    def test_user_info_success(self):
        r = user_info("https://api.xdclass.net", self.token)
        print(r.text)


if __name__ == '__main__':
    unittest.main()


主程序

1、登录返回token
2、token 写入 yaml 文件
3、执行用例初始化的时候先获取 token
4、执行用例生成报告

run_case_report.py

# -*- coding:utf-8 -*-
import unittest, os
from commen import HTMLTestRunner
from interface.login import login
from commen.headle_token import *

current_path = os.path.dirname(os.path.realpath(__file__))
case_path = os.path.join(current_path, "case")

report_path = os.path.join(current_path, "report")
report = os.path.join(report_path, "report.html")


def all_case():
    discover = unittest.defaultTestLoader.discover(case_path,
                                                   pattern='test*.py')
    print(discover)
    return discover


def run_case_report():
    fb = open(report, "wb")
    runner = HTMLTestRunner.HTMLTestRunner(
        stream=fb,
        title="xx项目测试报告",
        description="xx项目的测试报告"
    )
    runner.run(all_case())
    fb.close()


if __name__ == '__main__':
    # 调用登录获取token
    token = login("host", "登录的账号", "密码")
    # 把token写入 yaml 文件
    write_yaml(token)
    # 执行用例的时候会读取 yaml 中的token,case文件下 test_user_info.py 的
    run_case_report()


posted @ 2021-10-19 15:59  西瓜_皮  阅读(2984)  评论(0编辑  收藏  举报