使用 Flask-Testing 访问和操作测试中的会话变量

大多数 Web 应用程序使用会话对象来存储一些重要信息。此示例显示了如何使用 Flask-Testing 测试此类应用程序。 github 上也提供了完整的工作示例。

所以首先在 virtualenv 中安装 Flask-Testing

pip install flask_testing

为了能够使用会话对象,你必须设置密钥

app.secret_key = 'my-seCret_KEy'

让我们假设你的应用程序函数需要在这样的会话变量中存储一些数据

@app.route('/getSessionVar', methods=['GET', 'POST'])
def getSessionVariable():
  if 'GET' == request.method:
    session['sessionVar'] = 'hello'
  elif 'POST' == request.method:
    session['sessionVar'] = 'hi'
  else:
    session['sessionVar'] = 'error'

  return 'ok'

要测试此函数,你可以导入 flask_testing 并让测试类继承 flask_testing.TestCase。导入所有必要的库

import flask
import unittest
import flask_testing
from myapp.run import app
    
class TestMyApp(flask_testing.TestCase):

在开始测试之前非常重要的是实现 create_app 函数,否则会出现异常。

  def create_app(self):
    return app

要测试你的应用程序是否正常工作,你有几种可能性。如果你只想确保你的函数是将特定值设置为会话变量,你可以保持上下文并访问 flask.session

def testSession1(self):
    with app.test_client() as lTestClient:
      lResp= lTestClient.get('/getSessionVar')
      self.assertEqual(lResp.status_code, 200)
      self.assertEqual(flask.session['sessionVar'], 'hello')

另一个有用的技巧是区分 GETPOST 方法,如下一个测试函数

def testSession2(self):
    with app.test_client() as lTestClient:
      lResp= lTestClient.post('/getSessionVar')
      self.assertEqual(lResp.status_code, 200)
      self.assertEqual(flask.session['sessionVar'], 'hi')

现在假设你的函数需要设置一个会话变量,并对特定的值做出不同的反应

@app.route('/changeSessionVar')
def changeSessionVariable():
  if session['existingSessionVar'] != 'hello':
    raise Exception('unexpected session value of existingSessionVar!')

  session['existingSessionVar'] = 'hello world'
  return 'ok'

要测试此功能,你必须使用所谓的*会话事务,*并在测试客户端的上下文中打开会话。 Flask 0.8 以来可以使用此功能 ****

def testSession3(self):
    with app.test_client() as lTestClient:
      #keep the session
      with lTestClient.session_transaction() as lSess:
        lSess['existingSessionVar'] = 'hello'

      #here the session is stored
      lResp = lTestClient.get('/changeSessionVar')
      self.assertEqual(lResp.status_code, 200)
      self.assertEqual(flask.session['existingSessionVar'], 'hello world')

单元测试正常运行测试

if __name__ == "__main__":
    unittest.main()

并在命令行中

python tests/test_myapp.py

运行测试的另一个好方法是使用 unittest Discovery,如下所示:

python -m unittest discover -s tests