Автор оригинала: Mike Driscoll.
На прошлой неделе я выполнял тренировку по развитию в тесте и подслушал кого-то упомянул еще один язык программирования, который имел тестовый бегун, который вы можете настроить, чтобы посмотреть свой каталог проекта и запустить свои тесты, когда файлы изменились. Я думал, что это была аккуратная идея. Я также думал, что могу легко написать свой собственный сценарий Python, чтобы сделать то же самое. Вот довольно грубая версия:
import argparse import os import subprocess import time def get_args(): parser = argparse.ArgumentParser( description="A File Watcher that executes the specified tests" ) parser.add_argument('--tests', action='store', required=True, help='The path to the test file to run') parser.add_argument('--project', action='store', required=False, help='The folder where the project files are') return parser.parse_args() def watcher(test_path, project_path=None): if not project_path: project_path = os.path.dirname(test_path) f_dict = {} while True: files = os.listdir(project_path) for f in files: full_path = os.path.join(project_path, f) mod_time = os.stat(full_path).st_mtime if full_path not in f_dict: f_dict[full_path] = mod_time elif mod_time != f_dict[full_path]: # Run the tests cmd = ['python', test_path] subprocess.call(cmd) print('-' * 70) f_dict[full_path] = mod_time time.sleep(1) def main(): args = get_args() w = watcher(args.tests, args.project) if __name__ == '__main__': main()
Чтобы запустить этот скрипт, вам нужно было сделать что-то вроде этого:
python watcher.py --test ~/path/to/tests.py --project ~/project/path
Теперь давайте найдя момент, чтобы поговорить об этом скрипте. Первая функция использует Python’s argparse Модуль, чтобы сделать программу принять до двух аргументов командной строки: -Test и -Project. Первый – путь к сценарию тестирования Python, когда второй предназначен для папки, в которой необходимо протестировать код. Следующая функция, наблюдатель , будет зацикливаться навсегда и воспользоваться всеми файлами из папки, которая была передана или использовать папку, в которой находится тестовый файл. Он будет схватить измененное время каждого файла и сохранить его в словаре. Ключ установлен на полный путь файла, и значение – это время модификации. Далее мы проверяем, изменено ли время модификации. Если нет, мы сплю на секунду и проверьте еще раз. Если он изменился, то мы запустим тесты.
На данный момент вы должны уметь редактировать свой код и тесты в своем любимом редакторе Python и просмотреть ваши тесты в терминале.
Используя watchdog.
Я оглянулся на другие кроссплатформенные методы просмотра каталога и наткнулся на Watchdog проект. Он не был обновлен с 2015 года (на момент написания), но я проверял его, и казалось, что для меня работает нормально. Вы можете установить Watchdog, используя PIP:
Теперь, когда у нас установлено Watchdog, давайте создадим какой-то код, который делает что-то похожее на предыдущий пример:
В этом коде мы храним get_args () Функция и добавить класс. Watchdog класс подкласса FileSystemeventHandler класс. В конечном итоге мы проходим в нашем пути тестового файла к классу и переопределите on_any_event () метод. Этот метод пожаровал в любое время события файловой системы. Когда это произойдет, мы управляем нашими тестами. Последнее бит в конце кода, где мы создаем Наблюдатель () Объект и скажите это, чтобы посмотреть указанный путь проекта и позвонить нашему обработчику событий, если что-то произойдет с файлами там.
Упаковка
На данный момент вы должны иметь возможность начать опробовать эти идеи в вашем собственном коде. Существуют также некоторые методы специфики платформы также для наблюдения за папкой (например pywin32 ), но если вы запустите в нескольких операционных системах, таких как я делаю, то WatchDog или прокат, может быть лучшим выбором.
Связанные чтения
- Stackoverflow: Как мне посмотреть файл для изменений, использующих Python?
- Смотрите каталог для изменений