?

Log in

No account? Create an account
Previous Entry Share Next Entry
2016-01

Про type coercion, юнит-тесты и перформанс

Неправильный код: if(cache.indexOf(query)) { fast_path }

Правильный код: if(cache.indexOf(query) != -1) { fast_path }

Ну и в итоге первый элемент кэша никогда не используется.

Вопрос: как это юнит-тестить? Работает-то оно одинаково, только с разной скоростью.

This entry was originally posted at http://wizzard.dreamwidth.org/395945.html. It has comment count unavailable comments. Please comment there using OpenID.

  • 1
rageous October 23rd, 2014
У нас часто встречается что-то подобное следующему:

Foo() {
  if (cached) { Stats.Increment("FastPath"); Fast(); }
  else { Stats.Increment("SlowPath"); Slow(); UpdateCache(); }
}

TestFooCaching() {
  Foo();
  AssertStatEquals(1, "SlowPath");
  AssertStatEquals(0, "FastPath");

  Foo();
  Foo();
  AssertStatEquals(1, "SlowPath");
  AssertStatEquals(2, "FastPath");
}


Понятно, что вместо Stats может выступать любое средство диагностики. В нашем случае, оно обычно остается и в продакшне: используется для реалтайм-диагностики, графиков, алертов, и т.п.

Но, понятно, если Stats отжирает ощутимо от FastPath, то может придется оставить его только в SlowPath, или и вовсе заменить местным велосипедом предназначенным только для тестов, а из продакшна вырезать, или хотя бы апдейтить каунтер не каждый раз.

Edited at 2014-10-23 09:29 pm (UTC)

  • 1