Поиск ошибок путем деления (поиска) истории ревизий и непроверенных коммитов (ревизий) - PullRequest
5 голосов
/ 06 июня 2009

В большинстве современных инструментов контроля версий есть команда для поиска изменений, которые привели к ошибке путем бинарного поиска (деления пополам) по истории. Такая команда может быть встроенной или предоставлена ​​как расширение или плагин. Примеры включают git-bisect в Git, " hg bisect" в Mercurial (ранее доступный как hbisect расширение) и bzr-bisect плагин для базара.

Задача состоит в том, чтобы сделать это автоматически или полуавтоматически, даже при наличии нелинейной истории (точки ветвления и слияния). В общем, цель состоит в том, чтобы найти «плохую» ревизию за минимальное количество шагов, или, более подробно, найти коммит для тестирования, который, по возможности, делит график коммитов для тестирования (DAG коммитов) пополам. Эта проблема, я думаю, решена очень хорошо.

Но есть проблема с непроверяемыми коммитами , например если какой-либо код ревизии даже не компилируется, или если он компилируется, он не запускается / не запускается (или обнаруживает ошибку, не связанную с той, которую вы ищете). Это означает, что вместо того, чтобы просто пометить коммит как «хороший» или «плохой», теперь у вас есть три возможных состояния:

  • хорошо - ошибки нет
  • плохо - глючит поведение
  • неизвестно ( не проверяется ) - неизвестно, присутствует ли ошибка

Некоторые системы контроля версий (SCM) позволяют вам «пропустить» такие коммиты, обычно переходя к родительской ревизии как к следующей для проверки.


Вопросы:

  • Если вы имели дело с такой ситуацией, то есть вы использовали разделение пополам и наткнулись на непроверяемые ревизии, каков ваш опыт распределения таких непроверяемых коммитов? Происходят ли они изолированно (один непроверяемый коммит) или они появляются в диапазонах (ревизии a..b непроверены)? Вы оказались в ситуации, когда вам пришлось пропустить коммит после коммита?

  • Существует ли какая-либо математическая модель (например, для простого деления пополам списка / линейной истории и даже для разделения пополам произвольной DAG ревизий) или алгоритм (возможно, эвристический), который позволяет оптимизировать пропуск непроверенных коммитов. Цель снова состоит в том, чтобы минимизировать (в среднем) количество версий для тестов при наличии непроверяемых коммитов (или несвязанных ошибок).

  • Используете ли вы систему контроля версий, или какое-либо дополнение / расширение / плагин для системы контроля версий, или какой-либо сторонний инструмент, который реализует такой алгоритм, помимо того, что он позволяет просто «пропускать» не тестируемые коммиты, перейдя в соседская ревизия? Что это за VCS или инструмент? Какой алгоритм он использует (если вы это знаете)?

Надеюсь, это приведет к еще более простому (полу) автоматическому поиску ошибок ...


Добавлено 06.06.2009:
При использовании расширенных возможностей Git существует одна ситуация, когда вы можете иметь целую ветку непроверяемых коммитов (или, по крайней мере, трудно тестируемых), а именно, когда вы используете объединение " subtree " объединить истории двух отдельных проектов (например, полное ядро ​​Linux с некоторыми драйверами, разработанными отдельно с помощью слияния «поддерево»). Это необходимо учитывать при разработке алгоритма для обработки непроверяемых коммитов: в нелинейной истории может быть целая ветвь непроверяемых коммитов, и алгоритм должен учитывать топологию (в некоторой степени).

Ответы [ 3 ]

3 голосов
/ 06 июня 2009

То, что было зарегистрировано, очевидно, не может помочь. Большие базы кода, над которыми я работал, требовали все проверки для фактической сборки. Это было сделано с помощью того, что разработчики отправляли свои изменения на сервер регистрации, на котором ожидала очередь изменений. Каждое изменение создается для всех целевых платформ в том порядке, в котором оно было отправлено. Если сборка не удалась, регистрация отклоняется. Если это удается, запускается набор автоматических регрессионных / модульных тестов. Если какой-либо тест не пройден, регистрация отклоняется. Если это успешно, регистрация фиксируется в хранилище.

Если у вас есть такая система, она значительно сокращает количество не подлежащих сборке / проверке ревизий. Плохие сборки ограничены администраторами депо, которые делают дурацкие вещи вне сервера регистрации.

В средах, где такой опции нет, у меня нет строгого статистического анализа, но я обнаружил, что в карманах встречаются нерегулярные несанкционированные ревизии. Одна регистрация испортит кучу вещей, а затем будет серия небольших проверок, пытающихся исправить беспорядок. Тогда, как правило, все хорошо на некоторое время.

0 голосов
/ 09 июня 2009

Просто идея: я знаю еще одну проблему, о которой вы думаете, это тестирование в присутствии шума. Один из способов думать о пропусках состоит в том, чтобы рассматривать их как случайные ответы «хорошо / плохо» и использовать алгоритм деления пополам, устойчивый к таким ошибкам, например: http://www.disp.uniroma2.it/users/grandoni/FGItcs.pdf «Оптимальная упругая сортировка и поиск при наличии ошибок памяти». И. Финокки, Ф. Грандони и Г. Ф. Итальяно.

Эффект применения этого алгоритма к git-bisect будет состоять в том, чтобы разделить пополам от точек пропуска и повторно запустить поиск, когда обнаружится, что была обнаружена неправильная ветвь. В отличие от статьи выше, вы знаете , какие точки были ненадежными, поэтому вы можете просто вернуться назад.

0 голосов
/ 06 июня 2009

Вы можете переопределить отдельные элементы вашего алгоритма деления пополам / двоичного поиска на диапазоны ревизий с соседними «неизвестными» состояниями вместо отдельных ревизий.

Другими словами, если во время бинарного поиска вы обнаружите неизвестное состояние, вы начнете выполнять дополнительный поиск вперед и назад, чтобы найти границы диапазона ревизий, которые дадут вам определенные ответы. Вероятно, это будет линейный поиск в обоих направлениях, так что он будет немного медленнее, вам следует предположить, что большинство ревизий не являются тестируемыми.

Это в конечном итоге выведет диапазон ревизий, в которых появилась ошибка, например где-то между ревизиями (58,63). Затем вам придется вручную искать этот диапазон.

...