?

Log in

No account? Create an account

Previous Entry | Next Entry

Что-то я не понимаю эти вот страдания по поводу того, что покрытие кода не 100%. Ну допустим ваша тулза показывает 100%. Что это значит, можно конюшни больше не чистить? А вот и нет:

int f(int a, int b) {
  int arr[2] = { 0, 0 };
  int i = 1;

  if(a == 1) i--;

  if(b == 1) i--;

  return arr[i];
}

И что это вам дало? Покрытие по строчкам 100%, а всё падает.

По опыту, у 84% программистов какой-то blind spot, не позволяющий ощутить масштаб проблемы.

Чувствую себя капитаном, пиша этот пост. Но он нужен.

Comments

( 96 comments — Leave a comment )
Page 1 of 2
<<[1] [2] >>
psilogic
Jan. 24th, 2015 10:50 am (UTC)
что значит "покрытие 100%" в данном случае??
levgem
Jan. 24th, 2015 10:58 am (UTC)
Это значит что во время тестов хоть раз исполнялась каждая строчка кода.
(no subject) - psilogic - Jan. 24th, 2015 11:10 am (UTC) - Expand
(no subject) - levgem - Jan. 24th, 2015 11:11 am (UTC) - Expand
(no subject) - psilogic - Jan. 24th, 2015 11:28 am (UTC) - Expand
(no subject) - archaicos - Jan. 24th, 2015 11:14 am (UTC) - Expand
(no subject) - psilogic - Jan. 24th, 2015 11:31 am (UTC) - Expand
(no subject) - archaicos - Jan. 24th, 2015 11:34 am (UTC) - Expand
(no subject) - psilogic - Jan. 24th, 2015 11:47 am (UTC) - Expand
(no subject) - archaicos - Jan. 24th, 2015 12:14 pm (UTC) - Expand
(no subject) - psilogic - Jan. 24th, 2015 02:16 pm (UTC) - Expand
(no subject) - nponeccop - Jan. 24th, 2015 12:22 pm (UTC) - Expand
(no subject) - worm_ii - Jan. 24th, 2015 01:56 pm (UTC) - Expand
(no subject) - psilogic - Jan. 24th, 2015 02:21 pm (UTC) - Expand
(no subject) - ostapru - Jan. 24th, 2015 06:07 pm (UTC) - Expand
(no subject) - tonsky - Jan. 24th, 2015 06:58 pm (UTC) - Expand
(no subject) - archaicos - Jan. 24th, 2015 11:24 pm (UTC) - Expand
levgem
Jan. 24th, 2015 10:58 am (UTC)
То, что тесты — это инструмент, а не самоцель (особенно 100% покрытие), даже нечего обсуждать.

У нас вот плавно вырабатывается подход к тестам такой: фичу при первичном выкатывании тестами не покрываем. Её будем менять и нет смысла даже дергаться и тратить на это _лишнее_ время. Опять же, это не догма, а скорее практика.

Когда фича начинает внедряться и опробываться, она начинает обрастать тестами, причем мы придерживаемся почти всегда интеграционных тестов. Не надо тестировать кишки, запроси свою систему по HTTP и проверь ответ. У нас форматы ответов мало меняются, а кишки мы часто рефакторим.

Тут как раз code coverage помогает увидеть _нетестированные_ куски кода. Больше он ни для чего не нужен.

provokatorz
Jan. 24th, 2015 12:37 pm (UTC)
В посте о другом написано. Если у вас нет юнит тестов, то и проблемы другие.
(no subject) - levgem - Jan. 24th, 2015 12:44 pm (UTC) - Expand
mr_parson
Jan. 24th, 2015 11:00 am (UTC)
любой код без обработки ошибок можно покрыть тестами на 100% без особого толку. Ну и вообще, самые важные ошибки в коде, который забыли написать. Покрыть его тестами отдельная не всегда простая история.
fi_mihej
Jan. 24th, 2015 11:04 am (UTC)
>>По опыту, у 84% программистов какой-то blind spot, не позволяющий ощутить масштаб проблемы.

У большого процента людей (не буду говорить что у бОльшего, но интуитивно - это так) - чисто физиологически, относительно туго с пониманием общей картины чего-либо. Зато есть другие преимущества (удобные и полезные скорее для индивидуума, но не для окружающих, правда).
archaicos
Jan. 24th, 2015 11:22 am (UTC)
Народ тупит на простейших вещах и забывает, что простую работу или простое решение часто можно ещё проще проверить (увы, софт мы делаем слишком часто охрененно сложный и с т.з. разработки, и с т.з. тестирования).

Для лулзов, если кто ещё не видел:
http://www.scientificamerican.com/article/rational-and-irrational-thought-the-thinking-that-iq-tests-miss/

Даже я сперва неправильно решил задачу №1 (остальные правильно). Позор на главу!
archaicos
Jan. 24th, 2015 11:11 am (UTC)
Поработаю вторым капитаном на полставки. Существуют разные виды покрытия. Это самое простое, очевидно не дающее полную картину полноты и качества кода и близко.
dmzlj
Jan. 24th, 2015 11:12 am (UTC)
Упало, починили, сделали регрессионный тест, поехали дальше. лучше с покрытием, чем без покрытия.
У нас вот 0% процентов покрытия тестами на текущий момент, на эрланге это больно. И щас вот теряя тапки
побежали прикручивать регрессионные, без них невозможно уже.
levgem
Jan. 24th, 2015 01:00 pm (UTC)
ты так говоришь, будто есть какой-то язык программирования на котором отсутствие тестов — это не больно =))

У меня тоже не было тестов в эрливидео, пока кодовая база не начала расти.
(no subject) - dmzlj - Jan. 24th, 2015 01:32 pm (UTC) - Expand
(no subject) - sorhed - Jan. 24th, 2015 02:38 pm (UTC) - Expand
(no subject) - levgem - Jan. 24th, 2015 03:05 pm (UTC) - Expand
(no subject) - dmzlj - Jan. 24th, 2015 03:26 pm (UTC) - Expand
sorhed
Jan. 24th, 2015 11:16 am (UTC)
Ну я не понимаю, как в 2015, блин, году, можно до сих пор писать на не memory-safe языках. C/C++ причинили компьютерной индустрии триллионы убытков, без преувеличений.

(Что, конечно, не отменяет того, что coverage — бессмысленная метрика).
archaicos
Jan. 24th, 2015 11:27 am (UTC)
memory-safe - это только одни грабли, на которые можно наступить. И нужно ещё не забывать, что даже если нельзя добраться до памяти, куда доступ запрещён, остаются исключения, бросаемые по выходу за границы массива и при попытке использования нулевого указателя (привет Java и прочим memory-safe языкам с такими волшебными «указателями» и проверками границ). Как я понимаю, эта проблема не решается в принципе. Если я понимаю неверно или чего-то упустил из виду, просветите.


Edited at 2015-01-24 11:27 am (UTC)
(no subject) - dottedmag - Jan. 24th, 2015 01:12 pm (UTC) - Expand
(no subject) - archaicos - Jan. 24th, 2015 11:29 pm (UTC) - Expand
(no subject) - sorhed - Jan. 24th, 2015 02:37 pm (UTC) - Expand
(no subject) - archaicos - Jan. 24th, 2015 11:30 pm (UTC) - Expand
(no subject) - permea_kra - Feb. 5th, 2015 02:48 pm (UTC) - Expand
(no subject) - archaicos - Feb. 6th, 2015 05:34 am (UTC) - Expand
(no subject) - permea_kra - Feb. 6th, 2015 05:42 am (UTC) - Expand
(no subject) - archaicos - Feb. 6th, 2015 05:44 am (UTC) - Expand
(no subject) - vinslivins - Jan. 24th, 2015 11:54 pm (UTC) - Expand
(no subject) - archaicos - Jan. 24th, 2015 11:58 pm (UTC) - Expand
(no subject) - vinslivins - Jan. 25th, 2015 12:07 am (UTC) - Expand
(no subject) - archaicos - Jan. 25th, 2015 12:32 am (UTC) - Expand
(no subject) - lionet - Jan. 25th, 2015 09:26 am (UTC) - Expand
(no subject) - archaicos - Jan. 25th, 2015 09:54 am (UTC) - Expand
(no subject) - lionet - Jan. 25th, 2015 10:11 am (UTC) - Expand
(no subject) - archaicos - Jan. 25th, 2015 10:18 am (UTC) - Expand
(no subject) - lionet - Jan. 25th, 2015 10:19 am (UTC) - Expand
(no subject) - dmzlj - Jan. 24th, 2015 11:32 am (UTC) - Expand
(no subject) - nponeccop - Jan. 24th, 2015 12:28 pm (UTC) - Expand
(no subject) - sorhed - Jan. 24th, 2015 02:18 pm (UTC) - Expand
(no subject) - sorhed - Jan. 24th, 2015 02:17 pm (UTC) - Expand
(no subject) - levgem - Jan. 24th, 2015 03:08 pm (UTC) - Expand
(no subject) - dmzlj - Jan. 24th, 2015 03:27 pm (UTC) - Expand
(no subject) - vit_r - Jan. 24th, 2015 02:11 pm (UTC) - Expand
(no subject) - sorhed - Jan. 24th, 2015 02:16 pm (UTC) - Expand
(no subject) - kiryl - Jan. 24th, 2015 02:28 pm (UTC) - Expand
(no subject) - sorhed - Jan. 24th, 2015 02:35 pm (UTC) - Expand
(no subject) - kiryl - Jan. 24th, 2015 02:55 pm (UTC) - Expand
(no subject) - sorhed - Jan. 24th, 2015 02:56 pm (UTC) - Expand
(no subject) - kiryl - Jan. 24th, 2015 03:22 pm (UTC) - Expand
(no subject) - levgem - Jan. 24th, 2015 03:13 pm (UTC) - Expand
(no subject) - kiryl - Jan. 24th, 2015 03:24 pm (UTC) - Expand
(no subject) - vit_r - Jan. 24th, 2015 03:02 pm (UTC) - Expand
(no subject) - sorhed - Jan. 24th, 2015 02:19 pm (UTC) - Expand
(no subject) - psilogic - Jan. 24th, 2015 02:34 pm (UTC) - Expand
dottedmag
Jan. 24th, 2015 11:41 am (UTC)
Есть теорема, что для любой метрики покрытия тестами можно написать код и входные условия, которые вызовут ошибку, но при этом покрытие будет 100%.

Что не мешает быть покрытию полезным, чтобы смотреть, что вообще не оттестировано. При этом построчное покрытие - слишком грубо. Покрытие по веткам дает более приличный результат.
nponeccop
Jan. 24th, 2015 12:36 pm (UTC)
Более того, даже при формально написанной спецификации и коде, 100% соответствующем спецификации (например, проверенном модел чекером), может быть баг в спецификации. Или спецификация написана в соответствии с пониманием разрабом задачи, но понимание неверное.
(no subject) - sorhed - Jan. 24th, 2015 02:20 pm (UTC) - Expand
_winnie
Jan. 24th, 2015 11:45 am (UTC)
Есть опечатки такого рода, что если до них дойдет управление - то эти опечатки гарантировано взорвуться и будут замечены.

Покрытие на 100% проверяет, что таких опечаток нет.
Например, такое покрытие гарантирует отсутвие ошибок вида "бля вы это пробовали запустить хотя бы раз после написания", и предотвращает грех "я думал, это такое простое исправление, что можно не проверять".

Это полезно, так как большинство опечаток - именно простые, а не для хитрой комбинации параметров.

Еще покрытие на 100% проверяет, что нет dead code


Ну и да, отличие кода от данных оно искусственное. Еще, даже эквивалентные преобразования кода могут привести к тому, что поменяется покрытие со 100% на другое.
daedmen
Jan. 25th, 2015 02:47 pm (UTC)
Эх, давно мечтаю что бы вот это вот "запускали хотя бы раз" можно было автоматом превращать в покрытие тестами….
jakobz
Jan. 24th, 2015 12:09 pm (UTC)
Проблема в том, что 84% программистов - не в этой уютной тусовочке, и не в другой аналогичной. Они читают книжки про "Domain Driven Design" и прочих Фаулеров, и совершенно искренне доверяют ихнему авторитету. А они говорят что 100% покрытие тестами - это круто и вообще панацея. То, что их эти авторитеты кидают как лохов - объяснить им очень сложно
nponeccop
Jan. 24th, 2015 12:37 pm (UTC)
В том видео про TDD, доведённый до маразма, очень хорошо сказано.
(no subject) - tonsky - Jan. 24th, 2015 03:01 pm (UTC) - Expand
(no subject) - tonsky - Jan. 24th, 2015 06:49 pm (UTC) - Expand
ДДД - Stas Binko - Jan. 24th, 2015 04:00 pm (UTC) - Expand
Re: ДДД - jakobz - Jan. 24th, 2015 04:36 pm (UTC) - Expand
vit_r
Jan. 24th, 2015 02:07 pm (UTC)
Говорить о покрытии 100% и не использовать assert - это как есть омара с помощью топора и плоскогубцев.
sorhed
Jan. 24th, 2015 02:20 pm (UTC)
Говорят, бывали раньше такие омары, не то что нынешнее племя.
macrop
Jan. 24th, 2015 03:06 pm (UTC)
Мммм.. ну я не раз видел программы, которые и с полным покрытием тестированы, и переполнения, ошибки, нехватка памяти в какождой дырке проверенны, а всё равно бывает падают..
tonsky
Jan. 24th, 2015 03:07 pm (UTC)
Можно еще пример упростить:

int arr[2] = { 0, 0 };

int f(int i) {
  return arr[i];
}


Ну или так:

double avg(double[] xs) {
  return sum(xs) / xs.length;
}


Код может проходиться тестами миллион раз, но в нужный момент упасть. Даже ветвление необязательно.
lionet
Jan. 24th, 2015 06:42 pm (UTC)
Тормозишь, второй пример не упадёт.
(no subject) - tonsky - Jan. 24th, 2015 06:51 pm (UTC) - Expand
(no subject) - lionet - Jan. 24th, 2015 07:02 pm (UTC) - Expand
(no subject) - tonsky - Jan. 24th, 2015 07:06 pm (UTC) - Expand
(no subject) - lionet - Jan. 25th, 2015 12:53 am (UTC) - Expand
(no subject) - Andrew Kondratovich - Jan. 25th, 2015 09:24 am (UTC) - Expand
(no subject) - lionet - Jan. 25th, 2015 10:13 am (UTC) - Expand
thedeemon
Jan. 24th, 2015 04:36 pm (UTC)
В одном любимом мною языке проверка покрытия тестами встроена прямо в компилятор. Единственный раз, когда я захотел этим воспользоваться, всплыла ошибка - упал сам компилятор. :)
lev
Jan. 24th, 2015 05:01 pm (UTC)
удивительно, что девелоперы не знают прописную истину - coverage is a negative metric
Page 1 of 2
<<[1] [2] >>
( 96 comments — Leave a comment )

Profile

lionet
Lev Walkin
Website

Latest Month

December 2016
S M T W T F S
    123
45678910
11121314151617
18192021222324
25262728293031
Powered by LiveJournal.com
Designed by yoksel