Слоеные тесты с редисом - PullRequest
1 голос
/ 19 сентября 2019

У меня есть модульный тест для кэширования ключа API в redis (в приложении rails).

redis установлен в глобальную переменную ($redis) с connection_pool gem .Поэтому я делаю $redis.with do |redis|, чтобы на самом деле получить соединение с Redis.

Проблема в том, что мой тест невероятно ненадежен.У него есть два утверждения: одно для проверки получения ожидаемого значения, а другое для проверки того, что это значение кэшируется (в течение 10 минут).

jwt = JWT.encode payload, private_key, "RS256"
assert_equal jwt, Foo.app_token
travel 5.minutes
assert_equal jwt, Foo.app_token

Я не могу понять, почему этот тест такой ненадежный.Это может быть неудачно каждые 3-5 запусков.Любая помощь будет принята с благодарностью.Я никогда не использовал redis внутри пула соединений, поэтому вполне могу делать что-то не так.

Реализация метода:

def app_token
  find_app_token || create_app_token
end

private

def find_app_token
  $redis.with { |redis| redis.get APP_KEY }
end

def create_app_token
  payload = # some payload
  JWT.encode(payload, private_key, "RS256").tap do |jwt|
     $redis.with do |redis|
       redis.set APP_KEY, jwt
       redis.expireat APP_KEY, payload[:exp]
     end
  end
end

Ответы [ 2 ]

0 голосов
/ 20 сентября 2019

Для большей наглядности приведу здесь ответ.

travel 5.minutes заглушает Time.now и другие связанные методы, чтобы увеличить / уменьшить время на требуемую продолжительность.Заглушки удаляются в конце теста .Я думаю, под этим они подразумевают в конце всего выполнения набора тестов.Это может быть возможной причиной нестабильного теста.

travel также дает возможность предоставить блок, после которого заглушки сбрасываются.Следовательно, что-то вроде

travel 5.minutes do
 assert_equal jwt, Foo.app_token
end

может быть более подходящим способом сделать это, так как он удалит заглушку, как только проверяется требуемое утверждение.Подробнее здесь: https://api.rubyonrails.org/v6.0.0/classes/ActiveSupport/Testing/TimeHelpers.html#method-i-travel

0 голосов
/ 20 сентября 2019

Я удалил оператор travel 5.minutes, и тест , кажется, работает сейчас, без отслаивания.?♂️

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...