Некоторое время назад я опубликовал статью об отладке кодовой базы в Git, используя две команды: blame
bisect
Git blame
bisect
бинарного поиска ), чтобы найти тот, который внес ошибку. В этом посте мы увидим, как автоматизировать процесс bisect
Чтобы освежить вашу память, git bisect
- Запустите мастер пополам с помощью
git bisect start
- Выберите «хорошие» и «плохие» коммиты или известные коммиты, где ошибка отсутствовала и присутствует, соответственно
- Назначьте коммиты для проверки как «хорошие» или «плохие», пока Git не обнаружит коммит, который привел к ошибке
- Выйдите из мастера с помощью
git bisect reset
Чтобы получить представление обо всем процессе, вы можете взглянуть на этот скринкаст , который подробно показывает, как работает процесс отладки.
Естественно, третий шаг занимал много времени — Git показывал вам коммиты один за другим, и вы должны были пометить их как «хорошие» или «плохие» после проверки наличия ошибки в этом коммите.
Когда мы напишем скрипт для автоматизации процесса отладки, мы в основном будем запускать третий шаг. Давайте начнем!
Постановка окружающей среды
В этом посте я напишу небольшой модуль на Python, который содержит функцию, которая добавляет два числа. Это очень простая задача, и я собираюсь сделать это только в демонстрационных целях. Код не требует пояснений, поэтому я не буду вдаваться в подробности.
#add_two_numbers.py
def add_two_numbers(a, b):
'''
Function to add two numbers
'''
addition = a + b
return addition
Чтобы автоматизировать процесс Git Bisect, вам нужно написать тесты для вашего кода. В Python мы будем использовать модуль unittest
Вот как выглядит базовый тест.
#tests.py
import unittest
from add_two_numbers import add_two_numbers
class TestsForAddFunction(unittest.TestCase):
def test_zeros(self):
result = add_two_numbers(0, 0)
self.assertEqual(0, result)
if __name__ == '__main__':
unittest.main()
Мы могли бы написать больше этих тестов, но это было просто, чтобы продемонстрировать, как с этим справиться. На самом деле, вам определенно следует написать больше тестов, поскольку ваши программы и приложения будут намного сложнее, чем эта.
Чтобы запустить модульные тесты, запустите файл tests.py
python tests.py
Если тесты пройдены, вы должны получить следующий вывод.
Давайте теперь внесем ошибку в нашу функцию и передадим код.
def add_two_numbers(a, b):
'''
Function to add two numbers
'''
addition = a + 0
return addition
Чтобы убедиться, что тесты не пройдены, давайте запустим их снова.
Давайте добавим еще несколько коммитов, чтобы коммит с ошибкой не был последним.
Начать процесс деления пополам
Для мастера git bisect мы выберем последний коммит как плохой ( b60fe2cf35
98d9df03b6
git bisect start b60fe2cf35 98d9df03b6
В этот момент Git указывает нам на коммит и спрашивает, хороший он или плохой. Это когда мы говорим Git запускать тесты для нас. Команда для этого заключается в следующем.
git bisect run [command to run tests]
В нашем случае это будет следующим.
git bisect run python tests.py
Когда мы предоставляем Git команду для запуска самих тестов, вместо того, чтобы спрашивать нас, Git запускает эти тесты для каждой ревизии и решает, следует ли назначить фиксацию как хорошую или плохую.
Когда Git завершает выполнение тестов для каждого коммита, он выясняет, какой коммит внес ошибку, как по волшебству!
Как только вы нашли свой коммит, не забудьте сбросить мастер с помощью git bisect reset
Вместо ваших модульных тестов вы также можете создать собственный сценарий оболочки с пользовательскими кодами выхода. Обычно код выхода 0
Последние мысли
Поскольку размер вашей кодовой базы увеличивается, написание юнит-тестов для каждого небольшого фрагмента кода, который вы пишете, становится необходимым. Написание тестов может показаться трудоемким, но, как вы видели в этом случае, они помогают вам в отладке и экономят ваше время в долгосрочной перспективе.
Как ваша команда отлаживает ошибки в коде? Дайте нам знать в комментариях ниже.