Pytest使用fixture实现token共享

同学们在做pytest接口自动化时,会遇到一个场景就是不同的测试用例需要有一个登录 的前置步骤,登录完成后会获取到token,用于之后的代码中。首先我先演示一个常规的做法。

  1. 首先在conftest定义一个login的方法,方法返回token
python 复制代码
@pytest.fixture(scope="function")
def login():
    header = {
            "Content-Type": "application/json"
    }
    data = {
            "username": "test",
            "password": "test"
    }
    login_info = requests.post(url='http://.../login',json=data).json()
    return login_info['token']

2.在测试用例方法中引入这个方法,所有用到token,都需要使用login这个方法。

python 复制代码
def test_user(login):
    token = login # 通过login获取token
    ......
def test_address(login):
    token = login # 通过login获取token
    ......

通过上面的方法,可以解决接口使用token的需求,不过这么做每次都会先执行login接口,有没有一种方法可以只执行一次login接口,后面的接口就不调用login接口了呢。经过老武测试,其实是可以做到的。

思路:login接口使用缓存,当有token的时候就使用token,就不调用login接口了,如果没有则调用login接口,再把token缓存起来。

那需要对上面login的方法进行改造,增加save_token方法,将token存起来。引入pickle模块,用来写数据。

python 复制代码
import pickle
@pytest.fixture(scope="function")
def login():
    ......
    # 增加缓存方法
    save_token(login_info['token'])
    return login_info['token']
 
def save_token(token):
    # login_path为目录中一个存放token的文件路径,自己定义。
    with open(login_path, 'wb') as f:
        pickle.dump(login_info, f)
        f.close()

上面代码完成了token的写入,当没有token的时候token写入到文件中。如果有token,我们就不需要执行登录操作,直接使用文件中的token,这个时候代码需要继续改造。方法开始时判断当前是否存在保存token的文件,如果有则获取token,不再执行登录的操作。再增加一个读取文件内容的方法get_login_info

python 复制代码
import pickle
@pytest.fixture(scope="function")
def login():
    if os.path.exists(login_info):
        return get_login_info(login_info)
    else:
        ......
        # 增加缓存方法
        save_token(login_info['token'])
        return login_info['token']
# 增加一个读取文件的方法
def get_login_info():
    with open(login_path, 'rb') as f:
        data = pickle.load(f)
        f.close()
        return data

以上工作已经完成了90%,再来个收尾就完美了。每次执行用例结束后把存token文件删除,不然生成了一个token,代码判断token文件存在,就不会去调用登录接口。token一但过期,用例就会执行失败。

在conftest定义一个方法,每次执行用例都清理一下token文件。要注意级别是session级别哦。

python 复制代码
@pytest.fixture(scope='session', autouse=True)
def clear_login_file():
    if os.path.exists(login_path):
        logger.info("清理token文件")
        os.remove(login_path)

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

软件测试面试小程序

被百万人刷爆的软件测试题库!!!谁用谁知道!!!全网最全面试刷题小程序,手机就可以刷题,地铁上公交上,卷起来!

涵盖以下这些面试题板块:

1、软件测试基础理论 ,2、web,app,接口功能测试 ,3、网络 ,4、数据库 ,5、linux

6、web,app,接口自动化 ,7、性能测试 ,8、编程基础,9、hr面试题 ,10、开放性测试题,11、安全测试,12、计算机基础

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

相关推荐
程序员爱钓鱼1 小时前
Go 语言泛型 — 泛型语法与示例
后端·面试·go
爱coding的橙子2 小时前
每日算法刷题Day42 7.5:leetcode前缀和3道题,用时2h
算法·leetcode·职场和发展
YuTaoShao5 小时前
【LeetCode 热题 100】56. 合并区间——排序+遍历
java·算法·leetcode·职场和发展
天涯学馆13 小时前
前端开发也能用 WebAssembly?这些场景超实用!
前端·javascript·面试
百度测试开发14 小时前
【软件测试】银行项目-转账功能测试点(详全)
自动化测试·软件测试·功能测试·软件测试工程师·接口测试·软件测试面试题·银行测试
CHENWENFEIc14 小时前
SpringBoot论坛系统安全测试实战报告
spring boot·后端·程序人生·spring·系统安全·安全测试
desssq15 小时前
力扣:70. 爬楼梯
算法·leetcode·职场和发展
然我16 小时前
别再只用 base64!HTML5 的 Blob 才是二进制处理的王者,面试常考
前端·面试·html
莫空000016 小时前
深入理解JavaScript的Reflect API:从原理到实践
前端·面试
磊叔的技术博客17 小时前
LLM 系列(六):模型推理篇
人工智能·面试·llm