#bash #testing #integration-testing #bats-core
#bash #тестирование #интеграция-тестирование #bats-ядро
Вопрос:
Я хотел бы создать тест BATS для каждого файла в каталоге, но я не уверен, какой лучший способ сделать это. Приведенный ниже подход создает только один тест, даже если в каталоге много файлов.
#!/usr/bin/env bats
for i in ./*;do
@test "testing $i" {
pwd
}
done
Ответ №1:
Когда тест выполняется BATS, файл сначала предварительно обрабатывается.1
Это заменяет @test
блок фактической функцией и добавляет вызов этой функции.
Затем результат сохраняется в BATS_TMPDIR
as bats.${PID}.src
.
Любые программно добавленные тесты должны быть добавлены в предварительно обработанный файл.
Имена тестов также должны быть добавлены к BATS_TEST_NAMES
ним .
Соединяя все это вместе, мы получаем: 2
#!/usr/bin/env bats
declare sFile sSourceFile sTestFunction sTestName
readonly sSourceFile="${BATS_TMPDIR}/bats.$$.src"
if [[ -f "${sSourceFile}" ]];then
for sFile in ./*;do
sTestFunction="test_${sFile}"
sTestName="Testing ${sFile}"
cat <<EOT >> "${sSourceFile}"
$sTestFunction() { bats_test_begin '$sTestName' 0;
return 0
}
bats_test_function "${sTestFunction}"
EOT
BATS_TEST_NAMES =("${sTestFunction}")
done
fi
#EOF
Почему ваш пример не работает
Предварительно обработанная версия вашего примера выглядит следующим образом:
#!/usr/bin/env bats
for i in ./*; do
test_testing_-24i() { bats_test_begin "testing $i" 4;
pwd
}
done
bats_test_function test_testing_-24i
Таким образом, тестовая функция объявляется столько раз, сколько присутствует файлов
. Однако функция test вызывается только один раз.3
Сноски
- https://github.com/bats-core/bats-core/wiki/Bats-Evaluation-Process
- Схема именования переменных, используемая в этом коде, является адаптацией системного венгерского языка, которая объясняется на http://blog.pother.ca/VariableNamingConvention /
- Решение, предложенное NAKAI, страдает от других проблем, вызванных тем же процессом.
Ответ №2:
Как насчет этого?
#!/usr/bin/env bash
declare -r BATS=`mktemp`
trap "rm -f $BATS" EXIT
for i in $(ls)
do
cat > $BATS <<EOF
@test "testing $i" {
pwd
}
EOF
done
bats $BATS
Комментарии:
1. Если я выполню это, я получу сообщение об ошибке
bats: unknown test name `test_testing_-24i'