使用 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