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

python接口自动化-有token的接口项目使用unittest框架设计的更多相关文章

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

    获取token 在做接口自动化的时候,经常会遇到多个用例需要用同一个参数token,并且这些测试用例跨.py脚本了. 一般token只需要获取一次就行了,然后其它使用unittest框架的测试用例全部 ...

  2. python+pytest接口自动化(13)-token关联登录

    在PC端登录公司的后台管理系统或在手机上登录某个APP时,经常会发现登录成功后,返回参数中会包含token,它的值为一段较长的字符串,而后续去请求的请求头中都需要带上这个token作为参数,否则就提示 ...

  3. Python接口自动化(二)接口开发

    django 配置开发环境 相关命令 python manage.py runserver 127.0.0.1:8000在指定的地址和端口启动服务 python manage.py startapp ...

  4. python接口自动化(五)--接口测试用例和接口测试报告模板(详解)

    简介 当今社会在测试领域,接口测试已经越来越多的被提及,被重视,而且现在好多招聘信息要对接口测试提出要求.区别于传统意义上的系统级别测试,很多测试人员在接触到接口测试的时候,也许对测试执行还可以比较顺 ...

  5. Python接口自动化(一)接口基础

    HTTP接口熟悉 常见接口介绍 接口工具的使用 fiddler如何mock数据 常见接口基础面试 如何理解接口?前后端解耦,前端和后端数据对接桥梁 接口测试和功能测试区别在哪?接口测试是功能测试的一种 ...

  6. java接口自动化(一) - 接口自动化测试整体认知 - 开山篇(超详解)

    简介 了解什么是接口和为什么要做接口测试.并且知道接口自动化测试应该学习哪些技术以及接口自动化测试的落地过程.其实这些基本上在python接口自动化的文章中已经详细的介绍过了,不清楚的可以过去看看.了 ...

  7. Python接口自动化基础---token鉴权

    有些登录使用cookie,有些登录需要token验证,token传参一般有两种形式,一种是在请求头中,一种是使用URL传参 这里举例说明一下请求头中的token方式: #登录 param1={'use ...

  8. python接口自动化读取json,yaml配置文件+封装requests+unittest+HTMLRunner实现全自动化

    # coding=utf-8 import json import requests class TestApi(object): """ /* @param: @ses ...

  9. python接口自动化中,注册接口随机生成手机号码

    如大家所知在注册接口中,手机号参数需要的是未注册的手机号,而在测试用例中,你写入的手机号不一定是未注册的.所以这时需要对注册接口中传入的手机号做处理.下面我就分享一个课程里面学到的一个处理手机号的py ...

随机推荐

  1. Hdu 5439 Aggregated Counting (2015长春网络赛 ACM/ICPC Asia Regional Changchun Online 找规律)

    题目链接: Hdu 5439 Aggregated Counting 题目描述: 刚开始给一个1,序列a是由a[i]个i组成,最后1就变成了1,2,2,3,3,4,4,4,5,5,5.......,最 ...

  2. 清橙A1339. JZPLCM(顾昱洲)

    http://www.tsinsen.com/ViewGProblem.page?gpid=A1339 题解:https://blog.csdn.net/LOI_DQS/article/details ...

  3. httpclient 3.1跳过https请求SSL的验证

    一.因为在使用https发送请求的时候会涉及,验证方式.但是这种方式在使用的时候很不方便.特别是在请求外部接口的时候,所以这我写了一个跳过验证的方式.(供参考) 二.加入包,这里用的是commons- ...

  4. dos 下 批量替换 只支持txt

    首先必须存成 bat 格式,其次识别不了word 1.bat ##替换12 成12*3 @echo offsetlocal enabledelayedexpansionfor /F "tok ...

  5. P1936 水晶灯火灵

    题目描述 ,刚好符合以下③条规则:①m.n∈{1,2,……,k}②(n²-m*n-m²)²=1③m.n为整数. 输入输出格式 输入格式: Only one:k.(What?还是失败?) 输出格式: 共 ...

  6. iOS面试题之runloop

    本文围绕以下几个部分展开对runloop的叙述. 1.runloop是什么/runloop的概念? 2.NSRunLoop 和 CFRunLoopRef? 3.runloop和线程的关系? 4.run ...

  7. poj1190 生日蛋糕

    题意: 要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体. 设从下往上数第i(1 <= i <= M)层蛋糕是半径为Ri, 高度为Hi的圆柱.当i < M时,要求Ri > ...

  8. JS编写自己的富文本编辑器

    富文本编辑器,网上有很多功能齐全种类丰富的如百度的Ueditor,简单适用型的如WangEditor等等.在经过一番挑选后,我发现都不适用现在的项目,然后决定自己造轮子玩玩.富文本编辑器中主要涉及到J ...

  9. mysql出错排查

    1,例如:Can't connect to local MySQL server through socket '/tmp/mysql-5.5.37.sock' (2) Mysql链接出错,请配置/A ...

  10. postgres的强制类型转换与时间函数

    一.类型转换postgres的类型转换:通常::用来做类型转换,timestamp到date用的比较多select  now()::dateselect  now()::varchar 示例1:日期的 ...