为什么要在request.Session()上使用Flask的app.test_client()进行测试

时间:2018-08-26 16:21:35

标签: python python-3.x flask

如果requests.Session()可以处理cookie并完成app.test_client()所做的几乎所有事情。那为什么要使用app.test_client()

2 个答案:

答案 0 :(得分:1)

经过一番挖掘,我认为我找到了使用app.test_client()以及Flask提供的其他上下文管理器的充分理由。

测试客户端

app.test_client()

使您能够通过其上下文管理器访问本地上下文 尝试访问_request_ctx_stackrequest context堆栈)上的变量时,这非常有用。例如requestsession上下文本地用户。

某些扩展名还将变量存储在_request_ctx_stack上。例如flask_logincurrent_user存储在请求上下文堆栈中,而flask_stateless_authcurrent_stateless_user存储在请求上下文堆栈中。

from flask import request
from flask_stateless_auth import current_stateless_user

with app.test_client() as c:
  test_path = '/resource_for_authenticated_users'
  c.get(test_path)
  assert request.path == test_url
  assert flask.session is not None # You can also access the session context local from here
  assert current_stateless_user is not None

如果在没有test_client()上下文管理器的情况下调用此方法,则会在弹出_request_ctx_stack之后尝试访问请求本地上下文时抛出运行时错误。另外,current_stateless_user将返回None

应用上下文

app.app_context()

同样,您可以通过app.app_context()上下文管理器访问存储在app context上的变量,如下所示:

from my_app.db import db # db connections are commonly stored on the `_app_ctx_stack`

with app.app_context():
  db.create_tables()
  assert db.session
  assert db.query.MyTable.all()

您还可以访问app context global variable (通常用于存储与应用相关的全局变量 不能跨多个请求使用,例如 session全球)

with app.app_context():
  assert g.my_global_app_var

测试请求上下文

test_request_context()

然后您将使用app.test_request_context()上下文管理器,该管理器用于临时激活请求上下文。 official docs可以最好地解释这一点。

会话事务上下文

app.test_client().session_transaction()

最后,有session_transaction()上下文管理器。这通常用于修改会话对象。这应该嵌套在app.test_client()中。

调用__exit__()方法时,会话将被安全地存储。

docs中的示例:

with app.test_client() as c:
     with c.session_transaction() as sess:
         sess['a_key'] = 'a value'

    # once this is reached the session was stored

答案 1 :(得分:0)

test_client已经预先内置在flask中,这使人们可以更轻松地快速测试其程序。 request实用程序和test_client服务器都具有相同的功能,因此用法仅基于个人喜好。