打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
pytest + yaml 框架 -35.根据不同运行环境生成全局token

前言

我们在使用自动化测试框架的时候,经常会遇到一个需求,希望在全局用例中,仅登录一次,后续所有的用例自动带上请求头部token 或者cookies。
我们可以自定义fixture 更新内置的 requests_session, 在请求头部添加token 来实现全局登录。
基本使用参考前面这篇https://www.cnblogs.com/yoyoketang/p/16924506.html

全局 token 实现

在项目下 conftest.py 文件中实现先登录,更新请求头部 token

import pytest
from pytest_yaml_yoyo.http_session import HttpSession
import jsonpath

"""
全局仅登录一次,获取token,
在请求头部添加 Authorization: bearer **token** 认证
也有这种格式 Authorization: Token **token**
内置fixture requests_session
"""

@pytest.fixture(scope="session", autouse=True)
def login_first(requests_session: HttpSession) -> None:
"""全局仅一次登录, 更新session请求头部"""
# 调用登录方法,获得token
url = "http://127.0.0.1:8200/api/v1/login"
body = {
"username": "test1",
"password": "123456"
}
r = requests_session.post(url, json=body)
token = jsonpath.jsonpath(r.json(), '$..token')[0]
print(f'账号 test1 登录获取到token: {token}')
headers = {
"Authorization": f"Token {token}"
}
requests_session.headers.update(headers)

cases/test_info.yml 中用例内容

test_user_info:
name: 用户信息
request:
url: /api/v1/userinfo
method: GET
validate:
- eq: [$.code, 0]
- eq: [$.msg, success!]

用例中只写了相对路径,还需要在pytest.ini 配置 base_url 环境地址

[pytest]

log_cli = true
log_cli_level = info
base_url = http://127.0.0.1:8200

执行pytest命令运行用例,会看到请求头部自动带上token了

2023-06-08 11:12:02 [INFO]: 运行用例-> test_user_info
2023-06-08 11:12:02 [INFO]: -------- request info ----------
2023-06-08 11:12:02 [INFO]: yml raw -->: {'url': '/api/v1/userinfo', 'method': 'GET'}
2023-06-08 11:12:02 [INFO]: method -->: GET
2023-06-08 11:12:02 [INFO]: url -->: /api/v1/userinfo
2023-06-08 11:12:02 [INFO]: headers -->: {'User-Agent': 'python-requests/2.31.0', 'Accept-Encoding': 'gzip, deflate', '
Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Token 8846dbad632813f097c577d0ff6aafc4547090f9'}

这样就可以实现全局仅登录一次,后续用例全部自动带上登录的请求头部'Authorization': 'Token ....'.
上面这种方式虽然实现了全局token ,但是登录的token地址是写死的,如果有多套环境需要切换,并且不同环境登录的账号不一样,就需要根据环境的切换来自动读取环境配置了。

多套环境配置

多套环境配置,参考前面这篇https://www.cnblogs.com/yoyoketang/p/16979211.html
在项目下 config.py 中配置不同环境

class Config:
"""每个环境都有一样的公共配置"""
version = "v1.0"
appId = 10086

class TestConfig(Config):
"""测试环境"""
BASE_URL = 'http://127.0.0.1:8200'
USERNAME = 'test1'
PASSWORD = '123456'
BLOG_URL = 'https://www.cnblogs.com'

class UatConfig(Config):
"""联调环境"""
BASE_URL = 'http://192.168.1.12:8201'
USERNAME = 'test8'
PASSWORD = '123456'


# 环境关系映射,方便切换多环境配置
env = {
"test": TestConfig,
"uat": UatConfig
}

还需要在 pytest.ini 配置环境名称,这样 pytest.ini 中的 base_url 就不用配置了,可以全部写到 config.py 中的配置里用大写的 BASE_URL

[pytest]

log_cli = true
log_cli_level = info

env = test

在项目下 conftest.py 文件中实现先登录,修改后如下

import pytest
from pytest_yaml_yoyo.http_session import HttpSession
import jsonpath

"""
全局仅登录一次,获取token,
在请求头部添加 Authorization: bearer **token** 认证
也有这种格式 Authorization: Token **token**
内置fixture requests_session
"""

@pytest.fixture(scope="session", autouse=True)
def login_first(requests_session: HttpSession, environ) -> None:
"""全局仅一次登录, 更新session请求头部"""
# 调用登录方法,获得token
url = environ.BASE_URL + "/api/v1/login"
print(url)
body = {
"username": environ.USERNAME,
"password": environ.PASSWORD
}
r = requests_session.post(url, json=body)
token = jsonpath.jsonpath(r.json(), '$..token')[0]
print(f'账号 {environ.USERNAME} 登录获取到token: {token}')
headers = {
"Authorization": f"Token {token}"
}
requests_session.headers.update(headers)

切换环境运行有2种方式
方式1:修改pytest.ini 中的 env值

[pytest]

env = uat

方式2:通过命令行切换环境

pytest --env=uat

这样就可以根据环境的切换自动获取环境的配置生成对应环境的token了。

还有一种简便方法,只要在环境配置中添加了 BASE_URL  属性,可以用 requests_session.send_request() 请求相对路径

import pytest
from pytest_yaml_yoyo.http_session import HttpSession
import jsonpath
"""
全局仅登录一次,获取token,
在请求头部添加 Authorization: bearer **token** 认证
也有这种格式 Authorization: Token **token**
内置fixture requests_session
"""

@pytest.fixture(scope="session", autouse=True)
def login_first(requests_session: HttpSession, environ) -> None:
"""全局仅一次登录, 更新session请求头部"""
# 调用登录方法,获得token
url = "/api/v1/login"
body = {
"username": environ.USERNAME,
"password": environ.PASSWORD
}
r = requests_session.send_request('post', url, json=body)
token = jsonpath.jsonpath(r.json(), '$..token')[0]
print(f'账号 {environ.USERNAME} 登录获取到token: {token}')
headers = {
"Authorization": f"Token {token}"
}
requests_session.headers.update(headers)
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
如何用 Python 爬取需要登录的网站?
当Pytest遇上MVC分层设计自动化用例就该这么写
python+pytest接口自动化之session会话保持的实现
接口测试 | 25 requests + pytest测试实例
某麒麟网站模拟登录(验证码识别)
从头搭建一个flask鉴权系统之登陆
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服