• Pytest使用fixture实现token共享


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

    首先在conftest定义一个login的方法,方法返回token

    1. @pytest.fixture(scope="function")
    2. def login():
    3. header = {
    4. "Content-Type": "application/json"
    5. }
    6. data = {
    7. "username": "test",
    8. "password": "test"
    9. }
    10. login_info = requests.post(url='http://.../login',json=data).json()
    11. return login_info['token']

    在测试用例方法中引入这个方法,所有用到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)

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

    文档获取方式:

    这份文档,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

    以上均可以分享,只需要你搜索vx公众号:程序员雨果,即可免费领取

  • 相关阅读:
    软件测试|黑盒测试方法论-判定表
    使用poi操作excel详解
    SpringBoot自动装配
    基于SSM框架的杰森摄影工作室选片系统的设计和开发论文
    LCD智能婴幼儿秤pcba方案
    【ESP32 IDF】用RMT控制 WS2812 彩色灯带
    计算机网络
    基于jsp+mysql+ssm学生网上请假系统-计算机毕业设计
    私营企业可以上市吗
    NLP:从头开始的文本矢量化方法
  • 原文地址:https://blog.csdn.net/yjt2045263063/article/details/134063791