当前位置: 首页 > news >正文

Pytest使用fixture实现token共享

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

  1. 首先在conftest定义一个login的方法,方法返回toke
  2. @pytest.fixture(scope="function")

  3. def login():

  4. header = {

  5. "Content-Type": "application/json"

  6. }

  7. data = {

  8. "username": "test",

  9. "password": "test"

  10. }

  11. login_info = requests.post(url='http://.../login',json=data).json()

  12. return login_info['token']

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

  1. def test_user(login):

  2. token = login # 通过login获取token

  3. ......

  4. def test_address(login):

  5. token = login # 通过login获取token

  6. ......

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

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

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

  1. import pickle

  2. @pytest.fixture(scope="function")

  3. def login():

  4. ......

  5. # 增加缓存方法

  6. save_token(login_info['token'])

  7. return login_info['token']

  8. def save_token(token):

  9. # login_path为目录中一个存放token的文件路径,自己定义。

  10. with open(login_path, 'wb') as f:

  11. pickle.dump(login_info, f)

  12. f.close()

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

  1. import pickle

  2. @pytest.fixture(scope="function")

  3. def login():

  4. if os.path.exists(login_info):

  5. return get_login_info(login_info)

  6. else:

  7. ......

  8. # 增加缓存方法

  9. save_token(login_info['token'])

  10. return login_info['token']

  11. # 增加一个读取文件的方法

  12. def get_login_info():

  13. with open(login_path, 'rb') as f:

  14. data = pickle.load(f)

  15. f.close()

  16. return data

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

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

  1. @pytest.fixture(scope='session', autouse=True)

  2. def clear_login_file():

  3. if os.path.exists(login_path):

  4. logger.info("清理token文件")

  5. os.remove(login_path)

总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

 

          视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。


http://www.mrgr.cn/news/29734.html

相关文章:

  • 图像处理实验四(Adaptive Filter)
  • Javaweb—Ajax与jQuery请求
  • 【JavaWeb】JavaWeb入门之XML详解
  • scala的练习题
  • Kafka新节点加入集群操作指南
  • 《基于深度学习的车辆行驶三维环境双目感知方法研究》
  • 驱动开发知识点
  • 在 Linux 系统中目录架构说明
  • 记录工作中遇到的问题(持续更新~)
  • Kubernetes Ingress
  • C++面试3
  • 根据 IP 地址进行 VPN 分流(详细,亲测,通用)
  • 深度学习 之 常见损失函数简介:名称、作用及用法
  • vue 2表格滚动加载
  • 【VUE】快速上手
  • 心觉:不能成事的根本原因
  • 龙海家园的免费停车点探寻
  • 【C语言】带你手把手拿捏指针(3)(含转移表)
  • 中、美、德、日制造业理念差异
  • Linux常见查看文件命令
  • 数学学习记录
  • vue获取最近7天时间;获取任意时间段时间
  • Flutter 优化技巧分享
  • 基于python+django+vue的医院预约挂号系统
  • Mobile net V系列详解 理论+实战(1)
  • python中网络爬虫框架