Нахождение того, что checkin сломал юнит-тест - PullRequest
1 голос
/ 08 марта 2019

Некоторые проверки за последние 3 дня прервали один из наших модульных тестов (и почему это вообще не понятно).

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

Что приводит к вопросам:

  1. Как получить список всех идентификаторов (?) Кода, зарегистрированного в филиале за последние 3 дня.
  2. Как мне затем извлечь эту копию кода (для этого конкретного идентификатора))?

Мы используем Git через VSO (теперь DevOps Azure), если это имеет значение.

спасибо - Дейв

1 Ответ

4 голосов
/ 08 марта 2019

ОБНОВЛЕНИЕ , чтобы предоставить немного больше информации о том, как использовать bisect


То, что вы описываете, это именно то, что делает git bisect.Тогда все, что вам нужно, - это идентифицировать один рабочий коммит (до появления ошибки) и один битый коммит (предположительно текущий).

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

Так что если вы знаете, чтонеделю назад, у вас локально была проверена хорошая (предварительная) копия на master, вы можете дать

master@{1 week ago}

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

git rev-list --until='1 week ago' -n1 master

, чтобы получить последний созданный коммит (в соответствии с метаданными коммита) по крайней мере 1 неделю назад.Таким образом, что-то вроде

git bisect start $(git rev-list --until='1 week ago' -n1 master) master

Для любого из приведенных выше обозначений вы можете использовать 3 days вместо 1 week, и это будет немного более эффективным - то есть вы можете ожидать 1 или2 меньше запросов до того, как будет выявлена ​​ошибка.

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


Aнемного в стороне, но будьте осторожны - в наши дни довольно популярно делать «более чистые» истории, перебирая каждую ветку перед тем, как интегрировать ее в основную линию.И хотя эти «более чистые» истории действительно более линейны и просты, на самом деле они также на более вероятно будут грязными в том смысле, что они содержат коммиты, которые никогда не тестировались.Если один из этих коммитов не проходит модульные тесты по причинам, отличным от вашей ошибки - например, из-за несоответствия слияния, которое было удалено в последующем коммите, то использование bisect внезапно не так просто, так как просто зеленый / красный статусваш набор модульных тестов не скажет вам, присутствует ли ваша ошибка.

Но это будет проблемой для стратегии поиска ошибок, которую вы описываете в целом (не только для bisect).Так что если отслеживание ошибки в истории вообще возможно, тогда bisect - лучший способ сделать это.

...