编写单元测试以检查多个路由的缓存状态

0 投票
1 回答
1135 浏览
提问于 2025-04-18 09:27

我正在为几个路由编写单元测试。这些路由的数据处理比较复杂,会让服务器的CPU负担很重,而且获取新数据的频率也不高。因此,我使用了flask cache来对一些处理比较重的路由进行缓存,使用了@cache.memoize这个装饰器。

基于这个情况,我想为以下两个方面编写测试用例。

  1. 一个路由确实在进行缓存。如果没有这个,处理数据会花费太长时间。
  2. 当我明确清除缓存时,数据会从静态数据中重新加载。如果没有这个,我的数据会变得过时。我会在每次获取新数据时清除缓存。

以下是我单元测试的代码,并附有一些注释。

import unittest
from app import create_app
from app.charts.cache import cache

class ChartTests(unittest.TestCase):
  def setUp(self):
    self.app = create_app('TESTING')
    self.context = self.app.app_context()
    self.client = self.app.test_client()
    self.context.push()

  def tearDown(self):
    self.context.pop()

  def test_routes_cached(self):
    """ test that the routes are caching and uncaching correctly """
    r1 = self.client.get('/chart/upgrade/')
    r2 = self.client.get('/chart/upgrade/')
    r3 = self.client.get('/chart/upgrade/?start_date=201404')
    self.assertTrue( #R1 is not cached )
    self.assertTrue( #R2 is cached )
    self.assertFalse(r3.data == r2.data)
    update_data(app) # changes the csv. Also uses flask-cache's `clear_cache()` to purge
    r_new = self.client.get('/chart/upgrade')
    self.assertTrue( #R_NEW is not cached )
    self.assertTrue(r_new.data != r1.data)

我的路由相对简单,通常遵循以下模式:

@charts.before_request():
def update_data():
  charts.data = CSVReader('my_csv')

@charts.route('/upgrade')
@cache.memoize()
def upgrade():
  # ... do little fiddles with some data
  return jsonify(my_new_data)

我该如何在单元测试中准确判断我的路由的缓存状态呢?

1 个回答

1

最简单的方法就是直接使用 flask.ext.cache.Cacheget 方法

def test_routes_cached(self):
    self.assertTrue(cache.get("/chart/upgrade/") is None)
    r1 = self.client.get("/chart/upgrade/")
    self.assertTrue(cache.get("/chart/upgrade/") is not None)

    # ... snip ...

    update_data(app)

    self.assertTrue(cache.get("/chart/upgrade/") is None)
    r_new = self.client.get("/chart/upgrade/")
    self.assertTrue(cache.get("/chart/upgrade/") is not None)

    # ... etc. ...

撰写回答