首页 > 编程问答 >在课堂上使用 JWT 令牌编写 pytest

在课堂上使用 JWT 令牌编写 pytest

时间:2024-07-28 15:25:27浏览次数:9  
标签:python flask pytest

我有一个类 TestSecured ,其中有一些方法可以获取受保护的端点,因此您需要一个 jwt 来发出请求。我正在尝试优化我的测试类,这样我就不需要登录过程 3 次,而只需要 1 次,并在我的 3 个测试方法中使用相同的令牌。

@pytest.mark.usefixtures("client", "auth", "setup_user_and_token")
class TestSecured:
        

    def test_get_operations(self, client, setup_user_and_token):
        # headers = {'Authorization' : f'Beare {setup_user_and_token}'}
        response = client.get(f'{SECURED_ROUTE}get-operations', headers=setup_user_and_token)
        assert response.status_code == 200

    def test_post_operation(self, client, auth):
        return "ok"


    def test_post_ope2(self,client,auth):
        print("ok")

如果我在每个方法中使用 setup_user_and_token() 我创建的夹具。

@pytest.fixture(scope="class")
def setup_user_and_token(auth):
    response = auth.login()
    token = response.get_json()['access_token']
    return {'Authorization' : f'Bearer {token}'}

但我只想使用 setup_class() 只执行一次此操作。我怎样才能做到这一点?

编辑: 下面是我的 conftest.py 文件,我在其中定义了一些装置:

@pytest.fixture
def app():
    app = create_app({
        'TESTING' : True,
    })
    yield app
   
    with app.app_context():
        db.drop_all()


@pytest.fixture
def client(app):
    return app.test_client()


class AuthActions(object):
    def __init__(self, client):
        self._client = client

    def login(self, username='test_user', password='test_pass'):
        return self._client.post(
            '/auth/login',
            json={'username': username, 'password': password}
        )

    def logout(self):
        return self._client.get('/auth/logout')

def auth(client):
    return AuthActions(client)

@pytest.fixture(scope="class")
def setup_user_and_token(auth):
    response = auth.login()
    token = response.get_json()['access_token']
    return {'Authorization' : f'Bearer {token}'}

可以通过以下方式实现目标:使用 setup_class 方法并在类级别存储令牌:

@pytest.mark.usefixtures("client", "auth") 
class TestSecured:
    token = None

    @classmethod
    def setup_class(cls, auth):
        response = auth.login()
        cls.token = {'Authorization': f'Bearer {response.get_json()["access_token"]}'}

    def test_get_operations(self, client):
        response = client.get(f'{SECURED_ROUTE}get-operations', headers=self.token)
        assert response.status_code == 200

    def test_post_operation(self, client):
        response = client.post(f'{SECURED_ROUTE}some-endpoint', headers=self.token, json={'some': 'data'})
        assert response.status_code == 201 # 或任何期望的状态码

    def test_post_ope2(self, client):
        response = client.get(f'{SECURED_ROUTE}another-endpoint', headers=self.token)
        assert response.status_code == 200 # 或任何期望的状态码

解释:

  1. 类级别令牌存储: 我们在 TestSecured 类中添加了一个 token 类变量。这将用于存储整个测试类共享的令牌。

  2. setup_class 方法:

  3. 我们使用 @classmethod 装饰器定义 setup_class 方法,该方法在类中的任何测试方法运行之前执行一次。
  4. 在此方法内,我们使用 auth fixture 登录并获取令牌。
  5. 然后,我们将获取的令牌存储在 self.token 中,使其可用于所有测试方法。

  6. 在测试方法中使用令牌: 在每个测试方法中,我们现在可以使用 self.token 访问存储的令牌,并在发出请求时将其包含在 headers 中。

通过此设置,只需登录一次,并且所有测试方法都将使用相同的令牌,从而优化的测试套件。

标签:python,flask,pytest
From: 78803088

相关文章

  • 如何在 Python 中从 Milesight TrafficX 摄像头、Post(MQTT、TCP/IP、HTTP) 获取数据?
    你好,祝你度过愉快的一天或一夜,我有这个MilesightTrafficX摄像头已启动并正在运行,仪表板中有一个名为POST的设置,您可以在下图中看到:我想要的是知道如何设置这些设置(基于实际上我的意思是)能够在我的Python代码中接收数据。无论协议如何,数据都将如下所示:......
  • 如何循环使用按钮输入,在python中的不同选项之间循环?
    我有一个循环,它采用三路开关输入并在相机开机时选择一个选项:#SetGPIOinputswitchColorOne=pyb.Pin("P9",pyb.Pin.IN,pyb.Pin.PULL_UP)switchColorTwo=pyb.Pin("P7",pyb.Pin.IN,pyb.Pin.PULL_UP)#SetcolorpalletebyswitchifswitchColorOne.value()==0:......
  • SSL 证书验证失败 - 雅虎财经 API - Python
    我正在尝试从雅虎财经获取数据,但收到SSL错误。代码如下:importrequestsresponse=requests.get("https://query1.finance.yahoo.com/v8/finance/chart/META",verify=True)print(response.status_code)出现以下错误:urllib3.exceptions.SSLError:[SSL:CERTIFICATE_......
  • 【学习笔记】Matlab和python双语言的学习(熵权法)
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、熵权法的基本概念二、熵权法的基本步骤1、构建决策矩阵2、数据标准化3、计算指标的比重4、计算信息熵5、计算权重6、计算综合得分三、代码实现----Matlab四、代码实现----python总结......
  • 【python】网络通信编程例子
    以下是一个简单的Python示例,展示了如何在Linux下使用套接字进行基本的网络通信,包括创建服务器和客户端。服务器端代码importsocket#创建一个IPv4TCP套接字server_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#绑定服务器地址和端口server_addr......
  • 即使安装了模块,虚拟环境中也未检测到 Flask
    我是Flask的新手,我正在关注有关如何使用Flask的YouTube教程。我仔细聆听并按照步骤进行操作(链接:https://www.youtube.com/watch?v=Z1RJmh_OqeA)。我使用pip安装了virtualenv模块创建了一个名为virtualenvFlask激活环境,我的终端显示“(F......
  • 如何将Python版本从3.9降级到3.7?
    我正在开发RaspberryPi。这些是我的操作系统信息:pi@raspberrypi:~$uname-marmv7lpi@raspberrypi:~$cat/etc/os-releasePRETTY_NAME="RaspbianGNU/Linux11(bullseye)"NAME="RaspbianGNU/Linux"VERSION_ID="11"VERSION="11(bullseye)......
  • Flask 桌面应用程序文件选择器
    我正在尝试使用Flask为桌面应用程序构建GUI(即在与嵌入式浏览器本地捆绑运行的服务器上运行的Web应用程序)。目前看来一切正常,但我想添加一个文件选择器以允许用户选择计算机上的目录。我需要目录的完整路径,因此使用HTML/JavaScript打开对话框将不起作用(由于安全限制)。......
  • 20、flask-进阶-自定义静态文件static和模板文件templates的路径配置
    自定义static目录和templates目录的路径原本flask默认的static和templates目录是在App目录下的:如下图如果想把这两个目录更改位置,如放在根目录下:代码如下:__init__.pyfromflaskimportFlaskfrom.viewsimportbluefrom.extsimportinit_extsimportos#获......
  • Python终端输出彩色字符方法
    colorama是一个python专门用来在控制台、命令行输出彩色文字的模块,完全兼容linux和windows各个版本。 1.Python3.x中安装colorama模块: pipinstallcolorama'''可用格式常数:【颜色RED,GREEN都需要大写】Fore:BLACK,RED,GREEN,YELLOW,BLUE,MAGENTA,CYAN,WHI......