Python接口自动化之使用token传入到header消息头中

python接口自动化之token传入到header消息头中

(1)创建登录请求获取token

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

#登录界面的测试用例类

#导入日志类便于设置日志信息

from Logs.Log import Logger

#导入配置文件类读取公共数据

from Readini.Read import Readini

#导入excel类便于读取excel中的数据

from DataExcel.readExcel import ExcelUtil

#导入request包

import requests

import json

from Public.PageObject import SendRequest

#导入json包

import unittest

import json

from builtins import str

#设置读取登录中相关参数

excel = ExcelUtil(Readini().get_ini_value('Excel','exccelini')).dict_data()

def  token():

    #设置消息头信息

     header=eval(excel[0]['header'])

     # 设置url数据

     url = excel[0]['Url']

    #设置参数信息

     param=excel[0]['payload']

     # 将设置的参数信息转换为json格式的数据

     #设置请求类型

     type=excel[0]['Method']

    #发送post登录请求

     response=SendRequest().send_request(type,url,data=param,header=header)

     #获取token数据

     token=response.json()['data']['access_token']

     #将token数据转换为字符串的格式

     return str(token)

(2)创建unittest公共初始化类并传入获取的token数据

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

from selenium import webdriver

import unittest

#创建unitest初始化公共类

from Logs.Log import Logger

log=Logger('接口自动化执行结果').getlog()

from TOKEN.PublicToken import token

import json

class TestBase(unittest.TestCase):

    #接口初始化开始

    @classmethod

    def setUpClass(cls):

        log.info('接口自动化测试开始')

        #传入获取的token作为初始化的token数据

        cls.token=token()

    #接口初始化结束

    @classmethod

    def tearDownClass(cls):

        log.info('接口自动化测试结束')

if __name__ == '__main__':

    unittest.main() #主函数  用于执行编写好的程序

(3)向header中传入初始化时获取的token

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

导入日志类便于设置日志信息

from Logs.Log import Logger

#导入配置文件类读取公共数据

from Readini.Read import Readini

#导入excel类便于读取excel中的数据

from DataExcel.readExcel import ExcelUtil

#设置读取登录中相关参数

excel = ExcelUtil(Readini().get_ini_value('Excel','exccelini')).dict_data()

#设置日志类型参数

log = Logger('登录接口日志执行结果').getlog()

#继承unittest初始化类

from ChanDao.TestBase import TestBase

#导入request包

import requests

from Public.PageObject import SendRequest

#导入json包

import unittest

import json

from Readini.Read import Readini

class Pinlun(TestBase):

  def  test_1_pinglun_success(self):

     '''登录成功'''

    #设置消息头信息

     header=eval(Readini().get_ini_value('header','headers'))

     #eval(excel[0]['header'])

     #像headers头中添加token信息

     header['Admin-Authorization']=self.token

     log.info(header)

     # 设置url数据

     url ='http://localhost:8090/api/admin/posts/comments'

     #log.info('退出的url地址是:' + url)

     #设置参数信息

     param={'page':'0','size':'10','keyword':'68'}

     # 将设置的参数信息转换为json格式的数据

    # log.info(param)

     #设置请求类型

     type='get'

     log.info(type)

    #发送get登录请求

     response=SendRequest().send_request(type,url,param,header=header)

     print(response.json())

    #获取登录响应状态码,做断言

     # self.assertEqual(response.status_code,excel[0]['StatusCode'])

     # log.info('响应状态码为200,登录成功')

#设置主函数执行编写的登录脚本

if __name__ == '__main__':

    unittest.main()

注意:

1.获取token需要调通登录接口

2.将token传入到unittest的Setup函数中

3.最后将token传入到header中

python接口自动化之token的处理

提取token

1、json解析提取

1

2

3

4

5

6

7

8

9

10

11

12

13

# -*- coding:utf-8 -*-

import requests

host = ""

user = ""

pwd = ""

url = host + "/pub/api/v1/web/web_login"

body = {

    "phone": user,

    "pwd": pwd

}

= requests.post(url=url, data=body).json()  # .json() 就是 json 解析,把json格式转为字典

token = r["data"]["token"]  # 字典取值

print(token)

2、正则提取json

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

# -*- coding:utf-8 -*-

import requests, re

host = ""

user = ""

pwd = ""

url = host + "/pub/api/v1/web/web_login"

body = {

    "phone": user,

    "pwd": pwd

}

= 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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

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

defwrite_yaml(token):

    cur = os.path.dirname(os.path.realpath(__file__))  # 获取当前路径

    yaml_path = os.path.join(cur, "token.yaml")  # 获取yaml文件的路径print(yaml_path)

    = {"token": token}  # 写入的内容withopen(yaml_path, 'w', encoding='utf-8') as f:

       yaml.dump(t, stream=f, allow_unicode=True)

defget_yaml(yaml_file):

    # yaml_file = "D:\\code\\api_test\\commen\\token.yaml"

    = open(yaml_file, 'r', encoding='utf-8')

    cfg = f.read()

    = yaml.load(cfg, Loader=yaml.FullLoader)

    """

    用load转字典

    yaml5.1版本后弃用了yaml.load(file)这个用法,因为觉得很不安全,5.1版本之后就修改了需要指定Loader,通过默认加载器(FullLoader)禁止执行任意函数

    Loader=yaml.FullLoader 加上这行代码,告警就没了

    """

    = d["token"]

    return d

if __name__ == '__main__':

    = write_yaml("token的值")

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

user.py

1

2

3

4

5

6

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

defuser_info(host, token):

    url = host + '/pub/api/v1/web/user_info'

    headers = {"token": token}  # token 放在请求头

    = requests.get(url=url, headers=headers)

    return r

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

test_user_info.py

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

# -*- 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")

classTestUserInfo(unittest.TestCase):

    @classmethoddefsetUpClass(cls):

        cls.token = get_yaml(token_path)

        print("获取token")

        print(cls.token)

    deftest_user_info_success(self):

        = 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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

# -*- 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()

 

总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

  1. 文档获取方式:

  2. 加入我的软件测试交流群:680748947免费获取~(同行大佬一起学术交流,每晚都有大佬直播分享技术知识点)

这份文档,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

以上均可以分享,只需要你搜索vx公众号:程序员雨果,即可免费领取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值