python接口自动化25-全局变量token项目设计

获取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.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 unittest from common.re_token import get_token # 作者:上海-悠悠 QQ交流群:588402570 class Test_01(unittest.TestCase):    @classmethod    def setUpClass(cls):        cls.token = get_token()        print("获取到当前用例token值:%s" % cls.token)    def test_01(self):        '''测试用例1'''        body1 = {            "a": "111111",            "b": "111111",            "token": self.token  # 参数关联        }        print("用例1body:%s" % body1)    def test_02(self):        '''测试用例2'''        body1 = {            "a": "222222",            "b": "2222222",            "token": self.token  # 参数关联        }        print("用例2body:%s" % body1) if __name__ == "__main__":    unittest.main()

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文件下生产一个测试报告

代码下载

完整代码可以在QQ群文件下载,QQ群:588402570

《python自动化测试全栈》课程-(7/8/9)3个月

(0)

相关推荐

  • (三)断言封装整合到requests封装中应用(纠错False,Result循环,tag测试)

    检查json_key_value: 检查: requests.py # -*- coding: utf-8 -*-#@File :demo_04.py#@Auth : wwd#@Time : 2020 ...

  • pytest参数化-读取excel allure报告展示

    由于近期公司要求项目接口自动化且使用参数化.装饰器等,我在网上查了一下资料,现在整理下,放便以后代码套用 版本: pytest==6.2.1 pytest-html ==2.1.1 pyyaml == ...

  • unittest框架中有多个测试方法,如何实现多个测试方法间参数的传递

    如下方代码中参数self.sucessnum和 self.faillnum,需要把test_case2中的self.faillnum值传递给test_case3,以实现一个累加功能.但是unittes ...

  • python接口自动化1-发送get请求

    前言 requests模块,也就是老污龟,为啥叫它老污龟呢,因为这个官网上的logo就是这只污龟,接下来后面的自动化都离不开它. 一.环境安装 1.用pip安装requests模块 >>p ...

  • python接口自动化2-发送post请求

    前言 发送post的请求参考例子很简单,实际遇到的情况却是很复杂的,首先第一个post请求肯定是登录了,但登录是最难处理的.登录问题解决了,后面都简单了. 一.查看官方文档 1.学习一个新的模块,其实 ...

  • python接口自动化3-自动发帖(session)

    前言 上一篇模拟登录博客园,但这只是第一步,一般登录后,还会有其它的操作,如发帖,评论等,这时候如何保持会话呢? 一.session简介 1.查看帮助文档,贴了一部分,后面省略了 >>im ...

  • python接口自动化4-绕过验证码登录(cookie)

    前言 有些登录的接口会有验证码:短信验证码,图形验证码等,这种登录的话验证码参数可以从后台获取的(或者查数据库最直接). 获取不到也没关系,可以通过添加cookie的方式绕过验证码. 一.抓登录coo ...

  • python接口自动化5-Json数据处理

    前言 有些post的请求参数是json格式的,这个前面第二篇post请求里面提到过,需要导入json模块处理. 一般常见的接口返回数据也是json格式的,我们在做判断时候,往往只需要提取其中几个关键的 ...

  • python接口自动化6-重定向(Location)

    前言 某屌丝男A鼓起勇气向女神B打电话表白,女神B是个心机婊觉得屌丝男A是好人,不想直接拒绝于是设置呼叫转移给闺蜜C了,最终屌丝男A和女神闺蜜C表白成功了,这种场景其实就是重定向了. 一.重定向 1. ...

  • python接口自动化7-参数关联

    前言 我们用自动化发帖之后,要想接着对这篇帖子操作,那就需要用参数关联了,发帖之后会有一个帖子的id,获取到这个id,继续操作传这个帖子id就可以了 一.删除草稿箱 1.我们前面讲过登录后保存草稿箱, ...

  • python接口自动化8-参数化

    前言 前面一篇实现了参数的关联,那种只是记流水账的完成功能,不便于维护,也没什么可读性,接下来这篇可以把每一个动作写成一个函数,这样更方便了. 参数化的思维只需记住一点:不要写死! 一.登录函数 1. ...

  • python接口自动化9-https请求(SSL)

    前言 本来最新的requests库V2.13.0是支持https请求的,但是一般写脚本时候,我们会用抓包工具fiddler,这时候会 报:requests.exceptions.SSLError: [ ...