python接口自动化-有token的接口项目使用unittest框架设计

Posted 暖阳深处

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python接口自动化-有token的接口项目使用unittest框架设计相关的知识,希望对你有一定的参考价值。

获取token

在做接口自动化的时候,经常会遇到多个用例需要用同一个参数token,并且这些测试用例跨.py脚本了。
一般token只需要获取一次就行了,然后其它使用unittest框架的测试用例全部调用这个参数,那么如何实现呢?
虽然python里面有个全局变量global,但这个只是针对于在同一个.py里才有效,跨脚本就不起作用了。

解决思路

  • 1.首先把公共数据单独抽出来,用一个文件去管理,如yaml文件
  • 2.写一个读yaml文件的get_token()函数放到a.py,去读取需要的数据
  • 3.其它脚本全部调用a.py里面的get_token()函数,然后传参
  • 4.token动态获取可以写个登录函数放到run.py,获取到之后把token值写入到yaml文件,这样保证每次token都是最新的
  • 5.run.py里面在运行所有用例之前先登录一次并写入token到yaml,然后执行所有用例,出报告结果

设计结构如下

yaml配置

1.公共参数我们可以写入到一个单独的配置文件里,这里配置文件我用的yaml来管理数据

读取token

1.写个读取yaml文件里面的token值的函数,放到re_token.py,代码如下:

# coding:utf-8
import yaml
import os
# 作者:上海-悠悠 QQ交流群:588402570

cur = os.path.dirname(os.path.realpath(__file__))

def get_token(yamlName="token.yaml"):
    \'\'\'
    从token.yaml读取token值
    :param yamlName: 配置文件名称
    :return: token值
    \'\'\'
    p = os.path.join(cur, yamlName)
    f = open(p)
    a = f.read()
    t = yaml.load(a)
    f.close()
    return t["token"]

if __name__ =="__main__":
    print(get_token())

 

测试用例token参数关联

1.经常用人问token如何参数关联,问这种问题的,基本上没认真学过python,估计平常写的代码都是东拼西凑到处复制过来的。

2.token的参数关联用一个中间变量【token】去接收上一步【get_token()函数)】获取的token值就行了,再传入到需要的地方,so easy!

3.以下代码是test_01和test_02里面写入的演示案例

# coding:utf-8
import yaml
import os
# 作者:上海-悠悠 QQ交流群:588402570

cur = os.path.dirname(os.path.realpath(__file__))

def get_token(yamlName="token.yaml"):
    \'\'\'
    从token.yaml读取token值
    :param yamlName: 配置文件名称
    :return: token值
    \'\'\'
    p = os.path.join(cur, yamlName)
    f = open(p)
    a = f.read()
    t = yaml.load(a)
    f.close()
    return t["token"]

if __name__ =="__main__":
    print(get_token())

 

 

4.执行结果:

..
获取到当前用例token值:yoyoketang
用例1body:{\'token\': \'yoyoketang\', \'a\': \'111111\', \'b\': \'111111\'}
用例2body:{\'token\': \'yoyoketang\', \'a\': \'222222\', \'b\': \'2222222\'}
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK

 

执行策略

1.单个脚本运行没问题了,那么如果一次性执行多个用例脚本,都调用同一个token值呢?run.py脚本参考如下

# coding=utf-8
import unittest
import os
import yaml
from common import HTMLTestRunner_cn
from ruamel import yaml

curpath = os.path.dirname(os.path.realpath(__file__))

# 作者:上海-悠悠 QQ交流群:588402570

def login(user="yoyo", psw="123456"):
    \'\'\'
    先执行登录,传账号和密码两个参数
    :return: 返回token值
    \'\'\'
    print("登录的账号名称:%s" % user)
    p = psw
    print("输入的密码:**********")
    token = "xxxxxxxxx"     # 登录后获取到的token值
    return token

def write_yaml(value):
    \'\'\'
    把获取到的token值写入到yaml文件
    :param value:
    :return:
    \'\'\'
    ypath = os.path.join(curpath, "common", "token.yaml")
    print(ypath)
    # 需写入的内容
    t = {"token": value}
    # 写入到yaml文件
    with open(ypath, "w", encoding="utf-8") as f:
        yaml.dump(t, f, Dumper=yaml.RoundTripDumper)

def all_case(rule="test*.py"):
    \'\'\'加载所有的测试用例\'\'\'
    case_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), "case")
    # 定义discover方法的参数
    discover = unittest.defaultTestLoader.discover(case_path,
                                                  pattern=rule,
                                                  top_level_dir=None)
    return discover


def run_case(all_case, reportName="report"):
    \'\'\'
    执行所有的用例, 并把结果写入HTML测试报告
    \'\'\'
    curpath = os.path.dirname(os.path.realpath(__file__))
    report_path = os.path.join(curpath, reportName)  # 用例文件夹
    # 如果不存在这个report文件夹,就自动创建一个
    if not os.path.exists(report_path):os.mkdir(report_path)
    report_abspath = os.path.join(report_path, "result.html")
    print("report path:%s"%report_abspath)
    fp = open(report_abspath, "wb")
    runner = HTMLTestRunner_cn.HTMLTestRunner( stream=fp,
                                               verbosity=2,
                                               title=u\'自动化测试报告,测试结果如下:\',
                                               description=u\'用例执行情况:\')

    # 调用add_case函数返回值
    runner.run(all_case)
    fp.close()

if __name__ == "__main__":
    token = login("admin", "111111")  # 1.登录
    write_yaml(token)                   # 2.写入yaml
    allcases = all_case()                  # 3.加载用例
    run_case(allcases)

 

2.执行完之后再report文件下生产一个测试报告

以上是关于python接口自动化-有token的接口项目使用unittest框架设计的主要内容,如果未能解决你的问题,请参考以下文章

python接口自动化之token登录

python接口自动化脚本请求添加token信息2018-06-22

python接口自动化23-token参数关联登录(登录拉勾网)

python接口自动化23-token参数关联登录(登录拉勾网)

python接口自动化4-常用取token值方法

Python接口自动化之Token详解及应用