zoukankan      html  css  js  c++  java
  • python接口自动化24-有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 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接口自动化完整版-------------------------

    全书购买地址 https://yuedu.baidu.com/ebook/585ab168302b3169a45177232f60ddccda38e695

    也可以关注下我的个人公众号:yoyoketang

  • 相关阅读:
    kettle在linux下执行任务
    activemq spring 集成与测试
    mysql创建存储过程,定时任务,定时删除log
    dubbo-admin 无法支持JDK1.8
    自定义事件驱动加异步执行
    AOP 实现自定义注解
    mybatis-plus的学习
    阿里巴巴架构师的成长之路
    Redis错误:jedis.exceptions.JedisDataException: ERR Client sent AUTH, but no password is set
    freemark基础知识
  • 原文地址:https://www.cnblogs.com/yoyoketang/p/9264773.html
Copyright © 2011-2022 走看看