Как запустить тест на дереве исходных текстов в bazel?

Я переношу проект с cmake на bazel. У меня есть папка, содержащая код Python и genrules. У меня был тестовый скрипт, рекурсивно запускавший все тесты python в этой папке. Так что в основном мне нужны все файлы py в этой папке как data для тестового сценария. Но, учитывая некоторые общие правила, которые мне нужно запустить, есть несколько файлов BUILD, так что glob(["**/*.py"]) не может пройти.

Например, у нас есть папка python, содержащая следующие файлы.

  • python/BUILD

  • python/test_a.py

  • python/folder_a/BUILD в этом есть правило.

  • python/folder_a/folder_b/BUILD у этого тоже есть genrule.

  • python/folder_a/folder_b/folder_c/test_b.py

Я хочу запустить тестовый сценарий под python/, он будет запускать все test_*.py рекурсивно. Теперь мы хотим обернуть его как sh_test в bazel. Поэтому нам нужно указать все test_*.py в поле data. Но нет простого способа сделать это, поскольку glob() не может пройти через python/folder_a/BUILD и python/folder_a/folder_b/BUILD.

Будет очень удобно, если я смогу запустить этот скрипт в дереве исходных текстов. Но похоже, что Базель этого не предусмотрел. Добавление local = 1 в sh_test только делает дерево исполняемых файлов доступным для записи.

Я знаю, что это не лучший способ использовать bazel для тестирования, но иногда это слишком большая работа для переноса всего одновременно.


person edward_mj    schedule 21.03.2018    source источник


Ответы (1)


Я не могу придумать простой способ получить все целевые имена в файле BUILD, но есть запрос Bazel, который вы можете запустить, чтобы получить целевые имена, которые затем можно собрать в filegroup цель для ссылки в атрибуте sh_test.data.

bazel query 'filter(".*:test_.*\.py", kind("source file", //python/...:*) + kind("generated file", //python/...:*))'

Разбивая это:

  1. kind("source file", //python/...:*) рекурсивно запрашивает все целевые исходные файлы в //python пакете. Это собирает обычные исходные файлы.

  2. kind("generated file", //python/...:*) рекурсивно запрашивает все созданные целевые файлы в //python пакете. Это собирает файлы genrule'd.

  3. filter(".*:test_.*\.py", ...) фильтрует результаты, содержащие только цели в форме //any/package:test_name.py

Например, бег

bazel query 'filter(".*:test_.*\.py", kind("source file", //src/...:* + //tools/...:*) + kind("generated file", //src/...:* + //tools/...:*))'

в собственном дереве исходных текстов Базеля находит одну цель: //src/test/py/bazel:test_base.py

person Jin    schedule 21.03.2018
comment
Хотя, возможно, не идеальный выбор, но он работает. В этом случае мне нужно добавить все файлы python в bazel, что также является парочкой работ. - person edward_mj; 27.03.2018