0

いくつかのルートの単体テストを作成しようとしています。データ操作は非常に集中的で、サーバーの CPU を拘束し、新しいデータの取得はかなりまれです。@cache.memoizeそのため、より集約的なルートにはフラスコ キャッシュを使用しました。

このことから、テストケースを作成したいことが 2 つあります。

  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)

単体テスト内のルートのキャッシュされたステータスについて正確なアサーションを行うにはどうすればよいですか?

4

1 に答える 1

1

最も簡単な方法は、次のget方法flask.ext.cache.Cacheを使用することです。

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. ...
于 2014-06-12T02:18:55.687 に答える