【问题标题】:Why use Flask's app.test_client() over requests.Session() for testing为什么使用 Flask 的 app.test_client() 而不是 requests.Session() 进行测试
【发布时间】:2019-02-01 07:57:20
【问题描述】:

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

【问题讨论】:

    标签: python python-3.x flask


    【解决方案1】:

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

    测试客户端

    app.test_client()

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

    一些扩展还在_request_ctx_stack 上存储变量。例如flask_login 存储current_userflask_stateless_auth 存储current_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
    

    【讨论】:

    • 您能否为此提供一些资源(有用的链接、官方文档等)?
    • 完成。我引用了 Flask 的测试文档,其中与我的答案相关的部分被标记了。还有许多其他有用的上下文管理器,例如:session_transactionapp_contexttest_request_context
    【解决方案2】:

    test_client 已经预建在烧瓶中,这使人们更容易快速测试他们的程序。 requests 实用程序和 test_client 服务器具有相同的功能,因此使用仅基于个人喜好。

    【讨论】:

      猜你喜欢
      • 2012-10-08
      • 1970-01-01
      • 2018-09-15
      • 2012-06-07
      • 2016-03-12
      • 2016-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多