Как библиотека юнит-тестов Python соответствует шаблонам, переданным через параметр -p? - PullRequest
2 голосов
/ 21 февраля 2020

Я запускаю следующую команду для запуска только тестов, расположенных внутри файла с именем test_CO2.py

python3.7 -m unittest discover -s some_path/tests/ -p "*CO2*"

Моя структура папок выглядит следующим образом:

some_path/tests/
  CO2
    test_CO2.py
  battery
    test_battery.py
  tank
    test_tank.py

Я хочу указать запущенные тесты. Если, например, я только wi sh для проверки бака и кода CO2, как я могу это сделать? Я думал о том, чтобы передать следующее регулярное выражение: \w*(CO2|tank)\w*.py, которое не может найти никаких тестов.

Я думаю, что шаблон, переданный параметру -p, не принимает регулярные выражения. Как тогда я могу указать тесты, которые я буду sh запускать?

Ответы [ 2 ]

2 голосов
/ 21 февраля 2020

Обычно все, что вы передаете через параметр -p в unittest, обрабатывается с помощью TestLoader::_match_path() метода , который затем вызывает цепочку функций fnmatch()fnmatchcase()_compile_pattern()translate() из fnmatch библиотека .

Функция translate() переводит ваш исходный аргумент -p в регулярное выражение, которое затем используется для сопоставления имен.

Документы для функции fnmatch() утверждают это:

Patterns are Unix shell style:
*       matches everything
?       matches any single character
[seq]   matches any character in seq
[!seq]  matches any char not in seq

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

Пример: Я передал регулярное выражение a|b в качестве шаблона. Функция translate() возвращает окончательное регулярное выражение в виде (?s:p\|m)\Z. Там символ канала стал экранированным .

Если вам очень интересно, go см. fnmatch lib * translate() function здесь - если вы хотите знать точный процесс перевода ваших "глобальных" шаблонов в окончательное регулярное выражение.

0 голосов
/ 24 февраля 2020

Я понял, как обойти это ограничение от unittest.

Я могу запустить определенные c тесты с python3.7 -m unittest path_to_some_test

# take regex and find all files that match
# clean up results. i.e. remove './' from output
test_paths_result=()
test_paths=$(find . -regextype posix-extended -regex "${regex}")
for file_path in ${test_paths}; do
  # save clean results to array variable
  test_paths_result+=("${file_path:2}")
done

echo "Running test files that match the following expression: '${regex}'"
python3.7 -m unittest ${test_paths_result[@]}
...